diff --git a/circuit/SN74LS273NE4/3D/SN74LS273NE4.stl b/circuit/SN74LS273NE4/3D/SN74LS273NE4.stl
new file mode 100644
index 0000000..78701ac
Binary files /dev/null and b/circuit/SN74LS273NE4/3D/SN74LS273NE4.stl differ
diff --git a/circuit/SN74LS273NE4/3D/SN74LS273NE4.stp b/circuit/SN74LS273NE4/3D/SN74LS273NE4.stp
new file mode 100644
index 0000000..fd2cca2
--- /dev/null
+++ b/circuit/SN74LS273NE4/3D/SN74LS273NE4.stp
@@ -0,0 +1,21844 @@
+ISO-10303-21;
+HEADER;
+FILE_DESCRIPTION(('FreeCAD Model'),'2;1');
+FILE_NAME('/var/www/3D/0T/796887.2.1.stp','2020-04-09T11:35:01',(
+ 'Author'),(''),'Open CASCADE STEP processor 6.9','FreeCAD','Unknown'
+ );
+FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }'));
+ENDSEC;
+DATA;
+#1 = APPLICATION_PROTOCOL_DEFINITION('international standard',
+ 'automotive_design',2000,#2);
+#2 = APPLICATION_CONTEXT(
+ 'core data for automotive mechanical design processes');
+#3 = SHAPE_DEFINITION_REPRESENTATION(#4,#10);
+#4 = PRODUCT_DEFINITION_SHAPE('','',#5);
+#5 = PRODUCT_DEFINITION('design','',#6,#9);
+#6 = PRODUCT_DEFINITION_FORMATION('','',#7);
+#7 = PRODUCT('ASSEMBLY','ASSEMBLY','',(#8));
+#8 = PRODUCT_CONTEXT('',#2,'mechanical');
+#9 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design');
+#10 = SHAPE_REPRESENTATION('',(#11,#15,#19),#23);
+#11 = AXIS2_PLACEMENT_3D('',#12,#13,#14);
+#12 = CARTESIAN_POINT('',(0.,0.,0.));
+#13 = DIRECTION('',(0.,0.,1.));
+#14 = DIRECTION('',(1.,0.,-0.));
+#15 = AXIS2_PLACEMENT_3D('',#16,#17,#18);
+#16 = CARTESIAN_POINT('',(0.,0.,0.));
+#17 = DIRECTION('',(0.,0.,1.));
+#18 = DIRECTION('',(1.,0.,0.));
+#19 = AXIS2_PLACEMENT_3D('',#20,#21,#22);
+#20 = CARTESIAN_POINT('',(0.,0.,0.));
+#21 = DIRECTION('',(0.,0.,1.));
+#22 = DIRECTION('',(1.,0.,0.));
+#23 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3)
+GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#27)) GLOBAL_UNIT_ASSIGNED_CONTEXT(
+(#24,#25,#26)) REPRESENTATION_CONTEXT('Context #1',
+ '3D Context with UNIT and UNCERTAINTY') );
+#24 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) );
+#25 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) );
+#26 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() );
+#27 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(2.E-06),#24,
+ 'distance_accuracy_value','confusion accuracy');
+#28 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7));
+#29 = ADVANCED_BREP_SHAPE_REPRESENTATION('',(#11,#30),#962);
+#30 = MANIFOLD_SOLID_BREP('',#31);
+#31 = CLOSED_SHELL('',(#32,#152,#238,#319,#400,#471,#528,#577,#626,#675,
+ #702,#803,#915,#922,#929,#957));
+#32 = ADVANCED_FACE('',(#33),#47,.F.);
+#33 = FACE_BOUND('',#34,.F.);
+#34 = EDGE_LOOP('',(#35,#70,#98,#126));
+#35 = ORIENTED_EDGE('',*,*,#36,.F.);
+#36 = EDGE_CURVE('',#37,#39,#41,.T.);
+#37 = VERTEX_POINT('',#38);
+#38 = CARTESIAN_POINT('',(-3.175,-13.2075,2.285));
+#39 = VERTEX_POINT('',#40);
+#40 = CARTESIAN_POINT('',(-3.175,-13.2075,2.56));
+#41 = SURFACE_CURVE('',#42,(#46,#58),.PCURVE_S1.);
+#42 = LINE('',#43,#44);
+#43 = CARTESIAN_POINT('',(-3.175,-13.2075,0.8226));
+#44 = VECTOR('',#45,1.);
+#45 = DIRECTION('',(0.,0.,1.));
+#46 = PCURVE('',#47,#52);
+#47 = PLANE('',#48);
+#48 = AXIS2_PLACEMENT_3D('',#49,#50,#51);
+#49 = CARTESIAN_POINT('',(-3.175,-13.2075,0.8226));
+#50 = DIRECTION('',(1.,0.,0.));
+#51 = DIRECTION('',(0.,0.,1.));
+#52 = DEFINITIONAL_REPRESENTATION('',(#53),#57);
+#53 = LINE('',#54,#55);
+#54 = CARTESIAN_POINT('',(0.,0.));
+#55 = VECTOR('',#56,1.);
+#56 = DIRECTION('',(1.,0.));
+#57 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#58 = PCURVE('',#59,#64);
+#59 = PLANE('',#60);
+#60 = AXIS2_PLACEMENT_3D('',#61,#62,#63);
+#61 = CARTESIAN_POINT('',(-3.175,-13.2075,0.8226));
+#62 = DIRECTION('',(0.,1.,0.));
+#63 = DIRECTION('',(0.,0.,1.));
+#64 = DEFINITIONAL_REPRESENTATION('',(#65),#69);
+#65 = LINE('',#66,#67);
+#66 = CARTESIAN_POINT('',(0.,0.));
+#67 = VECTOR('',#68,1.);
+#68 = DIRECTION('',(1.,0.));
+#69 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#70 = ORIENTED_EDGE('',*,*,#71,.T.);
+#71 = EDGE_CURVE('',#37,#72,#74,.T.);
+#72 = VERTEX_POINT('',#73);
+#73 = CARTESIAN_POINT('',(-3.175,13.2075,2.285));
+#74 = SURFACE_CURVE('',#75,(#79,#86),.PCURVE_S1.);
+#75 = LINE('',#76,#77);
+#76 = CARTESIAN_POINT('',(-3.175,-13.2075,2.285));
+#77 = VECTOR('',#78,1.);
+#78 = DIRECTION('',(0.,1.,0.));
+#79 = PCURVE('',#47,#80);
+#80 = DEFINITIONAL_REPRESENTATION('',(#81),#85);
+#81 = LINE('',#82,#83);
+#82 = CARTESIAN_POINT('',(1.4624,0.));
+#83 = VECTOR('',#84,1.);
+#84 = DIRECTION('',(0.,-1.));
+#85 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#86 = PCURVE('',#87,#92);
+#87 = PLANE('',#88);
+#88 = AXIS2_PLACEMENT_3D('',#89,#90,#91);
+#89 = CARTESIAN_POINT('',(-3.095625,-13.2075,1.5538));
+#90 = DIRECTION('',(-0.994159535661,-1.753391139168E-18,-0.107920422789)
+ );
+#91 = DIRECTION('',(-1.743150520747E-18,1.,-1.892267130529E-19));
+#92 = DEFINITIONAL_REPRESENTATION('',(#93),#97);
+#93 = LINE('',#94,#95);
+#94 = CARTESIAN_POINT('',(0.,-0.735495636034));
+#95 = VECTOR('',#96,1.);
+#96 = DIRECTION('',(1.,0.));
+#97 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#98 = ORIENTED_EDGE('',*,*,#99,.T.);
+#99 = EDGE_CURVE('',#72,#100,#102,.T.);
+#100 = VERTEX_POINT('',#101);
+#101 = CARTESIAN_POINT('',(-3.175,13.2075,2.56));
+#102 = SURFACE_CURVE('',#103,(#107,#114),.PCURVE_S1.);
+#103 = LINE('',#104,#105);
+#104 = CARTESIAN_POINT('',(-3.175,13.2075,0.8226));
+#105 = VECTOR('',#106,1.);
+#106 = DIRECTION('',(0.,0.,1.));
+#107 = PCURVE('',#47,#108);
+#108 = DEFINITIONAL_REPRESENTATION('',(#109),#113);
+#109 = LINE('',#110,#111);
+#110 = CARTESIAN_POINT('',(0.,-26.415));
+#111 = VECTOR('',#112,1.);
+#112 = DIRECTION('',(1.,0.));
+#113 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#114 = PCURVE('',#115,#120);
+#115 = PLANE('',#116);
+#116 = AXIS2_PLACEMENT_3D('',#117,#118,#119);
+#117 = CARTESIAN_POINT('',(-3.175,13.2075,0.8226));
+#118 = DIRECTION('',(0.,1.,0.));
+#119 = DIRECTION('',(0.,0.,1.));
+#120 = DEFINITIONAL_REPRESENTATION('',(#121),#125);
+#121 = LINE('',#122,#123);
+#122 = CARTESIAN_POINT('',(0.,0.));
+#123 = VECTOR('',#124,1.);
+#124 = DIRECTION('',(1.,0.));
+#125 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#126 = ORIENTED_EDGE('',*,*,#127,.F.);
+#127 = EDGE_CURVE('',#39,#100,#128,.T.);
+#128 = SURFACE_CURVE('',#129,(#133,#140),.PCURVE_S1.);
+#129 = LINE('',#130,#131);
+#130 = CARTESIAN_POINT('',(-3.175,-13.2075,2.56));
+#131 = VECTOR('',#132,1.);
+#132 = DIRECTION('',(0.,1.,0.));
+#133 = PCURVE('',#47,#134);
+#134 = DEFINITIONAL_REPRESENTATION('',(#135),#139);
+#135 = LINE('',#136,#137);
+#136 = CARTESIAN_POINT('',(1.7374,0.));
+#137 = VECTOR('',#138,1.);
+#138 = DIRECTION('',(0.,-1.));
+#139 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#140 = PCURVE('',#141,#146);
+#141 = PLANE('',#142);
+#142 = AXIS2_PLACEMENT_3D('',#143,#144,#145);
+#143 = CARTESIAN_POINT('',(-3.095625,-13.2075,3.565));
+#144 = DIRECTION('',(0.996895588071,1.769633085429E-18,
+ -7.873491273946E-02));
+#145 = DIRECTION('',(-1.764139415369E-18,1.,1.393319065621E-19));
+#146 = DEFINITIONAL_REPRESENTATION('',(#147),#151);
+#147 = LINE('',#148,#149);
+#148 = CARTESIAN_POINT('',(0.,-1.00812964971));
+#149 = VECTOR('',#150,1.);
+#150 = DIRECTION('',(1.,0.));
+#151 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#152 = ADVANCED_FACE('',(#153),#59,.F.);
+#153 = FACE_BOUND('',#154,.F.);
+#154 = EDGE_LOOP('',(#155,#185,#211,#212));
+#155 = ORIENTED_EDGE('',*,*,#156,.F.);
+#156 = EDGE_CURVE('',#157,#159,#161,.T.);
+#157 = VERTEX_POINT('',#158);
+#158 = CARTESIAN_POINT('',(3.175,-13.2075,2.285));
+#159 = VERTEX_POINT('',#160);
+#160 = CARTESIAN_POINT('',(3.175,-13.2075,2.56));
+#161 = SURFACE_CURVE('',#162,(#166,#173),.PCURVE_S1.);
+#162 = LINE('',#163,#164);
+#163 = CARTESIAN_POINT('',(3.175,-13.2075,0.8226));
+#164 = VECTOR('',#165,1.);
+#165 = DIRECTION('',(0.,0.,1.));
+#166 = PCURVE('',#59,#167);
+#167 = DEFINITIONAL_REPRESENTATION('',(#168),#172);
+#168 = LINE('',#169,#170);
+#169 = CARTESIAN_POINT('',(0.,6.35));
+#170 = VECTOR('',#171,1.);
+#171 = DIRECTION('',(1.,0.));
+#172 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#173 = PCURVE('',#174,#179);
+#174 = PLANE('',#175);
+#175 = AXIS2_PLACEMENT_3D('',#176,#177,#178);
+#176 = CARTESIAN_POINT('',(3.175,-13.2075,0.8226));
+#177 = DIRECTION('',(1.,0.,0.));
+#178 = DIRECTION('',(0.,0.,1.));
+#179 = DEFINITIONAL_REPRESENTATION('',(#180),#184);
+#180 = LINE('',#181,#182);
+#181 = CARTESIAN_POINT('',(0.,0.));
+#182 = VECTOR('',#183,1.);
+#183 = DIRECTION('',(1.,0.));
+#184 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#185 = ORIENTED_EDGE('',*,*,#186,.F.);
+#186 = EDGE_CURVE('',#37,#157,#187,.T.);
+#187 = SURFACE_CURVE('',#188,(#192,#199),.PCURVE_S1.);
+#188 = LINE('',#189,#190);
+#189 = CARTESIAN_POINT('',(-3.175,-13.2075,2.285));
+#190 = VECTOR('',#191,1.);
+#191 = DIRECTION('',(1.,0.,0.));
+#192 = PCURVE('',#59,#193);
+#193 = DEFINITIONAL_REPRESENTATION('',(#194),#198);
+#194 = LINE('',#195,#196);
+#195 = CARTESIAN_POINT('',(1.4624,0.));
+#196 = VECTOR('',#197,1.);
+#197 = DIRECTION('',(0.,1.));
+#198 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#199 = PCURVE('',#200,#205);
+#200 = PLANE('',#201);
+#201 = AXIS2_PLACEMENT_3D('',#202,#203,#204);
+#202 = CARTESIAN_POINT('',(-3.175,-13.128125,1.5538));
+#203 = DIRECTION('',(0.,-0.994159535661,-0.107920422789));
+#204 = DIRECTION('',(-1.,-0.,-0.));
+#205 = DEFINITIONAL_REPRESENTATION('',(#206),#210);
+#206 = LINE('',#207,#208);
+#207 = CARTESIAN_POINT('',(-0.,-0.735495636034));
+#208 = VECTOR('',#209,1.);
+#209 = DIRECTION('',(-1.,0.));
+#210 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#211 = ORIENTED_EDGE('',*,*,#36,.T.);
+#212 = ORIENTED_EDGE('',*,*,#213,.T.);
+#213 = EDGE_CURVE('',#39,#159,#214,.T.);
+#214 = SURFACE_CURVE('',#215,(#219,#226),.PCURVE_S1.);
+#215 = LINE('',#216,#217);
+#216 = CARTESIAN_POINT('',(-3.175,-13.2075,2.56));
+#217 = VECTOR('',#218,1.);
+#218 = DIRECTION('',(1.,0.,0.));
+#219 = PCURVE('',#59,#220);
+#220 = DEFINITIONAL_REPRESENTATION('',(#221),#225);
+#221 = LINE('',#222,#223);
+#222 = CARTESIAN_POINT('',(1.7374,0.));
+#223 = VECTOR('',#224,1.);
+#224 = DIRECTION('',(0.,1.));
+#225 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#226 = PCURVE('',#227,#232);
+#227 = PLANE('',#228);
+#228 = AXIS2_PLACEMENT_3D('',#229,#230,#231);
+#229 = CARTESIAN_POINT('',(-3.175,-13.128125,3.565));
+#230 = DIRECTION('',(-1.769633085429E-18,0.996895588071,
+ -7.873491273946E-02));
+#231 = DIRECTION('',(-1.,-1.764139415369E-18,1.393319065621E-19));
+#232 = DEFINITIONAL_REPRESENTATION('',(#233),#237);
+#233 = LINE('',#234,#235);
+#234 = CARTESIAN_POINT('',(-0.,-1.00812964971));
+#235 = VECTOR('',#236,1.);
+#236 = DIRECTION('',(-1.,0.));
+#237 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#238 = ADVANCED_FACE('',(#239),#87,.T.);
+#239 = FACE_BOUND('',#240,.T.);
+#240 = EDGE_LOOP('',(#241,#264,#265,#293));
+#241 = ORIENTED_EDGE('',*,*,#242,.F.);
+#242 = EDGE_CURVE('',#37,#243,#245,.T.);
+#243 = VERTEX_POINT('',#244);
+#244 = CARTESIAN_POINT('',(-3.01625,-13.04875,0.8226));
+#245 = SURFACE_CURVE('',#246,(#250,#257),.PCURVE_S1.);
+#246 = LINE('',#247,#248);
+#247 = CARTESIAN_POINT('',(-3.096538823021,-13.12903882302,1.56221810889
+ ));
+#248 = VECTOR('',#249,1.);
+#249 = DIRECTION('',(0.107297395013,0.107297395013,-0.988420223411));
+#250 = PCURVE('',#87,#251);
+#251 = DEFINITIONAL_REPRESENTATION('',(#252),#256);
+#252 = LINE('',#253,#254);
+#253 = CARTESIAN_POINT('',(7.846117697874E-02,-8.467563392042E-03));
+#254 = VECTOR('',#255,1.);
+#255 = DIRECTION('',(0.107297395013,0.994226970577));
+#256 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#257 = PCURVE('',#200,#258);
+#258 = DEFINITIONAL_REPRESENTATION('',(#259),#263);
+#259 = LINE('',#260,#261);
+#260 = CARTESIAN_POINT('',(-7.846117697874E-02,-8.467563392042E-03));
+#261 = VECTOR('',#262,1.);
+#262 = DIRECTION('',(-0.107297395013,0.994226970577));
+#263 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#264 = ORIENTED_EDGE('',*,*,#71,.T.);
+#265 = ORIENTED_EDGE('',*,*,#266,.T.);
+#266 = EDGE_CURVE('',#72,#267,#269,.T.);
+#267 = VERTEX_POINT('',#268);
+#268 = CARTESIAN_POINT('',(-3.01625,13.04875,0.8226));
+#269 = SURFACE_CURVE('',#270,(#274,#281),.PCURVE_S1.);
+#270 = LINE('',#271,#272);
+#271 = CARTESIAN_POINT('',(-2.944484428649,12.976984428649,0.16149781705
+ ));
+#272 = VECTOR('',#273,1.);
+#273 = DIRECTION('',(0.107297395013,-0.107297395013,-0.988420223411));
+#274 = PCURVE('',#87,#275);
+#275 = DEFINITIONAL_REPRESENTATION('',(#276),#280);
+#276 = LINE('',#277,#278);
+#277 = CARTESIAN_POINT('',(26.184484428649,1.400481646062));
+#278 = VECTOR('',#279,1.);
+#279 = DIRECTION('',(-0.107297395013,0.994226970577));
+#280 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#281 = PCURVE('',#282,#287);
+#282 = PLANE('',#283);
+#283 = AXIS2_PLACEMENT_3D('',#284,#285,#286);
+#284 = CARTESIAN_POINT('',(-3.175,13.128125,1.5538));
+#285 = DIRECTION('',(0.,-0.994159535661,0.107920422789));
+#286 = DIRECTION('',(-1.,-0.,-0.));
+#287 = DEFINITIONAL_REPRESENTATION('',(#288),#292);
+#288 = LINE('',#289,#290);
+#289 = CARTESIAN_POINT('',(-0.230515571351,1.400481646062));
+#290 = VECTOR('',#291,1.);
+#291 = DIRECTION('',(-0.107297395013,0.994226970577));
+#292 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#293 = ORIENTED_EDGE('',*,*,#294,.F.);
+#294 = EDGE_CURVE('',#243,#267,#295,.T.);
+#295 = SURFACE_CURVE('',#296,(#300,#307),.PCURVE_S1.);
+#296 = LINE('',#297,#298);
+#297 = CARTESIAN_POINT('',(-3.01625,-13.2075,0.8226));
+#298 = VECTOR('',#299,1.);
+#299 = DIRECTION('',(0.,1.,0.));
+#300 = PCURVE('',#87,#301);
+#301 = DEFINITIONAL_REPRESENTATION('',(#302),#306);
+#302 = LINE('',#303,#304);
+#303 = CARTESIAN_POINT('',(0.,0.735495636034));
+#304 = VECTOR('',#305,1.);
+#305 = DIRECTION('',(1.,0.));
+#306 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#307 = PCURVE('',#308,#313);
+#308 = PLANE('',#309);
+#309 = AXIS2_PLACEMENT_3D('',#310,#311,#312);
+#310 = CARTESIAN_POINT('',(-3.175,-13.2075,0.8226));
+#311 = DIRECTION('',(0.,0.,1.));
+#312 = DIRECTION('',(1.,0.,0.));
+#313 = DEFINITIONAL_REPRESENTATION('',(#314),#318);
+#314 = LINE('',#315,#316);
+#315 = CARTESIAN_POINT('',(0.15875,0.));
+#316 = VECTOR('',#317,1.);
+#317 = DIRECTION('',(0.,1.));
+#318 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#319 = ADVANCED_FACE('',(#320),#141,.F.);
+#320 = FACE_BOUND('',#321,.F.);
+#321 = EDGE_LOOP('',(#322,#345,#346,#374));
+#322 = ORIENTED_EDGE('',*,*,#323,.F.);
+#323 = EDGE_CURVE('',#39,#324,#326,.T.);
+#324 = VERTEX_POINT('',#325);
+#325 = CARTESIAN_POINT('',(-3.01625,-13.04875,4.57));
+#326 = SURFACE_CURVE('',#327,(#331,#338),.PCURVE_S1.);
+#327 = LINE('',#328,#329);
+#328 = CARTESIAN_POINT('',(-3.096114028846,-13.12861402884,
+ 3.558808201696));
+#329 = VECTOR('',#330,1.);
+#330 = DIRECTION('',(7.849199537191E-02,7.849199537191E-02,
+ 0.993819909906));
+#331 = PCURVE('',#141,#332);
+#332 = DEFINITIONAL_REPRESENTATION('',(#333),#337);
+#333 = LINE('',#334,#335);
+#334 = CARTESIAN_POINT('',(7.888597115384E-02,-6.211080055165E-03));
+#335 = VECTOR('',#336,1.);
+#336 = DIRECTION('',(7.849199537191E-02,0.996914743929));
+#337 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#338 = PCURVE('',#227,#339);
+#339 = DEFINITIONAL_REPRESENTATION('',(#340),#344);
+#340 = LINE('',#341,#342);
+#341 = CARTESIAN_POINT('',(-7.888597115384E-02,-6.211080055165E-03));
+#342 = VECTOR('',#343,1.);
+#343 = DIRECTION('',(-7.849199537191E-02,0.996914743929));
+#344 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#345 = ORIENTED_EDGE('',*,*,#127,.T.);
+#346 = ORIENTED_EDGE('',*,*,#347,.T.);
+#347 = EDGE_CURVE('',#100,#348,#350,.T.);
+#348 = VERTEX_POINT('',#349);
+#349 = CARTESIAN_POINT('',(-3.01625,13.04875,4.57));
+#350 = SURFACE_CURVE('',#351,(#355,#362),.PCURVE_S1.);
+#351 = LINE('',#352,#353);
+#352 = CARTESIAN_POINT('',(-3.014742709342,13.047242709342,
+ 4.589084436053));
+#353 = VECTOR('',#354,1.);
+#354 = DIRECTION('',(7.849199537191E-02,-7.849199537191E-02,
+ 0.993819909906));
+#355 = PCURVE('',#141,#356);
+#356 = DEFINITIONAL_REPRESENTATION('',(#357),#361);
+#357 = LINE('',#358,#359);
+#358 = CARTESIAN_POINT('',(26.254742709342,1.027273516211));
+#359 = VECTOR('',#360,1.);
+#360 = DIRECTION('',(-7.849199537191E-02,0.996914743929));
+#361 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#362 = PCURVE('',#363,#368);
+#363 = PLANE('',#364);
+#364 = AXIS2_PLACEMENT_3D('',#365,#366,#367);
+#365 = CARTESIAN_POINT('',(-3.175,13.128125,3.565));
+#366 = DIRECTION('',(1.769633085429E-18,0.996895588071,
+ 7.873491273946E-02));
+#367 = DIRECTION('',(-1.,1.764139415369E-18,1.393319065621E-19));
+#368 = DEFINITIONAL_REPRESENTATION('',(#369),#373);
+#369 = LINE('',#370,#371);
+#370 = CARTESIAN_POINT('',(-0.160257290658,1.027273516211));
+#371 = VECTOR('',#372,1.);
+#372 = DIRECTION('',(-7.849199537191E-02,0.996914743929));
+#373 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#374 = ORIENTED_EDGE('',*,*,#375,.F.);
+#375 = EDGE_CURVE('',#324,#348,#376,.T.);
+#376 = SURFACE_CURVE('',#377,(#381,#388),.PCURVE_S1.);
+#377 = LINE('',#378,#379);
+#378 = CARTESIAN_POINT('',(-3.01625,-13.2075,4.57));
+#379 = VECTOR('',#380,1.);
+#380 = DIRECTION('',(0.,1.,0.));
+#381 = PCURVE('',#141,#382);
+#382 = DEFINITIONAL_REPRESENTATION('',(#383),#387);
+#383 = LINE('',#384,#385);
+#384 = CARTESIAN_POINT('',(0.,1.00812964971));
+#385 = VECTOR('',#386,1.);
+#386 = DIRECTION('',(1.,0.));
+#387 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#388 = PCURVE('',#389,#394);
+#389 = PLANE('',#390);
+#390 = AXIS2_PLACEMENT_3D('',#391,#392,#393);
+#391 = CARTESIAN_POINT('',(-3.175,-13.2075,4.57));
+#392 = DIRECTION('',(0.,0.,1.));
+#393 = DIRECTION('',(1.,0.,0.));
+#394 = DEFINITIONAL_REPRESENTATION('',(#395),#399);
+#395 = LINE('',#396,#397);
+#396 = CARTESIAN_POINT('',(0.15875,0.));
+#397 = VECTOR('',#398,1.);
+#398 = DIRECTION('',(0.,1.));
+#399 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#400 = ADVANCED_FACE('',(#401),#115,.T.);
+#401 = FACE_BOUND('',#402,.T.);
+#402 = EDGE_LOOP('',(#403,#428,#449,#450));
+#403 = ORIENTED_EDGE('',*,*,#404,.F.);
+#404 = EDGE_CURVE('',#405,#407,#409,.T.);
+#405 = VERTEX_POINT('',#406);
+#406 = CARTESIAN_POINT('',(3.175,13.2075,2.285));
+#407 = VERTEX_POINT('',#408);
+#408 = CARTESIAN_POINT('',(3.175,13.2075,2.56));
+#409 = SURFACE_CURVE('',#410,(#414,#421),.PCURVE_S1.);
+#410 = LINE('',#411,#412);
+#411 = CARTESIAN_POINT('',(3.175,13.2075,0.8226));
+#412 = VECTOR('',#413,1.);
+#413 = DIRECTION('',(0.,0.,1.));
+#414 = PCURVE('',#115,#415);
+#415 = DEFINITIONAL_REPRESENTATION('',(#416),#420);
+#416 = LINE('',#417,#418);
+#417 = CARTESIAN_POINT('',(0.,6.35));
+#418 = VECTOR('',#419,1.);
+#419 = DIRECTION('',(1.,0.));
+#420 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#421 = PCURVE('',#174,#422);
+#422 = DEFINITIONAL_REPRESENTATION('',(#423),#427);
+#423 = LINE('',#424,#425);
+#424 = CARTESIAN_POINT('',(0.,-26.415));
+#425 = VECTOR('',#426,1.);
+#426 = DIRECTION('',(1.,0.));
+#427 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#428 = ORIENTED_EDGE('',*,*,#429,.F.);
+#429 = EDGE_CURVE('',#72,#405,#430,.T.);
+#430 = SURFACE_CURVE('',#431,(#435,#442),.PCURVE_S1.);
+#431 = LINE('',#432,#433);
+#432 = CARTESIAN_POINT('',(-3.175,13.2075,2.285));
+#433 = VECTOR('',#434,1.);
+#434 = DIRECTION('',(1.,0.,0.));
+#435 = PCURVE('',#115,#436);
+#436 = DEFINITIONAL_REPRESENTATION('',(#437),#441);
+#437 = LINE('',#438,#439);
+#438 = CARTESIAN_POINT('',(1.4624,0.));
+#439 = VECTOR('',#440,1.);
+#440 = DIRECTION('',(0.,1.));
+#441 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#442 = PCURVE('',#282,#443);
+#443 = DEFINITIONAL_REPRESENTATION('',(#444),#448);
+#444 = LINE('',#445,#446);
+#445 = CARTESIAN_POINT('',(-0.,-0.735495636034));
+#446 = VECTOR('',#447,1.);
+#447 = DIRECTION('',(-1.,0.));
+#448 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#449 = ORIENTED_EDGE('',*,*,#99,.T.);
+#450 = ORIENTED_EDGE('',*,*,#451,.T.);
+#451 = EDGE_CURVE('',#100,#407,#452,.T.);
+#452 = SURFACE_CURVE('',#453,(#457,#464),.PCURVE_S1.);
+#453 = LINE('',#454,#455);
+#454 = CARTESIAN_POINT('',(-3.175,13.2075,2.56));
+#455 = VECTOR('',#456,1.);
+#456 = DIRECTION('',(1.,0.,0.));
+#457 = PCURVE('',#115,#458);
+#458 = DEFINITIONAL_REPRESENTATION('',(#459),#463);
+#459 = LINE('',#460,#461);
+#460 = CARTESIAN_POINT('',(1.7374,0.));
+#461 = VECTOR('',#462,1.);
+#462 = DIRECTION('',(0.,1.));
+#463 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#464 = PCURVE('',#363,#465);
+#465 = DEFINITIONAL_REPRESENTATION('',(#466),#470);
+#466 = LINE('',#467,#468);
+#467 = CARTESIAN_POINT('',(-0.,-1.00812964971));
+#468 = VECTOR('',#469,1.);
+#469 = DIRECTION('',(-1.,0.));
+#470 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#471 = ADVANCED_FACE('',(#472),#174,.T.);
+#472 = FACE_BOUND('',#473,.T.);
+#473 = EDGE_LOOP('',(#474,#475,#501,#502));
+#474 = ORIENTED_EDGE('',*,*,#156,.F.);
+#475 = ORIENTED_EDGE('',*,*,#476,.T.);
+#476 = EDGE_CURVE('',#157,#405,#477,.T.);
+#477 = SURFACE_CURVE('',#478,(#482,#489),.PCURVE_S1.);
+#478 = LINE('',#479,#480);
+#479 = CARTESIAN_POINT('',(3.175,-13.2075,2.285));
+#480 = VECTOR('',#481,1.);
+#481 = DIRECTION('',(0.,1.,0.));
+#482 = PCURVE('',#174,#483);
+#483 = DEFINITIONAL_REPRESENTATION('',(#484),#488);
+#484 = LINE('',#485,#486);
+#485 = CARTESIAN_POINT('',(1.4624,0.));
+#486 = VECTOR('',#487,1.);
+#487 = DIRECTION('',(0.,-1.));
+#488 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#489 = PCURVE('',#490,#495);
+#490 = PLANE('',#491);
+#491 = AXIS2_PLACEMENT_3D('',#492,#493,#494);
+#492 = CARTESIAN_POINT('',(3.095625,-13.2075,1.5538));
+#493 = DIRECTION('',(-0.994159535661,1.753391139168E-18,0.107920422789)
+ );
+#494 = DIRECTION('',(1.743150520747E-18,1.,-1.892267130529E-19));
+#495 = DEFINITIONAL_REPRESENTATION('',(#496),#500);
+#496 = LINE('',#497,#498);
+#497 = CARTESIAN_POINT('',(0.,-0.735495636034));
+#498 = VECTOR('',#499,1.);
+#499 = DIRECTION('',(1.,0.));
+#500 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#501 = ORIENTED_EDGE('',*,*,#404,.T.);
+#502 = ORIENTED_EDGE('',*,*,#503,.F.);
+#503 = EDGE_CURVE('',#159,#407,#504,.T.);
+#504 = SURFACE_CURVE('',#505,(#509,#516),.PCURVE_S1.);
+#505 = LINE('',#506,#507);
+#506 = CARTESIAN_POINT('',(3.175,-13.2075,2.56));
+#507 = VECTOR('',#508,1.);
+#508 = DIRECTION('',(0.,1.,0.));
+#509 = PCURVE('',#174,#510);
+#510 = DEFINITIONAL_REPRESENTATION('',(#511),#515);
+#511 = LINE('',#512,#513);
+#512 = CARTESIAN_POINT('',(1.7374,0.));
+#513 = VECTOR('',#514,1.);
+#514 = DIRECTION('',(0.,-1.));
+#515 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#516 = PCURVE('',#517,#522);
+#517 = PLANE('',#518);
+#518 = AXIS2_PLACEMENT_3D('',#519,#520,#521);
+#519 = CARTESIAN_POINT('',(3.095625,-13.2075,3.565));
+#520 = DIRECTION('',(0.996895588071,-1.769633085429E-18,
+ 7.873491273946E-02));
+#521 = DIRECTION('',(1.764139415369E-18,1.,1.393319065621E-19));
+#522 = DEFINITIONAL_REPRESENTATION('',(#523),#527);
+#523 = LINE('',#524,#525);
+#524 = CARTESIAN_POINT('',(0.,-1.00812964971));
+#525 = VECTOR('',#526,1.);
+#526 = DIRECTION('',(1.,0.));
+#527 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#528 = ADVANCED_FACE('',(#529),#200,.T.);
+#529 = FACE_BOUND('',#530,.F.);
+#530 = EDGE_LOOP('',(#531,#532,#533,#556));
+#531 = ORIENTED_EDGE('',*,*,#242,.F.);
+#532 = ORIENTED_EDGE('',*,*,#186,.T.);
+#533 = ORIENTED_EDGE('',*,*,#534,.T.);
+#534 = EDGE_CURVE('',#157,#535,#537,.T.);
+#535 = VERTEX_POINT('',#536);
+#536 = CARTESIAN_POINT('',(3.01625,-13.04875,0.8226));
+#537 = SURFACE_CURVE('',#538,(#542,#549),.PCURVE_S1.);
+#538 = LINE('',#539,#540);
+#539 = CARTESIAN_POINT('',(3.059985902171,-13.09248590217,1.22549375329)
+ );
+#540 = VECTOR('',#541,1.);
+#541 = DIRECTION('',(-0.107297395013,0.107297395013,-0.988420223411));
+#542 = PCURVE('',#200,#543);
+#543 = DEFINITIONAL_REPRESENTATION('',(#544),#548);
+#544 = LINE('',#545,#546);
+#545 = CARTESIAN_POINT('',(-6.234985902171,0.33023497229));
+#546 = VECTOR('',#547,1.);
+#547 = DIRECTION('',(0.107297395013,0.994226970577));
+#548 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#549 = PCURVE('',#490,#550);
+#550 = DEFINITIONAL_REPRESENTATION('',(#551),#555);
+#551 = LINE('',#552,#553);
+#552 = CARTESIAN_POINT('',(0.115014097829,0.33023497229));
+#553 = VECTOR('',#554,1.);
+#554 = DIRECTION('',(0.107297395013,0.994226970577));
+#555 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#556 = ORIENTED_EDGE('',*,*,#557,.F.);
+#557 = EDGE_CURVE('',#243,#535,#558,.T.);
+#558 = SURFACE_CURVE('',#559,(#563,#570),.PCURVE_S1.);
+#559 = LINE('',#560,#561);
+#560 = CARTESIAN_POINT('',(-3.175,-13.04875,0.8226));
+#561 = VECTOR('',#562,1.);
+#562 = DIRECTION('',(1.,0.,0.));
+#563 = PCURVE('',#200,#564);
+#564 = DEFINITIONAL_REPRESENTATION('',(#565),#569);
+#565 = LINE('',#566,#567);
+#566 = CARTESIAN_POINT('',(-0.,0.735495636034));
+#567 = VECTOR('',#568,1.);
+#568 = DIRECTION('',(-1.,0.));
+#569 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#570 = PCURVE('',#308,#571);
+#571 = DEFINITIONAL_REPRESENTATION('',(#572),#576);
+#572 = LINE('',#573,#574);
+#573 = CARTESIAN_POINT('',(0.,0.15875));
+#574 = VECTOR('',#575,1.);
+#575 = DIRECTION('',(1.,0.));
+#576 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#577 = ADVANCED_FACE('',(#578),#227,.F.);
+#578 = FACE_BOUND('',#579,.T.);
+#579 = EDGE_LOOP('',(#580,#581,#582,#605));
+#580 = ORIENTED_EDGE('',*,*,#323,.F.);
+#581 = ORIENTED_EDGE('',*,*,#213,.T.);
+#582 = ORIENTED_EDGE('',*,*,#583,.T.);
+#583 = EDGE_CURVE('',#159,#584,#586,.T.);
+#584 = VERTEX_POINT('',#585);
+#585 = CARTESIAN_POINT('',(3.01625,-13.04875,4.57));
+#586 = SURFACE_CURVE('',#587,(#591,#598),.PCURVE_S1.);
+#587 = LINE('',#588,#589);
+#588 = CARTESIAN_POINT('',(3.076552875,-13.109052875,3.806480133862));
+#589 = VECTOR('',#590,1.);
+#590 = DIRECTION('',(-7.849199537191E-02,7.849199537191E-02,
+ 0.993819909906));
+#591 = PCURVE('',#227,#592);
+#592 = DEFINITIONAL_REPRESENTATION('',(#593),#597);
+#593 = LINE('',#594,#595);
+#594 = CARTESIAN_POINT('',(-6.251552875,0.242232122151));
+#595 = VECTOR('',#596,1.);
+#596 = DIRECTION('',(7.849199537191E-02,0.996914743929));
+#597 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#598 = PCURVE('',#517,#599);
+#599 = DEFINITIONAL_REPRESENTATION('',(#600),#604);
+#600 = LINE('',#601,#602);
+#601 = CARTESIAN_POINT('',(9.844712500028E-02,0.242232122151));
+#602 = VECTOR('',#603,1.);
+#603 = DIRECTION('',(7.849199537191E-02,0.996914743929));
+#604 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#605 = ORIENTED_EDGE('',*,*,#606,.F.);
+#606 = EDGE_CURVE('',#324,#584,#607,.T.);
+#607 = SURFACE_CURVE('',#608,(#612,#619),.PCURVE_S1.);
+#608 = LINE('',#609,#610);
+#609 = CARTESIAN_POINT('',(-3.175,-13.04875,4.57));
+#610 = VECTOR('',#611,1.);
+#611 = DIRECTION('',(1.,0.,0.));
+#612 = PCURVE('',#227,#613);
+#613 = DEFINITIONAL_REPRESENTATION('',(#614),#618);
+#614 = LINE('',#615,#616);
+#615 = CARTESIAN_POINT('',(-0.,1.00812964971));
+#616 = VECTOR('',#617,1.);
+#617 = DIRECTION('',(-1.,0.));
+#618 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#619 = PCURVE('',#389,#620);
+#620 = DEFINITIONAL_REPRESENTATION('',(#621),#625);
+#621 = LINE('',#622,#623);
+#622 = CARTESIAN_POINT('',(0.,0.15875));
+#623 = VECTOR('',#624,1.);
+#624 = DIRECTION('',(1.,0.));
+#625 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#626 = ADVANCED_FACE('',(#627),#308,.F.);
+#627 = FACE_BOUND('',#628,.F.);
+#628 = EDGE_LOOP('',(#629,#630,#631,#654));
+#629 = ORIENTED_EDGE('',*,*,#294,.F.);
+#630 = ORIENTED_EDGE('',*,*,#557,.T.);
+#631 = ORIENTED_EDGE('',*,*,#632,.T.);
+#632 = EDGE_CURVE('',#535,#633,#635,.T.);
+#633 = VERTEX_POINT('',#634);
+#634 = CARTESIAN_POINT('',(3.01625,13.04875,0.8226));
+#635 = SURFACE_CURVE('',#636,(#640,#647),.PCURVE_S1.);
+#636 = LINE('',#637,#638);
+#637 = CARTESIAN_POINT('',(3.01625,-13.2075,0.8226));
+#638 = VECTOR('',#639,1.);
+#639 = DIRECTION('',(0.,1.,0.));
+#640 = PCURVE('',#308,#641);
+#641 = DEFINITIONAL_REPRESENTATION('',(#642),#646);
+#642 = LINE('',#643,#644);
+#643 = CARTESIAN_POINT('',(6.19125,0.));
+#644 = VECTOR('',#645,1.);
+#645 = DIRECTION('',(0.,1.));
+#646 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#647 = PCURVE('',#490,#648);
+#648 = DEFINITIONAL_REPRESENTATION('',(#649),#653);
+#649 = LINE('',#650,#651);
+#650 = CARTESIAN_POINT('',(0.,0.735495636034));
+#651 = VECTOR('',#652,1.);
+#652 = DIRECTION('',(1.,0.));
+#653 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#654 = ORIENTED_EDGE('',*,*,#655,.F.);
+#655 = EDGE_CURVE('',#267,#633,#656,.T.);
+#656 = SURFACE_CURVE('',#657,(#661,#668),.PCURVE_S1.);
+#657 = LINE('',#658,#659);
+#658 = CARTESIAN_POINT('',(-3.175,13.04875,0.8226));
+#659 = VECTOR('',#660,1.);
+#660 = DIRECTION('',(1.,0.,0.));
+#661 = PCURVE('',#308,#662);
+#662 = DEFINITIONAL_REPRESENTATION('',(#663),#667);
+#663 = LINE('',#664,#665);
+#664 = CARTESIAN_POINT('',(0.,26.25625));
+#665 = VECTOR('',#666,1.);
+#666 = DIRECTION('',(1.,0.));
+#667 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#668 = PCURVE('',#282,#669);
+#669 = DEFINITIONAL_REPRESENTATION('',(#670),#674);
+#670 = LINE('',#671,#672);
+#671 = CARTESIAN_POINT('',(-0.,0.735495636034));
+#672 = VECTOR('',#673,1.);
+#673 = DIRECTION('',(-1.,0.));
+#674 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#675 = ADVANCED_FACE('',(#676),#282,.F.);
+#676 = FACE_BOUND('',#677,.T.);
+#677 = EDGE_LOOP('',(#678,#679,#680,#701));
+#678 = ORIENTED_EDGE('',*,*,#266,.F.);
+#679 = ORIENTED_EDGE('',*,*,#429,.T.);
+#680 = ORIENTED_EDGE('',*,*,#681,.T.);
+#681 = EDGE_CURVE('',#405,#633,#682,.T.);
+#682 = SURFACE_CURVE('',#683,(#687,#694),.PCURVE_S1.);
+#683 = LINE('',#684,#685);
+#684 = CARTESIAN_POINT('',(2.907931507799,12.940431507799,-0.17522653855
+ ));
+#685 = VECTOR('',#686,1.);
+#686 = DIRECTION('',(-0.107297395013,-0.107297395013,-0.988420223411));
+#687 = PCURVE('',#282,#688);
+#688 = DEFINITIONAL_REPRESENTATION('',(#689),#693);
+#689 = LINE('',#690,#691);
+#690 = CARTESIAN_POINT('',(-6.082931507799,1.739184181743));
+#691 = VECTOR('',#692,1.);
+#692 = DIRECTION('',(0.107297395013,0.994226970577));
+#693 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#694 = PCURVE('',#490,#695);
+#695 = DEFINITIONAL_REPRESENTATION('',(#696),#700);
+#696 = LINE('',#697,#698);
+#697 = CARTESIAN_POINT('',(26.147931507799,1.739184181743));
+#698 = VECTOR('',#699,1.);
+#699 = DIRECTION('',(-0.107297395013,0.994226970577));
+#700 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#701 = ORIENTED_EDGE('',*,*,#655,.F.);
+#702 = ADVANCED_FACE('',(#703),#389,.T.);
+#703 = FACE_BOUND('',#704,.T.);
+#704 = EDGE_LOOP('',(#705,#706,#707,#730,#753,#782));
+#705 = ORIENTED_EDGE('',*,*,#375,.F.);
+#706 = ORIENTED_EDGE('',*,*,#606,.T.);
+#707 = ORIENTED_EDGE('',*,*,#708,.T.);
+#708 = EDGE_CURVE('',#584,#709,#711,.T.);
+#709 = VERTEX_POINT('',#710);
+#710 = CARTESIAN_POINT('',(3.01625,13.04875,4.57));
+#711 = SURFACE_CURVE('',#712,(#716,#723),.PCURVE_S1.);
+#712 = LINE('',#713,#714);
+#713 = CARTESIAN_POINT('',(3.01625,-13.2075,4.57));
+#714 = VECTOR('',#715,1.);
+#715 = DIRECTION('',(0.,1.,0.));
+#716 = PCURVE('',#389,#717);
+#717 = DEFINITIONAL_REPRESENTATION('',(#718),#722);
+#718 = LINE('',#719,#720);
+#719 = CARTESIAN_POINT('',(6.19125,0.));
+#720 = VECTOR('',#721,1.);
+#721 = DIRECTION('',(0.,1.));
+#722 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#723 = PCURVE('',#517,#724);
+#724 = DEFINITIONAL_REPRESENTATION('',(#725),#729);
+#725 = LINE('',#726,#727);
+#726 = CARTESIAN_POINT('',(0.,1.00812964971));
+#727 = VECTOR('',#728,1.);
+#728 = DIRECTION('',(1.,0.));
+#729 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#730 = ORIENTED_EDGE('',*,*,#731,.F.);
+#731 = EDGE_CURVE('',#732,#709,#734,.T.);
+#732 = VERTEX_POINT('',#733);
+#733 = CARTESIAN_POINT('',(0.777712993334,13.04875,4.57));
+#734 = SURFACE_CURVE('',#735,(#739,#746),.PCURVE_S1.);
+#735 = LINE('',#736,#737);
+#736 = CARTESIAN_POINT('',(-3.175,13.04875,4.57));
+#737 = VECTOR('',#738,1.);
+#738 = DIRECTION('',(1.,0.,0.));
+#739 = PCURVE('',#389,#740);
+#740 = DEFINITIONAL_REPRESENTATION('',(#741),#745);
+#741 = LINE('',#742,#743);
+#742 = CARTESIAN_POINT('',(0.,26.25625));
+#743 = VECTOR('',#744,1.);
+#744 = DIRECTION('',(1.,0.));
+#745 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#746 = PCURVE('',#363,#747);
+#747 = DEFINITIONAL_REPRESENTATION('',(#748),#752);
+#748 = LINE('',#749,#750);
+#749 = CARTESIAN_POINT('',(-0.,1.00812964971));
+#750 = VECTOR('',#751,1.);
+#751 = DIRECTION('',(-1.,0.));
+#752 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#753 = ORIENTED_EDGE('',*,*,#754,.F.);
+#754 = EDGE_CURVE('',#755,#732,#757,.T.);
+#755 = VERTEX_POINT('',#756);
+#756 = CARTESIAN_POINT('',(-0.777712993334,13.04875,4.57));
+#757 = SURFACE_CURVE('',#758,(#763,#770),.PCURVE_S1.);
+#758 = CIRCLE('',#759,0.79375);
+#759 = AXIS2_PLACEMENT_3D('',#760,#761,#762);
+#760 = CARTESIAN_POINT('',(0.,13.2075,4.57));
+#761 = DIRECTION('',(0.,0.,1.));
+#762 = DIRECTION('',(1.,0.,0.));
+#763 = PCURVE('',#389,#764);
+#764 = DEFINITIONAL_REPRESENTATION('',(#765),#769);
+#765 = CIRCLE('',#766,0.79375);
+#766 = AXIS2_PLACEMENT_2D('',#767,#768);
+#767 = CARTESIAN_POINT('',(3.175,26.415));
+#768 = DIRECTION('',(1.,0.));
+#769 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#770 = PCURVE('',#771,#776);
+#771 = CYLINDRICAL_SURFACE('',#772,0.79375);
+#772 = AXIS2_PLACEMENT_3D('',#773,#774,#775);
+#773 = CARTESIAN_POINT('',(0.,13.2075,4.113));
+#774 = DIRECTION('',(0.,0.,1.));
+#775 = DIRECTION('',(1.,0.,0.));
+#776 = DEFINITIONAL_REPRESENTATION('',(#777),#781);
+#777 = LINE('',#778,#779);
+#778 = CARTESIAN_POINT('',(0.,0.457));
+#779 = VECTOR('',#780,1.);
+#780 = DIRECTION('',(1.,0.));
+#781 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#782 = ORIENTED_EDGE('',*,*,#783,.F.);
+#783 = EDGE_CURVE('',#348,#755,#784,.T.);
+#784 = SURFACE_CURVE('',#785,(#789,#796),.PCURVE_S1.);
+#785 = LINE('',#786,#787);
+#786 = CARTESIAN_POINT('',(-3.175,13.04875,4.57));
+#787 = VECTOR('',#788,1.);
+#788 = DIRECTION('',(1.,0.,0.));
+#789 = PCURVE('',#389,#790);
+#790 = DEFINITIONAL_REPRESENTATION('',(#791),#795);
+#791 = LINE('',#792,#793);
+#792 = CARTESIAN_POINT('',(0.,26.25625));
+#793 = VECTOR('',#794,1.);
+#794 = DIRECTION('',(1.,0.));
+#795 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#796 = PCURVE('',#363,#797);
+#797 = DEFINITIONAL_REPRESENTATION('',(#798),#802);
+#798 = LINE('',#799,#800);
+#799 = CARTESIAN_POINT('',(-0.,1.00812964971));
+#800 = VECTOR('',#801,1.);
+#801 = DIRECTION('',(-1.,0.));
+#802 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#803 = ADVANCED_FACE('',(#804),#363,.T.);
+#804 = FACE_BOUND('',#805,.F.);
+#805 = EDGE_LOOP('',(#806,#807,#808,#829,#830,#860,#886,#914));
+#806 = ORIENTED_EDGE('',*,*,#347,.F.);
+#807 = ORIENTED_EDGE('',*,*,#451,.T.);
+#808 = ORIENTED_EDGE('',*,*,#809,.T.);
+#809 = EDGE_CURVE('',#407,#709,#810,.T.);
+#810 = SURFACE_CURVE('',#811,(#815,#822),.PCURVE_S1.);
+#811 = LINE('',#812,#813);
+#812 = CARTESIAN_POINT('',(2.995181555495,13.027681555495,4.836756368219
+ ));
+#813 = VECTOR('',#814,1.);
+#814 = DIRECTION('',(-7.849199537191E-02,-7.849199537191E-02,
+ 0.993819909906));
+#815 = PCURVE('',#363,#816);
+#816 = DEFINITIONAL_REPRESENTATION('',(#817),#821);
+#817 = LINE('',#818,#819);
+#818 = CARTESIAN_POINT('',(-6.170181555495,1.275716718417));
+#819 = VECTOR('',#820,1.);
+#820 = DIRECTION('',(7.849199537191E-02,0.996914743929));
+#821 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#822 = PCURVE('',#517,#823);
+#823 = DEFINITIONAL_REPRESENTATION('',(#824),#828);
+#824 = LINE('',#825,#826);
+#825 = CARTESIAN_POINT('',(26.235181555495,1.275716718417));
+#826 = VECTOR('',#827,1.);
+#827 = DIRECTION('',(-7.849199537191E-02,0.996914743929));
+#828 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#829 = ORIENTED_EDGE('',*,*,#731,.F.);
+#830 = ORIENTED_EDGE('',*,*,#831,.T.);
+#831 = EDGE_CURVE('',#732,#832,#834,.T.);
+#832 = VERTEX_POINT('',#833);
+#833 = CARTESIAN_POINT('',(0.784215879063,13.084843905473,4.113));
+#834 = SURFACE_CURVE('',#835,(#840,#847),.PCURVE_S1.);
+#835 = ELLIPSE('',#836,10.081296497103,0.79375);
+#836 = AXIS2_PLACEMENT_3D('',#837,#838,#839);
+#837 = CARTESIAN_POINT('',(0.,13.2075,2.56));
+#838 = DIRECTION('',(1.769633085429E-18,0.996895588071,
+ 7.873491273946E-02));
+#839 = DIRECTION('',(-1.397657971701E-19,-7.873491273946E-02,
+ 0.996895588071));
+#840 = PCURVE('',#363,#841);
+#841 = DEFINITIONAL_REPRESENTATION('',(#842),#846);
+#842 = ELLIPSE('',#843,10.081296497103,0.79375);
+#843 = AXIS2_PLACEMENT_2D('',#844,#845);
+#844 = CARTESIAN_POINT('',(-3.175,-1.00812964971));
+#845 = DIRECTION('',(1.397657971701E-19,1.));
+#846 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#847 = PCURVE('',#771,#848);
+#848 = DEFINITIONAL_REPRESENTATION('',(#849),#859);
+#849 = B_SPLINE_CURVE_WITH_KNOTS('',8,(#850,#851,#852,#853,#854,#855,
+ #856,#857,#858),.UNSPECIFIED.,.F.,.F.,(9,9),(1.369438365383,
+ 1.41564731456),.PIECEWISE_BEZIER_KNOTS.);
+#850 = CARTESIAN_POINT('',(6.081827345768,0.4570004));
+#851 = CARTESIAN_POINT('',(6.087603464415,0.400123256087));
+#852 = CARTESIAN_POINT('',(6.093379583056,0.343169471326));
+#853 = CARTESIAN_POINT('',(6.099155701708,0.286141937334));
+#854 = CARTESIAN_POINT('',(6.104931820355,0.229043551179));
+#855 = CARTESIAN_POINT('',(6.110707938995,0.171877215085));
+#856 = CARTESIAN_POINT('',(6.116484057647,0.1146458361));
+#857 = CARTESIAN_POINT('',(6.122260176297,5.735232580693E-02));
+#858 = CARTESIAN_POINT('',(6.128036294945,-3.999999984572E-07));
+#859 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#860 = ORIENTED_EDGE('',*,*,#861,.T.);
+#861 = EDGE_CURVE('',#832,#862,#864,.T.);
+#862 = VERTEX_POINT('',#863);
+#863 = CARTESIAN_POINT('',(-0.784215879063,13.084843905473,4.113));
+#864 = SURFACE_CURVE('',#865,(#869,#875),.PCURVE_S1.);
+#865 = LINE('',#866,#867);
+#866 = CARTESIAN_POINT('',(-1.5875,13.084843905473,4.113));
+#867 = VECTOR('',#868,1.);
+#868 = DIRECTION('',(-1.,1.775143863213E-18,0.));
+#869 = PCURVE('',#363,#870);
+#870 = DEFINITIONAL_REPRESENTATION('',(#871),#874);
+#871 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#872,#873),.UNSPECIFIED.,.F.,.F.,
+ (2,2),(-2.54,-0.635),.PIECEWISE_BEZIER_KNOTS.);
+#872 = CARTESIAN_POINT('',(-4.1275,0.549706515464));
+#873 = CARTESIAN_POINT('',(-2.2225,0.549706515464));
+#874 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#875 = PCURVE('',#876,#881);
+#876 = PLANE('',#877);
+#877 = AXIS2_PLACEMENT_3D('',#878,#879,#880);
+#878 = CARTESIAN_POINT('',(0.,13.2075,4.113));
+#879 = DIRECTION('',(0.,0.,1.));
+#880 = DIRECTION('',(1.,0.,0.));
+#881 = DEFINITIONAL_REPRESENTATION('',(#882),#885);
+#882 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#883,#884),.UNSPECIFIED.,.F.,.F.,
+ (2,2),(-2.54,-0.635),.PIECEWISE_BEZIER_KNOTS.);
+#883 = CARTESIAN_POINT('',(0.9525,-0.122656094527));
+#884 = CARTESIAN_POINT('',(-0.9525,-0.122656094527));
+#885 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#886 = ORIENTED_EDGE('',*,*,#887,.T.);
+#887 = EDGE_CURVE('',#862,#755,#888,.T.);
+#888 = SURFACE_CURVE('',#889,(#894,#901),.PCURVE_S1.);
+#889 = ELLIPSE('',#890,10.081296497103,0.79375);
+#890 = AXIS2_PLACEMENT_3D('',#891,#892,#893);
+#891 = CARTESIAN_POINT('',(0.,13.2075,2.56));
+#892 = DIRECTION('',(1.769633085429E-18,0.996895588071,
+ 7.873491273946E-02));
+#893 = DIRECTION('',(-1.397657971701E-19,-7.873491273946E-02,
+ 0.996895588071));
+#894 = PCURVE('',#363,#895);
+#895 = DEFINITIONAL_REPRESENTATION('',(#896),#900);
+#896 = ELLIPSE('',#897,10.081296497103,0.79375);
+#897 = AXIS2_PLACEMENT_2D('',#898,#899);
+#898 = CARTESIAN_POINT('',(-3.175,-1.00812964971));
+#899 = DIRECTION('',(1.397657971701E-19,1.));
+#900 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#901 = PCURVE('',#771,#902);
+#902 = DEFINITIONAL_REPRESENTATION('',(#903),#913);
+#903 = B_SPLINE_CURVE_WITH_KNOTS('',8,(#904,#905,#906,#907,#908,#909,
+ #910,#911,#912),.UNSPECIFIED.,.F.,.F.,(9,9),(4.86753799262,
+ 4.913746941797),.PIECEWISE_BEZIER_KNOTS.);
+#904 = CARTESIAN_POINT('',(3.296741665825,-4.000000028981E-07));
+#905 = CARTESIAN_POINT('',(3.302517784472,5.735232580693E-02));
+#906 = CARTESIAN_POINT('',(3.308293903119,0.1146458361));
+#907 = CARTESIAN_POINT('',(3.314070021746,0.171877215084));
+#908 = CARTESIAN_POINT('',(3.319846140417,0.229043551181));
+#909 = CARTESIAN_POINT('',(3.325622259046,0.286141937333));
+#910 = CARTESIAN_POINT('',(3.33139837771,0.343169471326));
+#911 = CARTESIAN_POINT('',(3.337174496355,0.400123256087));
+#912 = CARTESIAN_POINT('',(3.342950615002,0.4570004));
+#913 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#914 = ORIENTED_EDGE('',*,*,#783,.F.);
+#915 = ADVANCED_FACE('',(#916),#490,.F.);
+#916 = FACE_BOUND('',#917,.F.);
+#917 = EDGE_LOOP('',(#918,#919,#920,#921));
+#918 = ORIENTED_EDGE('',*,*,#534,.F.);
+#919 = ORIENTED_EDGE('',*,*,#476,.T.);
+#920 = ORIENTED_EDGE('',*,*,#681,.T.);
+#921 = ORIENTED_EDGE('',*,*,#632,.F.);
+#922 = ADVANCED_FACE('',(#923),#517,.T.);
+#923 = FACE_BOUND('',#924,.T.);
+#924 = EDGE_LOOP('',(#925,#926,#927,#928));
+#925 = ORIENTED_EDGE('',*,*,#583,.F.);
+#926 = ORIENTED_EDGE('',*,*,#503,.T.);
+#927 = ORIENTED_EDGE('',*,*,#809,.T.);
+#928 = ORIENTED_EDGE('',*,*,#708,.F.);
+#929 = ADVANCED_FACE('',(#930),#771,.F.);
+#930 = FACE_BOUND('',#931,.F.);
+#931 = EDGE_LOOP('',(#932,#933,#934,#956));
+#932 = ORIENTED_EDGE('',*,*,#754,.F.);
+#933 = ORIENTED_EDGE('',*,*,#887,.F.);
+#934 = ORIENTED_EDGE('',*,*,#935,.T.);
+#935 = EDGE_CURVE('',#862,#832,#936,.T.);
+#936 = SURFACE_CURVE('',#937,(#942,#949),.PCURVE_S1.);
+#937 = CIRCLE('',#938,0.79375);
+#938 = AXIS2_PLACEMENT_3D('',#939,#940,#941);
+#939 = CARTESIAN_POINT('',(0.,13.2075,4.113));
+#940 = DIRECTION('',(0.,0.,1.));
+#941 = DIRECTION('',(1.,0.,0.));
+#942 = PCURVE('',#771,#943);
+#943 = DEFINITIONAL_REPRESENTATION('',(#944),#948);
+#944 = LINE('',#945,#946);
+#945 = CARTESIAN_POINT('',(0.,0.));
+#946 = VECTOR('',#947,1.);
+#947 = DIRECTION('',(1.,0.));
+#948 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#949 = PCURVE('',#876,#950);
+#950 = DEFINITIONAL_REPRESENTATION('',(#951),#955);
+#951 = CIRCLE('',#952,0.79375);
+#952 = AXIS2_PLACEMENT_2D('',#953,#954);
+#953 = CARTESIAN_POINT('',(0.,0.));
+#954 = DIRECTION('',(1.,0.));
+#955 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#956 = ORIENTED_EDGE('',*,*,#831,.F.);
+#957 = ADVANCED_FACE('',(#958),#876,.T.);
+#958 = FACE_BOUND('',#959,.T.);
+#959 = EDGE_LOOP('',(#960,#961));
+#960 = ORIENTED_EDGE('',*,*,#861,.T.);
+#961 = ORIENTED_EDGE('',*,*,#935,.T.);
+#962 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3)
+GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#966)) GLOBAL_UNIT_ASSIGNED_CONTEXT
+((#963,#964,#965)) REPRESENTATION_CONTEXT('Context #1',
+ '3D Context with UNIT and UNCERTAINTY') );
+#963 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) );
+#964 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) );
+#965 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() );
+#966 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(5.E-05),#963,
+ 'distance_accuracy_value','confusion accuracy');
+#967 = SHAPE_DEFINITION_REPRESENTATION(#968,#29);
+#968 = PRODUCT_DEFINITION_SHAPE('','',#969);
+#969 = PRODUCT_DEFINITION('design','',#970,#973);
+#970 = PRODUCT_DEFINITION_FORMATION('','',#971);
+#971 = PRODUCT('Body','Body','',(#972));
+#972 = PRODUCT_CONTEXT('',#2,'mechanical');
+#973 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design');
+#974 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#975,#977);
+#975 = ( REPRESENTATION_RELATIONSHIP('','',#29,#10)
+REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#976)
+SHAPE_REPRESENTATION_RELATIONSHIP() );
+#976 = ITEM_DEFINED_TRANSFORMATION('','',#11,#15);
+#977 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#978
+ );
+#978 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('1','=>[0:1:1:2]','',#5,#969,$);
+#979 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#971));
+#980 = SHAPE_REPRESENTATION('',(#11,#981,#1863,#2745,#3627,#4509,#5391,
+ #6273,#7155,#8037,#8919,#9801,#10683,#11565,#12447,#13329,#14211,
+ #15093,#15975,#16857,#17739),#18621);
+#981 = MANIFOLD_SOLID_BREP('',#982);
+#982 = CLOSED_SHELL('',(#983,#1215,#1380,#1430,#1479,#1597,#1646,#1695,
+ #1744,#1771,#1798,#1825,#1852));
+#983 = ADVANCED_FACE('',(#984),#998,.F.);
+#984 = FACE_BOUND('',#985,.F.);
+#985 = EDGE_LOOP('',(#986,#1021,#1049,#1077,#1105,#1133,#1161,#1189));
+#986 = ORIENTED_EDGE('',*,*,#987,.T.);
+#987 = EDGE_CURVE('',#988,#990,#992,.T.);
+#988 = VERTEX_POINT('',#989);
+#989 = CARTESIAN_POINT('',(-3.9475,10.88,2.4225));
+#990 = VERTEX_POINT('',#991);
+#991 = CARTESIAN_POINT('',(-3.9475,10.88,0.275));
+#992 = SURFACE_CURVE('',#993,(#997,#1009),.PCURVE_S1.);
+#993 = LINE('',#994,#995);
+#994 = CARTESIAN_POINT('',(-3.9475,10.88,2.56));
+#995 = VECTOR('',#996,1.);
+#996 = DIRECTION('',(0.,0.,-1.));
+#997 = PCURVE('',#998,#1003);
+#998 = PLANE('',#999);
+#999 = AXIS2_PLACEMENT_3D('',#1000,#1001,#1002);
+#1000 = CARTESIAN_POINT('',(-3.9475,11.43,-0.34105853382));
+#1001 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#1002 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#1003 = DEFINITIONAL_REPRESENTATION('',(#1004),#1008);
+#1004 = LINE('',#1005,#1006);
+#1005 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#1006 = VECTOR('',#1007,1.);
+#1007 = DIRECTION('',(0.,-1.));
+#1008 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1009 = PCURVE('',#1010,#1015);
+#1010 = PLANE('',#1011);
+#1011 = AXIS2_PLACEMENT_3D('',#1012,#1013,#1014);
+#1012 = CARTESIAN_POINT('',(-3.724778209321,10.88,1.581028209321));
+#1013 = DIRECTION('',(1.58726821659E-29,-1.,-1.055919227411E-30));
+#1014 = DIRECTION('',(-1.,-1.58726821659E-29,0.));
+#1015 = DEFINITIONAL_REPRESENTATION('',(#1016),#1020);
+#1016 = LINE('',#1017,#1018);
+#1017 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#1018 = VECTOR('',#1019,1.);
+#1019 = DIRECTION('',(0.,1.));
+#1020 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1021 = ORIENTED_EDGE('',*,*,#1022,.T.);
+#1022 = EDGE_CURVE('',#990,#1023,#1025,.T.);
+#1023 = VERTEX_POINT('',#1024);
+#1024 = CARTESIAN_POINT('',(-3.9475,11.155,0.));
+#1025 = SURFACE_CURVE('',#1026,(#1030,#1037),.PCURVE_S1.);
+#1026 = LINE('',#1027,#1028);
+#1027 = CARTESIAN_POINT('',(-3.9475,10.88,0.275));
+#1028 = VECTOR('',#1029,1.);
+#1029 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#1030 = PCURVE('',#998,#1031);
+#1031 = DEFINITIONAL_REPRESENTATION('',(#1032),#1036);
+#1032 = LINE('',#1033,#1034);
+#1033 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#1034 = VECTOR('',#1035,1.);
+#1035 = DIRECTION('',(0.707106781187,-0.707106781187));
+#1036 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1037 = PCURVE('',#1038,#1043);
+#1038 = PLANE('',#1039);
+#1039 = AXIS2_PLACEMENT_3D('',#1040,#1041,#1042);
+#1040 = CARTESIAN_POINT('',(-3.6725,10.88,0.275));
+#1041 = DIRECTION('',(-0.,-0.707106781187,-0.707106781187));
+#1042 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#1043 = DEFINITIONAL_REPRESENTATION('',(#1044),#1048);
+#1044 = LINE('',#1045,#1046);
+#1045 = CARTESIAN_POINT('',(0.,-0.275));
+#1046 = VECTOR('',#1047,1.);
+#1047 = DIRECTION('',(1.,0.));
+#1048 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1049 = ORIENTED_EDGE('',*,*,#1050,.T.);
+#1050 = EDGE_CURVE('',#1023,#1051,#1053,.T.);
+#1051 = VERTEX_POINT('',#1052);
+#1052 = CARTESIAN_POINT('',(-3.9475,11.155,-3.5));
+#1053 = SURFACE_CURVE('',#1054,(#1058,#1065),.PCURVE_S1.);
+#1054 = LINE('',#1055,#1056);
+#1055 = CARTESIAN_POINT('',(-3.9475,11.155,0.));
+#1056 = VECTOR('',#1057,1.);
+#1057 = DIRECTION('',(0.,0.,-1.));
+#1058 = PCURVE('',#998,#1059);
+#1059 = DEFINITIONAL_REPRESENTATION('',(#1060),#1064);
+#1060 = LINE('',#1061,#1062);
+#1061 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#1062 = VECTOR('',#1063,1.);
+#1063 = DIRECTION('',(0.,-1.));
+#1064 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1065 = PCURVE('',#1066,#1071);
+#1066 = PLANE('',#1067);
+#1067 = AXIS2_PLACEMENT_3D('',#1068,#1069,#1070);
+#1068 = CARTESIAN_POINT('',(-3.6725,11.155,0.));
+#1069 = DIRECTION('',(-0.,-1.,-0.));
+#1070 = DIRECTION('',(0.,0.,-1.));
+#1071 = DEFINITIONAL_REPRESENTATION('',(#1072),#1076);
+#1072 = LINE('',#1073,#1074);
+#1073 = CARTESIAN_POINT('',(0.,-0.275));
+#1074 = VECTOR('',#1075,1.);
+#1075 = DIRECTION('',(1.,0.));
+#1076 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1077 = ORIENTED_EDGE('',*,*,#1078,.T.);
+#1078 = EDGE_CURVE('',#1051,#1079,#1081,.T.);
+#1079 = VERTEX_POINT('',#1080);
+#1080 = CARTESIAN_POINT('',(-3.9475,11.705,-3.5));
+#1081 = SURFACE_CURVE('',#1082,(#1086,#1093),.PCURVE_S1.);
+#1082 = LINE('',#1083,#1084);
+#1083 = CARTESIAN_POINT('',(-3.9475,11.155,-3.5));
+#1084 = VECTOR('',#1085,1.);
+#1085 = DIRECTION('',(0.,1.,0.));
+#1086 = PCURVE('',#998,#1087);
+#1087 = DEFINITIONAL_REPRESENTATION('',(#1088),#1092);
+#1088 = LINE('',#1089,#1090);
+#1089 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#1090 = VECTOR('',#1091,1.);
+#1091 = DIRECTION('',(1.,-2.226071387182E-62));
+#1092 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1093 = PCURVE('',#1094,#1099);
+#1094 = PLANE('',#1095);
+#1095 = AXIS2_PLACEMENT_3D('',#1096,#1097,#1098);
+#1096 = CARTESIAN_POINT('',(-3.6725,11.155,-3.5));
+#1097 = DIRECTION('',(0.,0.,-1.));
+#1098 = DIRECTION('',(0.,1.,0.));
+#1099 = DEFINITIONAL_REPRESENTATION('',(#1100),#1104);
+#1100 = LINE('',#1101,#1102);
+#1101 = CARTESIAN_POINT('',(0.,-0.275));
+#1102 = VECTOR('',#1103,1.);
+#1103 = DIRECTION('',(1.,0.));
+#1104 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1105 = ORIENTED_EDGE('',*,*,#1106,.T.);
+#1106 = EDGE_CURVE('',#1079,#1107,#1109,.T.);
+#1107 = VERTEX_POINT('',#1108);
+#1108 = CARTESIAN_POINT('',(-3.9475,11.705,0.));
+#1109 = SURFACE_CURVE('',#1110,(#1114,#1121),.PCURVE_S1.);
+#1110 = LINE('',#1111,#1112);
+#1111 = CARTESIAN_POINT('',(-3.9475,11.705,-3.5));
+#1112 = VECTOR('',#1113,1.);
+#1113 = DIRECTION('',(0.,0.,1.));
+#1114 = PCURVE('',#998,#1115);
+#1115 = DEFINITIONAL_REPRESENTATION('',(#1116),#1120);
+#1116 = LINE('',#1117,#1118);
+#1117 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#1118 = VECTOR('',#1119,1.);
+#1119 = DIRECTION('',(0.,1.));
+#1120 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1121 = PCURVE('',#1122,#1127);
+#1122 = PLANE('',#1123);
+#1123 = AXIS2_PLACEMENT_3D('',#1124,#1125,#1126);
+#1124 = CARTESIAN_POINT('',(-3.6725,11.705,-3.5));
+#1125 = DIRECTION('',(0.,1.,0.));
+#1126 = DIRECTION('',(0.,0.,1.));
+#1127 = DEFINITIONAL_REPRESENTATION('',(#1128),#1132);
+#1128 = LINE('',#1129,#1130);
+#1129 = CARTESIAN_POINT('',(0.,-0.275));
+#1130 = VECTOR('',#1131,1.);
+#1131 = DIRECTION('',(1.,0.));
+#1132 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1133 = ORIENTED_EDGE('',*,*,#1134,.T.);
+#1134 = EDGE_CURVE('',#1107,#1135,#1137,.T.);
+#1135 = VERTEX_POINT('',#1136);
+#1136 = CARTESIAN_POINT('',(-3.9475,11.98,0.275));
+#1137 = SURFACE_CURVE('',#1138,(#1142,#1149),.PCURVE_S1.);
+#1138 = LINE('',#1139,#1140);
+#1139 = CARTESIAN_POINT('',(-3.9475,11.705,0.));
+#1140 = VECTOR('',#1141,1.);
+#1141 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#1142 = PCURVE('',#998,#1143);
+#1143 = DEFINITIONAL_REPRESENTATION('',(#1144),#1148);
+#1144 = LINE('',#1145,#1146);
+#1145 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#1146 = VECTOR('',#1147,1.);
+#1147 = DIRECTION('',(0.707106781187,0.707106781187));
+#1148 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1149 = PCURVE('',#1150,#1155);
+#1150 = PLANE('',#1151);
+#1151 = AXIS2_PLACEMENT_3D('',#1152,#1153,#1154);
+#1152 = CARTESIAN_POINT('',(-3.6725,11.705,0.));
+#1153 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#1154 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#1155 = DEFINITIONAL_REPRESENTATION('',(#1156),#1160);
+#1156 = LINE('',#1157,#1158);
+#1157 = CARTESIAN_POINT('',(0.,-0.275));
+#1158 = VECTOR('',#1159,1.);
+#1159 = DIRECTION('',(1.,0.));
+#1160 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1161 = ORIENTED_EDGE('',*,*,#1162,.T.);
+#1162 = EDGE_CURVE('',#1135,#1163,#1165,.T.);
+#1163 = VERTEX_POINT('',#1164);
+#1164 = CARTESIAN_POINT('',(-3.9475,11.98,2.4225));
+#1165 = SURFACE_CURVE('',#1166,(#1170,#1177),.PCURVE_S1.);
+#1166 = LINE('',#1167,#1168);
+#1167 = CARTESIAN_POINT('',(-3.9475,11.98,0.275));
+#1168 = VECTOR('',#1169,1.);
+#1169 = DIRECTION('',(0.,0.,1.));
+#1170 = PCURVE('',#998,#1171);
+#1171 = DEFINITIONAL_REPRESENTATION('',(#1172),#1176);
+#1172 = LINE('',#1173,#1174);
+#1173 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#1174 = VECTOR('',#1175,1.);
+#1175 = DIRECTION('',(0.,1.));
+#1176 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1177 = PCURVE('',#1178,#1183);
+#1178 = PLANE('',#1179);
+#1179 = AXIS2_PLACEMENT_3D('',#1180,#1181,#1182);
+#1180 = CARTESIAN_POINT('',(-3.724778209321,11.98,1.581028209321));
+#1181 = DIRECTION('',(2.616880222009E-29,1.,-2.312216259511E-30));
+#1182 = DIRECTION('',(1.,-2.616880222009E-29,0.));
+#1183 = DEFINITIONAL_REPRESENTATION('',(#1184),#1188);
+#1184 = LINE('',#1185,#1186);
+#1185 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#1186 = VECTOR('',#1187,1.);
+#1187 = DIRECTION('',(0.,-1.));
+#1188 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1189 = ORIENTED_EDGE('',*,*,#1190,.T.);
+#1190 = EDGE_CURVE('',#1163,#988,#1191,.T.);
+#1191 = SURFACE_CURVE('',#1192,(#1196,#1203),.PCURVE_S1.);
+#1192 = LINE('',#1193,#1194);
+#1193 = CARTESIAN_POINT('',(-3.9475,11.98,2.4225));
+#1194 = VECTOR('',#1195,1.);
+#1195 = DIRECTION('',(0.,-1.,0.));
+#1196 = PCURVE('',#998,#1197);
+#1197 = DEFINITIONAL_REPRESENTATION('',(#1198),#1202);
+#1198 = LINE('',#1199,#1200);
+#1199 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#1200 = VECTOR('',#1201,1.);
+#1201 = DIRECTION('',(-1.,2.226071387182E-62));
+#1202 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1203 = PCURVE('',#1204,#1209);
+#1204 = CYLINDRICAL_SURFACE('',#1205,0.1375);
+#1205 = AXIS2_PLACEMENT_3D('',#1206,#1207,#1208);
+#1206 = CARTESIAN_POINT('',(-3.81,11.98,2.4225));
+#1207 = DIRECTION('',(0.,-1.,0.));
+#1208 = DIRECTION('',(-1.,-0.,-9.8088568672E-33));
+#1209 = DEFINITIONAL_REPRESENTATION('',(#1210),#1214);
+#1210 = LINE('',#1211,#1212);
+#1211 = CARTESIAN_POINT('',(-0.,0.));
+#1212 = VECTOR('',#1213,1.);
+#1213 = DIRECTION('',(-0.,1.));
+#1214 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1215 = ADVANCED_FACE('',(#1216),#1010,.T.);
+#1216 = FACE_BOUND('',#1217,.T.);
+#1217 = EDGE_LOOP('',(#1218,#1248,#1274,#1275,#1298,#1326,#1354));
+#1218 = ORIENTED_EDGE('',*,*,#1219,.T.);
+#1219 = EDGE_CURVE('',#1220,#1222,#1224,.T.);
+#1220 = VERTEX_POINT('',#1221);
+#1221 = CARTESIAN_POINT('',(-3.175,10.88,2.56));
+#1222 = VERTEX_POINT('',#1223);
+#1223 = CARTESIAN_POINT('',(-3.81,10.88,2.56));
+#1224 = SURFACE_CURVE('',#1225,(#1229,#1236),.PCURVE_S1.);
+#1225 = LINE('',#1226,#1227);
+#1226 = CARTESIAN_POINT('',(-3.6725,10.88,2.56));
+#1227 = VECTOR('',#1228,1.);
+#1228 = DIRECTION('',(-1.,0.,0.));
+#1229 = PCURVE('',#1010,#1230);
+#1230 = DEFINITIONAL_REPRESENTATION('',(#1231),#1235);
+#1231 = LINE('',#1232,#1233);
+#1232 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#1233 = VECTOR('',#1234,1.);
+#1234 = DIRECTION('',(1.,1.676027028956E-59));
+#1235 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1236 = PCURVE('',#1237,#1242);
+#1237 = PLANE('',#1238);
+#1238 = AXIS2_PLACEMENT_3D('',#1239,#1240,#1241);
+#1239 = CARTESIAN_POINT('',(-3.56125,11.43,2.56));
+#1240 = DIRECTION('',(1.601195610168E-30,3.925633828627E-30,1.));
+#1241 = DIRECTION('',(0.,1.,-3.925633828627E-30));
+#1242 = DEFINITIONAL_REPRESENTATION('',(#1243),#1247);
+#1243 = LINE('',#1244,#1245);
+#1244 = CARTESIAN_POINT('',(-0.55,0.11125));
+#1245 = VECTOR('',#1246,1.);
+#1246 = DIRECTION('',(0.,1.));
+#1247 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1248 = ORIENTED_EDGE('',*,*,#1249,.F.);
+#1249 = EDGE_CURVE('',#988,#1222,#1250,.T.);
+#1250 = SURFACE_CURVE('',#1251,(#1256,#1267),.PCURVE_S1.);
+#1251 = CIRCLE('',#1252,0.1375);
+#1252 = AXIS2_PLACEMENT_3D('',#1253,#1254,#1255);
+#1253 = CARTESIAN_POINT('',(-3.81,10.88,2.4225));
+#1254 = DIRECTION('',(-0.,1.,0.));
+#1255 = DIRECTION('',(0.,0.,-1.));
+#1256 = PCURVE('',#1010,#1257);
+#1257 = DEFINITIONAL_REPRESENTATION('',(#1258),#1266);
+#1258 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#1259,#1260,#1261,#1262,
+#1263,#1264,#1265),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2
+ ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786,
+6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE()
+GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,
+1.,0.5,1.)) REPRESENTATION_ITEM('') );
+#1259 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#1260 = CARTESIAN_POINT('',(0.323378776719,-0.703971790679));
+#1261 = CARTESIAN_POINT('',(0.204300283699,-0.910221790679));
+#1262 = CARTESIAN_POINT('',(8.522179067866E-02,-1.116471790679));
+#1263 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.910221790679));
+#1264 = CARTESIAN_POINT('',(-0.152935195362,-0.703971790679));
+#1265 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#1266 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1267 = PCURVE('',#1204,#1268);
+#1268 = DEFINITIONAL_REPRESENTATION('',(#1269),#1273);
+#1269 = LINE('',#1270,#1271);
+#1270 = CARTESIAN_POINT('',(1.570796326795,1.1));
+#1271 = VECTOR('',#1272,1.);
+#1272 = DIRECTION('',(-1.,0.));
+#1273 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1274 = ORIENTED_EDGE('',*,*,#987,.T.);
+#1275 = ORIENTED_EDGE('',*,*,#1276,.F.);
+#1276 = EDGE_CURVE('',#1277,#990,#1279,.T.);
+#1277 = VERTEX_POINT('',#1278);
+#1278 = CARTESIAN_POINT('',(-3.6725,10.88,0.275));
+#1279 = SURFACE_CURVE('',#1280,(#1284,#1291),.PCURVE_S1.);
+#1280 = LINE('',#1281,#1282);
+#1281 = CARTESIAN_POINT('',(-3.6725,10.88,0.275));
+#1282 = VECTOR('',#1283,1.);
+#1283 = DIRECTION('',(-1.,0.,0.));
+#1284 = PCURVE('',#1010,#1285);
+#1285 = DEFINITIONAL_REPRESENTATION('',(#1286),#1290);
+#1286 = LINE('',#1287,#1288);
+#1287 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#1288 = VECTOR('',#1289,1.);
+#1289 = DIRECTION('',(1.,1.676027028956E-59));
+#1290 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1291 = PCURVE('',#1038,#1292);
+#1292 = DEFINITIONAL_REPRESENTATION('',(#1293),#1297);
+#1293 = LINE('',#1294,#1295);
+#1294 = CARTESIAN_POINT('',(0.,0.));
+#1295 = VECTOR('',#1296,1.);
+#1296 = DIRECTION('',(0.,-1.));
+#1297 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1298 = ORIENTED_EDGE('',*,*,#1299,.F.);
+#1299 = EDGE_CURVE('',#1300,#1277,#1302,.T.);
+#1300 = VERTEX_POINT('',#1301);
+#1301 = CARTESIAN_POINT('',(-3.6725,10.88,2.285));
+#1302 = SURFACE_CURVE('',#1303,(#1307,#1314),.PCURVE_S1.);
+#1303 = LINE('',#1304,#1305);
+#1304 = CARTESIAN_POINT('',(-3.6725,10.88,2.56));
+#1305 = VECTOR('',#1306,1.);
+#1306 = DIRECTION('',(0.,0.,-1.));
+#1307 = PCURVE('',#1010,#1308);
+#1308 = DEFINITIONAL_REPRESENTATION('',(#1309),#1313);
+#1309 = LINE('',#1310,#1311);
+#1310 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#1311 = VECTOR('',#1312,1.);
+#1312 = DIRECTION('',(0.,1.));
+#1313 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1314 = PCURVE('',#1315,#1320);
+#1315 = PLANE('',#1316);
+#1316 = AXIS2_PLACEMENT_3D('',#1317,#1318,#1319);
+#1317 = CARTESIAN_POINT('',(-3.6725,11.43,-0.34105853382));
+#1318 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#1319 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#1320 = DEFINITIONAL_REPRESENTATION('',(#1321),#1325);
+#1321 = LINE('',#1322,#1323);
+#1322 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#1323 = VECTOR('',#1324,1.);
+#1324 = DIRECTION('',(0.,-1.));
+#1325 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1326 = ORIENTED_EDGE('',*,*,#1327,.T.);
+#1327 = EDGE_CURVE('',#1300,#1328,#1330,.T.);
+#1328 = VERTEX_POINT('',#1329);
+#1329 = CARTESIAN_POINT('',(-3.175,10.88,2.285));
+#1330 = SURFACE_CURVE('',#1331,(#1335,#1342),.PCURVE_S1.);
+#1331 = LINE('',#1332,#1333);
+#1332 = CARTESIAN_POINT('',(-3.6725,10.88,2.285));
+#1333 = VECTOR('',#1334,1.);
+#1334 = DIRECTION('',(1.,0.,0.));
+#1335 = PCURVE('',#1010,#1336);
+#1336 = DEFINITIONAL_REPRESENTATION('',(#1337),#1341);
+#1337 = LINE('',#1338,#1339);
+#1338 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.703971790679));
+#1339 = VECTOR('',#1340,1.);
+#1340 = DIRECTION('',(-1.,-1.676027028956E-59));
+#1341 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1342 = PCURVE('',#1343,#1348);
+#1343 = PLANE('',#1344);
+#1344 = AXIS2_PLACEMENT_3D('',#1345,#1346,#1347);
+#1345 = CARTESIAN_POINT('',(-3.6725,10.88,2.285));
+#1346 = DIRECTION('',(0.,0.,1.));
+#1347 = DIRECTION('',(1.,0.,0.));
+#1348 = DEFINITIONAL_REPRESENTATION('',(#1349),#1353);
+#1349 = LINE('',#1350,#1351);
+#1350 = CARTESIAN_POINT('',(0.,0.));
+#1351 = VECTOR('',#1352,1.);
+#1352 = DIRECTION('',(1.,0.));
+#1353 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1354 = ORIENTED_EDGE('',*,*,#1355,.T.);
+#1355 = EDGE_CURVE('',#1328,#1220,#1356,.T.);
+#1356 = SURFACE_CURVE('',#1357,(#1361,#1368),.PCURVE_S1.);
+#1357 = LINE('',#1358,#1359);
+#1358 = CARTESIAN_POINT('',(-3.175,10.88,2.285));
+#1359 = VECTOR('',#1360,1.);
+#1360 = DIRECTION('',(0.,0.,1.));
+#1361 = PCURVE('',#1010,#1362);
+#1362 = DEFINITIONAL_REPRESENTATION('',(#1363),#1367);
+#1363 = LINE('',#1364,#1365);
+#1364 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#1365 = VECTOR('',#1366,1.);
+#1366 = DIRECTION('',(0.,-1.));
+#1367 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1368 = PCURVE('',#1369,#1374);
+#1369 = PLANE('',#1370);
+#1370 = AXIS2_PLACEMENT_3D('',#1371,#1372,#1373);
+#1371 = CARTESIAN_POINT('',(-3.175,10.88,2.285));
+#1372 = DIRECTION('',(1.,0.,0.));
+#1373 = DIRECTION('',(0.,0.,1.));
+#1374 = DEFINITIONAL_REPRESENTATION('',(#1375),#1379);
+#1375 = LINE('',#1376,#1377);
+#1376 = CARTESIAN_POINT('',(0.,0.));
+#1377 = VECTOR('',#1378,1.);
+#1378 = DIRECTION('',(1.,0.));
+#1379 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1380 = ADVANCED_FACE('',(#1381),#1204,.T.);
+#1381 = FACE_BOUND('',#1382,.F.);
+#1382 = EDGE_LOOP('',(#1383,#1407,#1428,#1429));
+#1383 = ORIENTED_EDGE('',*,*,#1384,.T.);
+#1384 = EDGE_CURVE('',#1163,#1385,#1387,.T.);
+#1385 = VERTEX_POINT('',#1386);
+#1386 = CARTESIAN_POINT('',(-3.81,11.98,2.56));
+#1387 = SURFACE_CURVE('',#1388,(#1393,#1400),.PCURVE_S1.);
+#1388 = CIRCLE('',#1389,0.1375);
+#1389 = AXIS2_PLACEMENT_3D('',#1390,#1391,#1392);
+#1390 = CARTESIAN_POINT('',(-3.81,11.98,2.4225));
+#1391 = DIRECTION('',(-0.,1.,0.));
+#1392 = DIRECTION('',(0.,0.,-1.));
+#1393 = PCURVE('',#1204,#1394);
+#1394 = DEFINITIONAL_REPRESENTATION('',(#1395),#1399);
+#1395 = LINE('',#1396,#1397);
+#1396 = CARTESIAN_POINT('',(1.570796326795,3.552713678801E-15));
+#1397 = VECTOR('',#1398,1.);
+#1398 = DIRECTION('',(-1.,0.));
+#1399 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1400 = PCURVE('',#1178,#1401);
+#1401 = DEFINITIONAL_REPRESENTATION('',(#1402),#1406);
+#1402 = CIRCLE('',#1403,0.1375);
+#1403 = AXIS2_PLACEMENT_2D('',#1404,#1405);
+#1404 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#1405 = DIRECTION('',(0.,1.));
+#1406 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1407 = ORIENTED_EDGE('',*,*,#1408,.T.);
+#1408 = EDGE_CURVE('',#1385,#1222,#1409,.T.);
+#1409 = SURFACE_CURVE('',#1410,(#1414,#1421),.PCURVE_S1.);
+#1410 = LINE('',#1411,#1412);
+#1411 = CARTESIAN_POINT('',(-3.81,11.98,2.56));
+#1412 = VECTOR('',#1413,1.);
+#1413 = DIRECTION('',(0.,-1.,0.));
+#1414 = PCURVE('',#1204,#1415);
+#1415 = DEFINITIONAL_REPRESENTATION('',(#1416),#1420);
+#1416 = LINE('',#1417,#1418);
+#1417 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#1418 = VECTOR('',#1419,1.);
+#1419 = DIRECTION('',(-0.,1.));
+#1420 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1421 = PCURVE('',#1237,#1422);
+#1422 = DEFINITIONAL_REPRESENTATION('',(#1423),#1427);
+#1423 = LINE('',#1424,#1425);
+#1424 = CARTESIAN_POINT('',(0.55,0.24875));
+#1425 = VECTOR('',#1426,1.);
+#1426 = DIRECTION('',(-1.,-6.285707653525E-60));
+#1427 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1428 = ORIENTED_EDGE('',*,*,#1249,.F.);
+#1429 = ORIENTED_EDGE('',*,*,#1190,.F.);
+#1430 = ADVANCED_FACE('',(#1431),#1038,.T.);
+#1431 = FACE_BOUND('',#1432,.T.);
+#1432 = EDGE_LOOP('',(#1433,#1434,#1435,#1458));
+#1433 = ORIENTED_EDGE('',*,*,#1276,.T.);
+#1434 = ORIENTED_EDGE('',*,*,#1022,.T.);
+#1435 = ORIENTED_EDGE('',*,*,#1436,.F.);
+#1436 = EDGE_CURVE('',#1437,#1023,#1439,.T.);
+#1437 = VERTEX_POINT('',#1438);
+#1438 = CARTESIAN_POINT('',(-3.6725,11.155,0.));
+#1439 = SURFACE_CURVE('',#1440,(#1444,#1451),.PCURVE_S1.);
+#1440 = LINE('',#1441,#1442);
+#1441 = CARTESIAN_POINT('',(-3.6725,11.155,0.));
+#1442 = VECTOR('',#1443,1.);
+#1443 = DIRECTION('',(-1.,0.,0.));
+#1444 = PCURVE('',#1038,#1445);
+#1445 = DEFINITIONAL_REPRESENTATION('',(#1446),#1450);
+#1446 = LINE('',#1447,#1448);
+#1447 = CARTESIAN_POINT('',(0.388908729653,0.));
+#1448 = VECTOR('',#1449,1.);
+#1449 = DIRECTION('',(0.,-1.));
+#1450 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1451 = PCURVE('',#1066,#1452);
+#1452 = DEFINITIONAL_REPRESENTATION('',(#1453),#1457);
+#1453 = LINE('',#1454,#1455);
+#1454 = CARTESIAN_POINT('',(0.,0.));
+#1455 = VECTOR('',#1456,1.);
+#1456 = DIRECTION('',(0.,-1.));
+#1457 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1458 = ORIENTED_EDGE('',*,*,#1459,.F.);
+#1459 = EDGE_CURVE('',#1277,#1437,#1460,.T.);
+#1460 = SURFACE_CURVE('',#1461,(#1465,#1472),.PCURVE_S1.);
+#1461 = LINE('',#1462,#1463);
+#1462 = CARTESIAN_POINT('',(-3.6725,10.88,0.275));
+#1463 = VECTOR('',#1464,1.);
+#1464 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#1465 = PCURVE('',#1038,#1466);
+#1466 = DEFINITIONAL_REPRESENTATION('',(#1467),#1471);
+#1467 = LINE('',#1468,#1469);
+#1468 = CARTESIAN_POINT('',(0.,0.));
+#1469 = VECTOR('',#1470,1.);
+#1470 = DIRECTION('',(1.,0.));
+#1471 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1472 = PCURVE('',#1315,#1473);
+#1473 = DEFINITIONAL_REPRESENTATION('',(#1474),#1478);
+#1474 = LINE('',#1475,#1476);
+#1475 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#1476 = VECTOR('',#1477,1.);
+#1477 = DIRECTION('',(0.707106781187,-0.707106781187));
+#1478 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1479 = ADVANCED_FACE('',(#1480),#1178,.T.);
+#1480 = FACE_BOUND('',#1481,.T.);
+#1481 = EDGE_LOOP('',(#1482,#1483,#1484,#1507,#1530,#1553,#1576));
+#1482 = ORIENTED_EDGE('',*,*,#1162,.T.);
+#1483 = ORIENTED_EDGE('',*,*,#1384,.T.);
+#1484 = ORIENTED_EDGE('',*,*,#1485,.T.);
+#1485 = EDGE_CURVE('',#1385,#1486,#1488,.T.);
+#1486 = VERTEX_POINT('',#1487);
+#1487 = CARTESIAN_POINT('',(-3.175,11.98,2.56));
+#1488 = SURFACE_CURVE('',#1489,(#1493,#1500),.PCURVE_S1.);
+#1489 = LINE('',#1490,#1491);
+#1490 = CARTESIAN_POINT('',(-3.6725,11.98,2.56));
+#1491 = VECTOR('',#1492,1.);
+#1492 = DIRECTION('',(1.,0.,0.));
+#1493 = PCURVE('',#1178,#1494);
+#1494 = DEFINITIONAL_REPRESENTATION('',(#1495),#1499);
+#1495 = LINE('',#1496,#1497);
+#1496 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#1497 = VECTOR('',#1498,1.);
+#1498 = DIRECTION('',(1.,-6.050792998522E-59));
+#1499 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1500 = PCURVE('',#1237,#1501);
+#1501 = DEFINITIONAL_REPRESENTATION('',(#1502),#1506);
+#1502 = LINE('',#1503,#1504);
+#1503 = CARTESIAN_POINT('',(0.55,0.11125));
+#1504 = VECTOR('',#1505,1.);
+#1505 = DIRECTION('',(0.,-1.));
+#1506 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1507 = ORIENTED_EDGE('',*,*,#1508,.F.);
+#1508 = EDGE_CURVE('',#1509,#1486,#1511,.T.);
+#1509 = VERTEX_POINT('',#1510);
+#1510 = CARTESIAN_POINT('',(-3.175,11.98,2.285));
+#1511 = SURFACE_CURVE('',#1512,(#1516,#1523),.PCURVE_S1.);
+#1512 = LINE('',#1513,#1514);
+#1513 = CARTESIAN_POINT('',(-3.175,11.98,2.285));
+#1514 = VECTOR('',#1515,1.);
+#1515 = DIRECTION('',(0.,0.,1.));
+#1516 = PCURVE('',#1178,#1517);
+#1517 = DEFINITIONAL_REPRESENTATION('',(#1518),#1522);
+#1518 = LINE('',#1519,#1520);
+#1519 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#1520 = VECTOR('',#1521,1.);
+#1521 = DIRECTION('',(0.,-1.));
+#1522 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1523 = PCURVE('',#1369,#1524);
+#1524 = DEFINITIONAL_REPRESENTATION('',(#1525),#1529);
+#1525 = LINE('',#1526,#1527);
+#1526 = CARTESIAN_POINT('',(0.,-1.1));
+#1527 = VECTOR('',#1528,1.);
+#1528 = DIRECTION('',(1.,0.));
+#1529 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1530 = ORIENTED_EDGE('',*,*,#1531,.F.);
+#1531 = EDGE_CURVE('',#1532,#1509,#1534,.T.);
+#1532 = VERTEX_POINT('',#1533);
+#1533 = CARTESIAN_POINT('',(-3.6725,11.98,2.285));
+#1534 = SURFACE_CURVE('',#1535,(#1539,#1546),.PCURVE_S1.);
+#1535 = LINE('',#1536,#1537);
+#1536 = CARTESIAN_POINT('',(-3.6725,11.98,2.285));
+#1537 = VECTOR('',#1538,1.);
+#1538 = DIRECTION('',(1.,0.,0.));
+#1539 = PCURVE('',#1178,#1540);
+#1540 = DEFINITIONAL_REPRESENTATION('',(#1541),#1545);
+#1541 = LINE('',#1542,#1543);
+#1542 = CARTESIAN_POINT('',(5.227820932134E-02,-0.703971790679));
+#1543 = VECTOR('',#1544,1.);
+#1544 = DIRECTION('',(1.,-6.050792998522E-59));
+#1545 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1546 = PCURVE('',#1343,#1547);
+#1547 = DEFINITIONAL_REPRESENTATION('',(#1548),#1552);
+#1548 = LINE('',#1549,#1550);
+#1549 = CARTESIAN_POINT('',(0.,1.1));
+#1550 = VECTOR('',#1551,1.);
+#1551 = DIRECTION('',(1.,0.));
+#1552 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1553 = ORIENTED_EDGE('',*,*,#1554,.F.);
+#1554 = EDGE_CURVE('',#1555,#1532,#1557,.T.);
+#1555 = VERTEX_POINT('',#1556);
+#1556 = CARTESIAN_POINT('',(-3.6725,11.98,0.275));
+#1557 = SURFACE_CURVE('',#1558,(#1562,#1569),.PCURVE_S1.);
+#1558 = LINE('',#1559,#1560);
+#1559 = CARTESIAN_POINT('',(-3.6725,11.98,0.275));
+#1560 = VECTOR('',#1561,1.);
+#1561 = DIRECTION('',(0.,0.,1.));
+#1562 = PCURVE('',#1178,#1563);
+#1563 = DEFINITIONAL_REPRESENTATION('',(#1564),#1568);
+#1564 = LINE('',#1565,#1566);
+#1565 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#1566 = VECTOR('',#1567,1.);
+#1567 = DIRECTION('',(0.,-1.));
+#1568 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1569 = PCURVE('',#1315,#1570);
+#1570 = DEFINITIONAL_REPRESENTATION('',(#1571),#1575);
+#1571 = LINE('',#1572,#1573);
+#1572 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#1573 = VECTOR('',#1574,1.);
+#1574 = DIRECTION('',(0.,1.));
+#1575 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1576 = ORIENTED_EDGE('',*,*,#1577,.T.);
+#1577 = EDGE_CURVE('',#1555,#1135,#1578,.T.);
+#1578 = SURFACE_CURVE('',#1579,(#1583,#1590),.PCURVE_S1.);
+#1579 = LINE('',#1580,#1581);
+#1580 = CARTESIAN_POINT('',(-3.6725,11.98,0.275));
+#1581 = VECTOR('',#1582,1.);
+#1582 = DIRECTION('',(-1.,0.,0.));
+#1583 = PCURVE('',#1178,#1584);
+#1584 = DEFINITIONAL_REPRESENTATION('',(#1585),#1589);
+#1585 = LINE('',#1586,#1587);
+#1586 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#1587 = VECTOR('',#1588,1.);
+#1588 = DIRECTION('',(-1.,6.050792998522E-59));
+#1589 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1590 = PCURVE('',#1150,#1591);
+#1591 = DEFINITIONAL_REPRESENTATION('',(#1592),#1596);
+#1592 = LINE('',#1593,#1594);
+#1593 = CARTESIAN_POINT('',(0.388908729653,0.));
+#1594 = VECTOR('',#1595,1.);
+#1595 = DIRECTION('',(0.,-1.));
+#1596 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1597 = ADVANCED_FACE('',(#1598),#1066,.T.);
+#1598 = FACE_BOUND('',#1599,.T.);
+#1599 = EDGE_LOOP('',(#1600,#1601,#1602,#1625));
+#1600 = ORIENTED_EDGE('',*,*,#1436,.T.);
+#1601 = ORIENTED_EDGE('',*,*,#1050,.T.);
+#1602 = ORIENTED_EDGE('',*,*,#1603,.F.);
+#1603 = EDGE_CURVE('',#1604,#1051,#1606,.T.);
+#1604 = VERTEX_POINT('',#1605);
+#1605 = CARTESIAN_POINT('',(-3.6725,11.155,-3.5));
+#1606 = SURFACE_CURVE('',#1607,(#1611,#1618),.PCURVE_S1.);
+#1607 = LINE('',#1608,#1609);
+#1608 = CARTESIAN_POINT('',(-3.6725,11.155,-3.5));
+#1609 = VECTOR('',#1610,1.);
+#1610 = DIRECTION('',(-1.,0.,0.));
+#1611 = PCURVE('',#1066,#1612);
+#1612 = DEFINITIONAL_REPRESENTATION('',(#1613),#1617);
+#1613 = LINE('',#1614,#1615);
+#1614 = CARTESIAN_POINT('',(3.5,0.));
+#1615 = VECTOR('',#1616,1.);
+#1616 = DIRECTION('',(0.,-1.));
+#1617 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1618 = PCURVE('',#1094,#1619);
+#1619 = DEFINITIONAL_REPRESENTATION('',(#1620),#1624);
+#1620 = LINE('',#1621,#1622);
+#1621 = CARTESIAN_POINT('',(3.330669073875E-16,0.));
+#1622 = VECTOR('',#1623,1.);
+#1623 = DIRECTION('',(0.,-1.));
+#1624 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1625 = ORIENTED_EDGE('',*,*,#1626,.F.);
+#1626 = EDGE_CURVE('',#1437,#1604,#1627,.T.);
+#1627 = SURFACE_CURVE('',#1628,(#1632,#1639),.PCURVE_S1.);
+#1628 = LINE('',#1629,#1630);
+#1629 = CARTESIAN_POINT('',(-3.6725,11.155,0.));
+#1630 = VECTOR('',#1631,1.);
+#1631 = DIRECTION('',(0.,0.,-1.));
+#1632 = PCURVE('',#1066,#1633);
+#1633 = DEFINITIONAL_REPRESENTATION('',(#1634),#1638);
+#1634 = LINE('',#1635,#1636);
+#1635 = CARTESIAN_POINT('',(0.,0.));
+#1636 = VECTOR('',#1637,1.);
+#1637 = DIRECTION('',(1.,0.));
+#1638 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1639 = PCURVE('',#1315,#1640);
+#1640 = DEFINITIONAL_REPRESENTATION('',(#1641),#1645);
+#1641 = LINE('',#1642,#1643);
+#1642 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#1643 = VECTOR('',#1644,1.);
+#1644 = DIRECTION('',(0.,-1.));
+#1645 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1646 = ADVANCED_FACE('',(#1647),#1150,.T.);
+#1647 = FACE_BOUND('',#1648,.T.);
+#1648 = EDGE_LOOP('',(#1649,#1672,#1673,#1674));
+#1649 = ORIENTED_EDGE('',*,*,#1650,.T.);
+#1650 = EDGE_CURVE('',#1651,#1107,#1653,.T.);
+#1651 = VERTEX_POINT('',#1652);
+#1652 = CARTESIAN_POINT('',(-3.6725,11.705,0.));
+#1653 = SURFACE_CURVE('',#1654,(#1658,#1665),.PCURVE_S1.);
+#1654 = LINE('',#1655,#1656);
+#1655 = CARTESIAN_POINT('',(-3.6725,11.705,0.));
+#1656 = VECTOR('',#1657,1.);
+#1657 = DIRECTION('',(-1.,0.,0.));
+#1658 = PCURVE('',#1150,#1659);
+#1659 = DEFINITIONAL_REPRESENTATION('',(#1660),#1664);
+#1660 = LINE('',#1661,#1662);
+#1661 = CARTESIAN_POINT('',(-6.280369834735E-16,0.));
+#1662 = VECTOR('',#1663,1.);
+#1663 = DIRECTION('',(0.,-1.));
+#1664 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1665 = PCURVE('',#1122,#1666);
+#1666 = DEFINITIONAL_REPRESENTATION('',(#1667),#1671);
+#1667 = LINE('',#1668,#1669);
+#1668 = CARTESIAN_POINT('',(3.5,0.));
+#1669 = VECTOR('',#1670,1.);
+#1670 = DIRECTION('',(0.,-1.));
+#1671 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1672 = ORIENTED_EDGE('',*,*,#1134,.T.);
+#1673 = ORIENTED_EDGE('',*,*,#1577,.F.);
+#1674 = ORIENTED_EDGE('',*,*,#1675,.F.);
+#1675 = EDGE_CURVE('',#1651,#1555,#1676,.T.);
+#1676 = SURFACE_CURVE('',#1677,(#1681,#1688),.PCURVE_S1.);
+#1677 = LINE('',#1678,#1679);
+#1678 = CARTESIAN_POINT('',(-3.6725,11.705,0.));
+#1679 = VECTOR('',#1680,1.);
+#1680 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#1681 = PCURVE('',#1150,#1682);
+#1682 = DEFINITIONAL_REPRESENTATION('',(#1683),#1687);
+#1683 = LINE('',#1684,#1685);
+#1684 = CARTESIAN_POINT('',(0.,0.));
+#1685 = VECTOR('',#1686,1.);
+#1686 = DIRECTION('',(1.,0.));
+#1687 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1688 = PCURVE('',#1315,#1689);
+#1689 = DEFINITIONAL_REPRESENTATION('',(#1690),#1694);
+#1690 = LINE('',#1691,#1692);
+#1691 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#1692 = VECTOR('',#1693,1.);
+#1693 = DIRECTION('',(0.707106781187,0.707106781187));
+#1694 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1695 = ADVANCED_FACE('',(#1696),#1094,.T.);
+#1696 = FACE_BOUND('',#1697,.T.);
+#1697 = EDGE_LOOP('',(#1698,#1699,#1700,#1723));
+#1698 = ORIENTED_EDGE('',*,*,#1603,.T.);
+#1699 = ORIENTED_EDGE('',*,*,#1078,.T.);
+#1700 = ORIENTED_EDGE('',*,*,#1701,.F.);
+#1701 = EDGE_CURVE('',#1702,#1079,#1704,.T.);
+#1702 = VERTEX_POINT('',#1703);
+#1703 = CARTESIAN_POINT('',(-3.6725,11.705,-3.5));
+#1704 = SURFACE_CURVE('',#1705,(#1709,#1716),.PCURVE_S1.);
+#1705 = LINE('',#1706,#1707);
+#1706 = CARTESIAN_POINT('',(-3.6725,11.705,-3.5));
+#1707 = VECTOR('',#1708,1.);
+#1708 = DIRECTION('',(-1.,0.,0.));
+#1709 = PCURVE('',#1094,#1710);
+#1710 = DEFINITIONAL_REPRESENTATION('',(#1711),#1715);
+#1711 = LINE('',#1712,#1713);
+#1712 = CARTESIAN_POINT('',(0.55,0.));
+#1713 = VECTOR('',#1714,1.);
+#1714 = DIRECTION('',(0.,-1.));
+#1715 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1716 = PCURVE('',#1122,#1717);
+#1717 = DEFINITIONAL_REPRESENTATION('',(#1718),#1722);
+#1718 = LINE('',#1719,#1720);
+#1719 = CARTESIAN_POINT('',(0.,0.));
+#1720 = VECTOR('',#1721,1.);
+#1721 = DIRECTION('',(0.,-1.));
+#1722 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1723 = ORIENTED_EDGE('',*,*,#1724,.F.);
+#1724 = EDGE_CURVE('',#1604,#1702,#1725,.T.);
+#1725 = SURFACE_CURVE('',#1726,(#1730,#1737),.PCURVE_S1.);
+#1726 = LINE('',#1727,#1728);
+#1727 = CARTESIAN_POINT('',(-3.6725,11.155,-3.5));
+#1728 = VECTOR('',#1729,1.);
+#1729 = DIRECTION('',(0.,1.,0.));
+#1730 = PCURVE('',#1094,#1731);
+#1731 = DEFINITIONAL_REPRESENTATION('',(#1732),#1736);
+#1732 = LINE('',#1733,#1734);
+#1733 = CARTESIAN_POINT('',(0.,0.));
+#1734 = VECTOR('',#1735,1.);
+#1735 = DIRECTION('',(1.,0.));
+#1736 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1737 = PCURVE('',#1315,#1738);
+#1738 = DEFINITIONAL_REPRESENTATION('',(#1739),#1743);
+#1739 = LINE('',#1740,#1741);
+#1740 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#1741 = VECTOR('',#1742,1.);
+#1742 = DIRECTION('',(1.,-2.226071387182E-62));
+#1743 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1744 = ADVANCED_FACE('',(#1745),#1122,.T.);
+#1745 = FACE_BOUND('',#1746,.T.);
+#1746 = EDGE_LOOP('',(#1747,#1748,#1749,#1750));
+#1747 = ORIENTED_EDGE('',*,*,#1701,.T.);
+#1748 = ORIENTED_EDGE('',*,*,#1106,.T.);
+#1749 = ORIENTED_EDGE('',*,*,#1650,.F.);
+#1750 = ORIENTED_EDGE('',*,*,#1751,.F.);
+#1751 = EDGE_CURVE('',#1702,#1651,#1752,.T.);
+#1752 = SURFACE_CURVE('',#1753,(#1757,#1764),.PCURVE_S1.);
+#1753 = LINE('',#1754,#1755);
+#1754 = CARTESIAN_POINT('',(-3.6725,11.705,-3.5));
+#1755 = VECTOR('',#1756,1.);
+#1756 = DIRECTION('',(0.,0.,1.));
+#1757 = PCURVE('',#1122,#1758);
+#1758 = DEFINITIONAL_REPRESENTATION('',(#1759),#1763);
+#1759 = LINE('',#1760,#1761);
+#1760 = CARTESIAN_POINT('',(0.,0.));
+#1761 = VECTOR('',#1762,1.);
+#1762 = DIRECTION('',(1.,0.));
+#1763 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1764 = PCURVE('',#1315,#1765);
+#1765 = DEFINITIONAL_REPRESENTATION('',(#1766),#1770);
+#1766 = LINE('',#1767,#1768);
+#1767 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#1768 = VECTOR('',#1769,1.);
+#1769 = DIRECTION('',(0.,1.));
+#1770 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1771 = ADVANCED_FACE('',(#1772),#1237,.T.);
+#1772 = FACE_BOUND('',#1773,.T.);
+#1773 = EDGE_LOOP('',(#1774,#1775,#1796,#1797));
+#1774 = ORIENTED_EDGE('',*,*,#1219,.F.);
+#1775 = ORIENTED_EDGE('',*,*,#1776,.T.);
+#1776 = EDGE_CURVE('',#1220,#1486,#1777,.T.);
+#1777 = SURFACE_CURVE('',#1778,(#1782,#1789),.PCURVE_S1.);
+#1778 = LINE('',#1779,#1780);
+#1779 = CARTESIAN_POINT('',(-3.175,10.88,2.56));
+#1780 = VECTOR('',#1781,1.);
+#1781 = DIRECTION('',(0.,1.,0.));
+#1782 = PCURVE('',#1237,#1783);
+#1783 = DEFINITIONAL_REPRESENTATION('',(#1784),#1788);
+#1784 = LINE('',#1785,#1786);
+#1785 = CARTESIAN_POINT('',(-0.55,-0.38625));
+#1786 = VECTOR('',#1787,1.);
+#1787 = DIRECTION('',(1.,6.285707653525E-60));
+#1788 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1789 = PCURVE('',#1369,#1790);
+#1790 = DEFINITIONAL_REPRESENTATION('',(#1791),#1795);
+#1791 = LINE('',#1792,#1793);
+#1792 = CARTESIAN_POINT('',(0.275,0.));
+#1793 = VECTOR('',#1794,1.);
+#1794 = DIRECTION('',(0.,-1.));
+#1795 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1796 = ORIENTED_EDGE('',*,*,#1485,.F.);
+#1797 = ORIENTED_EDGE('',*,*,#1408,.T.);
+#1798 = ADVANCED_FACE('',(#1799),#1369,.T.);
+#1799 = FACE_BOUND('',#1800,.T.);
+#1800 = EDGE_LOOP('',(#1801,#1802,#1823,#1824));
+#1801 = ORIENTED_EDGE('',*,*,#1355,.F.);
+#1802 = ORIENTED_EDGE('',*,*,#1803,.T.);
+#1803 = EDGE_CURVE('',#1328,#1509,#1804,.T.);
+#1804 = SURFACE_CURVE('',#1805,(#1809,#1816),.PCURVE_S1.);
+#1805 = LINE('',#1806,#1807);
+#1806 = CARTESIAN_POINT('',(-3.175,10.88,2.285));
+#1807 = VECTOR('',#1808,1.);
+#1808 = DIRECTION('',(0.,1.,0.));
+#1809 = PCURVE('',#1369,#1810);
+#1810 = DEFINITIONAL_REPRESENTATION('',(#1811),#1815);
+#1811 = LINE('',#1812,#1813);
+#1812 = CARTESIAN_POINT('',(0.,0.));
+#1813 = VECTOR('',#1814,1.);
+#1814 = DIRECTION('',(0.,-1.));
+#1815 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1816 = PCURVE('',#1343,#1817);
+#1817 = DEFINITIONAL_REPRESENTATION('',(#1818),#1822);
+#1818 = LINE('',#1819,#1820);
+#1819 = CARTESIAN_POINT('',(0.4975,0.));
+#1820 = VECTOR('',#1821,1.);
+#1821 = DIRECTION('',(0.,1.));
+#1822 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1823 = ORIENTED_EDGE('',*,*,#1508,.T.);
+#1824 = ORIENTED_EDGE('',*,*,#1776,.F.);
+#1825 = ADVANCED_FACE('',(#1826),#1343,.F.);
+#1826 = FACE_BOUND('',#1827,.F.);
+#1827 = EDGE_LOOP('',(#1828,#1849,#1850,#1851));
+#1828 = ORIENTED_EDGE('',*,*,#1829,.F.);
+#1829 = EDGE_CURVE('',#1300,#1532,#1830,.T.);
+#1830 = SURFACE_CURVE('',#1831,(#1835,#1842),.PCURVE_S1.);
+#1831 = LINE('',#1832,#1833);
+#1832 = CARTESIAN_POINT('',(-3.6725,10.88,2.285));
+#1833 = VECTOR('',#1834,1.);
+#1834 = DIRECTION('',(0.,1.,0.));
+#1835 = PCURVE('',#1343,#1836);
+#1836 = DEFINITIONAL_REPRESENTATION('',(#1837),#1841);
+#1837 = LINE('',#1838,#1839);
+#1838 = CARTESIAN_POINT('',(0.,0.));
+#1839 = VECTOR('',#1840,1.);
+#1840 = DIRECTION('',(0.,1.));
+#1841 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1842 = PCURVE('',#1315,#1843);
+#1843 = DEFINITIONAL_REPRESENTATION('',(#1844),#1848);
+#1844 = LINE('',#1845,#1846);
+#1845 = CARTESIAN_POINT('',(-0.55,2.62605853382));
+#1846 = VECTOR('',#1847,1.);
+#1847 = DIRECTION('',(1.,-2.226071387182E-62));
+#1848 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1849 = ORIENTED_EDGE('',*,*,#1327,.T.);
+#1850 = ORIENTED_EDGE('',*,*,#1803,.T.);
+#1851 = ORIENTED_EDGE('',*,*,#1531,.F.);
+#1852 = ADVANCED_FACE('',(#1853),#1315,.T.);
+#1853 = FACE_BOUND('',#1854,.T.);
+#1854 = EDGE_LOOP('',(#1855,#1856,#1857,#1858,#1859,#1860,#1861,#1862));
+#1855 = ORIENTED_EDGE('',*,*,#1554,.T.);
+#1856 = ORIENTED_EDGE('',*,*,#1829,.F.);
+#1857 = ORIENTED_EDGE('',*,*,#1299,.T.);
+#1858 = ORIENTED_EDGE('',*,*,#1459,.T.);
+#1859 = ORIENTED_EDGE('',*,*,#1626,.T.);
+#1860 = ORIENTED_EDGE('',*,*,#1724,.T.);
+#1861 = ORIENTED_EDGE('',*,*,#1751,.T.);
+#1862 = ORIENTED_EDGE('',*,*,#1675,.T.);
+#1863 = MANIFOLD_SOLID_BREP('',#1864);
+#1864 = CLOSED_SHELL('',(#1865,#2097,#2262,#2312,#2361,#2479,#2528,#2577
+ ,#2626,#2653,#2680,#2707,#2734));
+#1865 = ADVANCED_FACE('',(#1866),#1880,.F.);
+#1866 = FACE_BOUND('',#1867,.F.);
+#1867 = EDGE_LOOP('',(#1868,#1903,#1931,#1959,#1987,#2015,#2043,#2071));
+#1868 = ORIENTED_EDGE('',*,*,#1869,.T.);
+#1869 = EDGE_CURVE('',#1870,#1872,#1874,.T.);
+#1870 = VERTEX_POINT('',#1871);
+#1871 = CARTESIAN_POINT('',(3.9475,11.98,2.4225));
+#1872 = VERTEX_POINT('',#1873);
+#1873 = CARTESIAN_POINT('',(3.9475,11.98,0.275));
+#1874 = SURFACE_CURVE('',#1875,(#1879,#1891),.PCURVE_S1.);
+#1875 = LINE('',#1876,#1877);
+#1876 = CARTESIAN_POINT('',(3.9475,11.98,2.56));
+#1877 = VECTOR('',#1878,1.);
+#1878 = DIRECTION('',(0.,0.,-1.));
+#1879 = PCURVE('',#1880,#1885);
+#1880 = PLANE('',#1881);
+#1881 = AXIS2_PLACEMENT_3D('',#1882,#1883,#1884);
+#1882 = CARTESIAN_POINT('',(3.9475,11.43,-0.34105853382));
+#1883 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#1884 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#1885 = DEFINITIONAL_REPRESENTATION('',(#1886),#1890);
+#1886 = LINE('',#1887,#1888);
+#1887 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#1888 = VECTOR('',#1889,1.);
+#1889 = DIRECTION('',(0.,-1.));
+#1890 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1891 = PCURVE('',#1892,#1897);
+#1892 = PLANE('',#1893);
+#1893 = AXIS2_PLACEMENT_3D('',#1894,#1895,#1896);
+#1894 = CARTESIAN_POINT('',(3.724778209321,11.98,1.581028209321));
+#1895 = DIRECTION('',(3.17453643318E-29,1.,2.111838454822E-30));
+#1896 = DIRECTION('',(1.,-3.17453643318E-29,0.));
+#1897 = DEFINITIONAL_REPRESENTATION('',(#1898),#1902);
+#1898 = LINE('',#1899,#1900);
+#1899 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#1900 = VECTOR('',#1901,1.);
+#1901 = DIRECTION('',(0.,1.));
+#1902 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1903 = ORIENTED_EDGE('',*,*,#1904,.T.);
+#1904 = EDGE_CURVE('',#1872,#1905,#1907,.T.);
+#1905 = VERTEX_POINT('',#1906);
+#1906 = CARTESIAN_POINT('',(3.9475,11.705,0.));
+#1907 = SURFACE_CURVE('',#1908,(#1912,#1919),.PCURVE_S1.);
+#1908 = LINE('',#1909,#1910);
+#1909 = CARTESIAN_POINT('',(3.9475,11.98,0.275));
+#1910 = VECTOR('',#1911,1.);
+#1911 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#1912 = PCURVE('',#1880,#1913);
+#1913 = DEFINITIONAL_REPRESENTATION('',(#1914),#1918);
+#1914 = LINE('',#1915,#1916);
+#1915 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#1916 = VECTOR('',#1917,1.);
+#1917 = DIRECTION('',(0.707106781187,-0.707106781187));
+#1918 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1919 = PCURVE('',#1920,#1925);
+#1920 = PLANE('',#1921);
+#1921 = AXIS2_PLACEMENT_3D('',#1922,#1923,#1924);
+#1922 = CARTESIAN_POINT('',(3.6725,11.98,0.275));
+#1923 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#1924 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#1925 = DEFINITIONAL_REPRESENTATION('',(#1926),#1930);
+#1926 = LINE('',#1927,#1928);
+#1927 = CARTESIAN_POINT('',(0.,-0.275));
+#1928 = VECTOR('',#1929,1.);
+#1929 = DIRECTION('',(1.,0.));
+#1930 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1931 = ORIENTED_EDGE('',*,*,#1932,.T.);
+#1932 = EDGE_CURVE('',#1905,#1933,#1935,.T.);
+#1933 = VERTEX_POINT('',#1934);
+#1934 = CARTESIAN_POINT('',(3.9475,11.705,-3.5));
+#1935 = SURFACE_CURVE('',#1936,(#1940,#1947),.PCURVE_S1.);
+#1936 = LINE('',#1937,#1938);
+#1937 = CARTESIAN_POINT('',(3.9475,11.705,0.));
+#1938 = VECTOR('',#1939,1.);
+#1939 = DIRECTION('',(0.,0.,-1.));
+#1940 = PCURVE('',#1880,#1941);
+#1941 = DEFINITIONAL_REPRESENTATION('',(#1942),#1946);
+#1942 = LINE('',#1943,#1944);
+#1943 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#1944 = VECTOR('',#1945,1.);
+#1945 = DIRECTION('',(0.,-1.));
+#1946 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1947 = PCURVE('',#1948,#1953);
+#1948 = PLANE('',#1949);
+#1949 = AXIS2_PLACEMENT_3D('',#1950,#1951,#1952);
+#1950 = CARTESIAN_POINT('',(3.6725,11.705,0.));
+#1951 = DIRECTION('',(0.,1.,0.));
+#1952 = DIRECTION('',(0.,0.,-1.));
+#1953 = DEFINITIONAL_REPRESENTATION('',(#1954),#1958);
+#1954 = LINE('',#1955,#1956);
+#1955 = CARTESIAN_POINT('',(0.,-0.275));
+#1956 = VECTOR('',#1957,1.);
+#1957 = DIRECTION('',(1.,0.));
+#1958 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1959 = ORIENTED_EDGE('',*,*,#1960,.T.);
+#1960 = EDGE_CURVE('',#1933,#1961,#1963,.T.);
+#1961 = VERTEX_POINT('',#1962);
+#1962 = CARTESIAN_POINT('',(3.9475,11.155,-3.5));
+#1963 = SURFACE_CURVE('',#1964,(#1968,#1975),.PCURVE_S1.);
+#1964 = LINE('',#1965,#1966);
+#1965 = CARTESIAN_POINT('',(3.9475,11.705,-3.5));
+#1966 = VECTOR('',#1967,1.);
+#1967 = DIRECTION('',(0.,-1.,0.));
+#1968 = PCURVE('',#1880,#1969);
+#1969 = DEFINITIONAL_REPRESENTATION('',(#1970),#1974);
+#1970 = LINE('',#1971,#1972);
+#1971 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#1972 = VECTOR('',#1973,1.);
+#1973 = DIRECTION('',(1.,2.226071387182E-62));
+#1974 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1975 = PCURVE('',#1976,#1981);
+#1976 = PLANE('',#1977);
+#1977 = AXIS2_PLACEMENT_3D('',#1978,#1979,#1980);
+#1978 = CARTESIAN_POINT('',(3.6725,11.705,-3.5));
+#1979 = DIRECTION('',(0.,0.,-1.));
+#1980 = DIRECTION('',(0.,-1.,0.));
+#1981 = DEFINITIONAL_REPRESENTATION('',(#1982),#1986);
+#1982 = LINE('',#1983,#1984);
+#1983 = CARTESIAN_POINT('',(0.,-0.275));
+#1984 = VECTOR('',#1985,1.);
+#1985 = DIRECTION('',(1.,0.));
+#1986 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#1987 = ORIENTED_EDGE('',*,*,#1988,.T.);
+#1988 = EDGE_CURVE('',#1961,#1989,#1991,.T.);
+#1989 = VERTEX_POINT('',#1990);
+#1990 = CARTESIAN_POINT('',(3.9475,11.155,0.));
+#1991 = SURFACE_CURVE('',#1992,(#1996,#2003),.PCURVE_S1.);
+#1992 = LINE('',#1993,#1994);
+#1993 = CARTESIAN_POINT('',(3.9475,11.155,-3.5));
+#1994 = VECTOR('',#1995,1.);
+#1995 = DIRECTION('',(0.,0.,1.));
+#1996 = PCURVE('',#1880,#1997);
+#1997 = DEFINITIONAL_REPRESENTATION('',(#1998),#2002);
+#1998 = LINE('',#1999,#2000);
+#1999 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#2000 = VECTOR('',#2001,1.);
+#2001 = DIRECTION('',(0.,1.));
+#2002 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2003 = PCURVE('',#2004,#2009);
+#2004 = PLANE('',#2005);
+#2005 = AXIS2_PLACEMENT_3D('',#2006,#2007,#2008);
+#2006 = CARTESIAN_POINT('',(3.6725,11.155,-3.5));
+#2007 = DIRECTION('',(0.,-1.,0.));
+#2008 = DIRECTION('',(0.,0.,1.));
+#2009 = DEFINITIONAL_REPRESENTATION('',(#2010),#2014);
+#2010 = LINE('',#2011,#2012);
+#2011 = CARTESIAN_POINT('',(0.,-0.275));
+#2012 = VECTOR('',#2013,1.);
+#2013 = DIRECTION('',(1.,0.));
+#2014 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2015 = ORIENTED_EDGE('',*,*,#2016,.T.);
+#2016 = EDGE_CURVE('',#1989,#2017,#2019,.T.);
+#2017 = VERTEX_POINT('',#2018);
+#2018 = CARTESIAN_POINT('',(3.9475,10.88,0.275));
+#2019 = SURFACE_CURVE('',#2020,(#2024,#2031),.PCURVE_S1.);
+#2020 = LINE('',#2021,#2022);
+#2021 = CARTESIAN_POINT('',(3.9475,11.155,0.));
+#2022 = VECTOR('',#2023,1.);
+#2023 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#2024 = PCURVE('',#1880,#2025);
+#2025 = DEFINITIONAL_REPRESENTATION('',(#2026),#2030);
+#2026 = LINE('',#2027,#2028);
+#2027 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#2028 = VECTOR('',#2029,1.);
+#2029 = DIRECTION('',(0.707106781187,0.707106781187));
+#2030 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2031 = PCURVE('',#2032,#2037);
+#2032 = PLANE('',#2033);
+#2033 = AXIS2_PLACEMENT_3D('',#2034,#2035,#2036);
+#2034 = CARTESIAN_POINT('',(3.6725,11.155,0.));
+#2035 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#2036 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#2037 = DEFINITIONAL_REPRESENTATION('',(#2038),#2042);
+#2038 = LINE('',#2039,#2040);
+#2039 = CARTESIAN_POINT('',(0.,-0.275));
+#2040 = VECTOR('',#2041,1.);
+#2041 = DIRECTION('',(1.,0.));
+#2042 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2043 = ORIENTED_EDGE('',*,*,#2044,.T.);
+#2044 = EDGE_CURVE('',#2017,#2045,#2047,.T.);
+#2045 = VERTEX_POINT('',#2046);
+#2046 = CARTESIAN_POINT('',(3.9475,10.88,2.4225));
+#2047 = SURFACE_CURVE('',#2048,(#2052,#2059),.PCURVE_S1.);
+#2048 = LINE('',#2049,#2050);
+#2049 = CARTESIAN_POINT('',(3.9475,10.88,0.275));
+#2050 = VECTOR('',#2051,1.);
+#2051 = DIRECTION('',(0.,0.,1.));
+#2052 = PCURVE('',#1880,#2053);
+#2053 = DEFINITIONAL_REPRESENTATION('',(#2054),#2058);
+#2054 = LINE('',#2055,#2056);
+#2055 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#2056 = VECTOR('',#2057,1.);
+#2057 = DIRECTION('',(0.,1.));
+#2058 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2059 = PCURVE('',#2060,#2065);
+#2060 = PLANE('',#2061);
+#2061 = AXIS2_PLACEMENT_3D('',#2062,#2063,#2064);
+#2062 = CARTESIAN_POINT('',(3.724778209321,10.88,1.581028209321));
+#2063 = DIRECTION('',(1.308440111004E-29,-1.,1.156108129756E-30));
+#2064 = DIRECTION('',(-1.,-1.308440111004E-29,0.));
+#2065 = DEFINITIONAL_REPRESENTATION('',(#2066),#2070);
+#2066 = LINE('',#2067,#2068);
+#2067 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#2068 = VECTOR('',#2069,1.);
+#2069 = DIRECTION('',(0.,-1.));
+#2070 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2071 = ORIENTED_EDGE('',*,*,#2072,.T.);
+#2072 = EDGE_CURVE('',#2045,#1870,#2073,.T.);
+#2073 = SURFACE_CURVE('',#2074,(#2078,#2085),.PCURVE_S1.);
+#2074 = LINE('',#2075,#2076);
+#2075 = CARTESIAN_POINT('',(3.9475,10.88,2.4225));
+#2076 = VECTOR('',#2077,1.);
+#2077 = DIRECTION('',(0.,1.,0.));
+#2078 = PCURVE('',#1880,#2079);
+#2079 = DEFINITIONAL_REPRESENTATION('',(#2080),#2084);
+#2080 = LINE('',#2081,#2082);
+#2081 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#2082 = VECTOR('',#2083,1.);
+#2083 = DIRECTION('',(-1.,-2.226071387182E-62));
+#2084 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2085 = PCURVE('',#2086,#2091);
+#2086 = CYLINDRICAL_SURFACE('',#2087,0.1375);
+#2087 = AXIS2_PLACEMENT_3D('',#2088,#2089,#2090);
+#2088 = CARTESIAN_POINT('',(3.81,10.88,2.4225));
+#2089 = DIRECTION('',(0.,1.,0.));
+#2090 = DIRECTION('',(1.,0.,-9.8088568672E-33));
+#2091 = DEFINITIONAL_REPRESENTATION('',(#2092),#2096);
+#2092 = LINE('',#2093,#2094);
+#2093 = CARTESIAN_POINT('',(-0.,0.));
+#2094 = VECTOR('',#2095,1.);
+#2095 = DIRECTION('',(-0.,1.));
+#2096 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2097 = ADVANCED_FACE('',(#2098),#1892,.T.);
+#2098 = FACE_BOUND('',#2099,.T.);
+#2099 = EDGE_LOOP('',(#2100,#2130,#2156,#2157,#2180,#2208,#2236));
+#2100 = ORIENTED_EDGE('',*,*,#2101,.T.);
+#2101 = EDGE_CURVE('',#2102,#2104,#2106,.T.);
+#2102 = VERTEX_POINT('',#2103);
+#2103 = CARTESIAN_POINT('',(3.175,11.98,2.56));
+#2104 = VERTEX_POINT('',#2105);
+#2105 = CARTESIAN_POINT('',(3.81,11.98,2.56));
+#2106 = SURFACE_CURVE('',#2107,(#2111,#2118),.PCURVE_S1.);
+#2107 = LINE('',#2108,#2109);
+#2108 = CARTESIAN_POINT('',(3.6725,11.98,2.56));
+#2109 = VECTOR('',#2110,1.);
+#2110 = DIRECTION('',(1.,0.,0.));
+#2111 = PCURVE('',#1892,#2112);
+#2112 = DEFINITIONAL_REPRESENTATION('',(#2113),#2117);
+#2113 = LINE('',#2114,#2115);
+#2114 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#2115 = VECTOR('',#2116,1.);
+#2116 = DIRECTION('',(1.,6.704108115824E-59));
+#2117 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2118 = PCURVE('',#2119,#2124);
+#2119 = PLANE('',#2120);
+#2120 = AXIS2_PLACEMENT_3D('',#2121,#2122,#2123);
+#2121 = CARTESIAN_POINT('',(3.56125,11.43,2.56));
+#2122 = DIRECTION('',(-1.657312278749E-30,-1.304555144269E-30,1.));
+#2123 = DIRECTION('',(1.,0.,1.657312278749E-30));
+#2124 = DEFINITIONAL_REPRESENTATION('',(#2125),#2129);
+#2125 = LINE('',#2126,#2127);
+#2126 = CARTESIAN_POINT('',(0.11125,0.55));
+#2127 = VECTOR('',#2128,1.);
+#2128 = DIRECTION('',(1.,-2.162055258902E-60));
+#2129 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2130 = ORIENTED_EDGE('',*,*,#2131,.F.);
+#2131 = EDGE_CURVE('',#1870,#2104,#2132,.T.);
+#2132 = SURFACE_CURVE('',#2133,(#2138,#2149),.PCURVE_S1.);
+#2133 = CIRCLE('',#2134,0.1375);
+#2134 = AXIS2_PLACEMENT_3D('',#2135,#2136,#2137);
+#2135 = CARTESIAN_POINT('',(3.81,11.98,2.4225));
+#2136 = DIRECTION('',(0.,-1.,0.));
+#2137 = DIRECTION('',(0.,0.,1.));
+#2138 = PCURVE('',#1892,#2139);
+#2139 = DEFINITIONAL_REPRESENTATION('',(#2140),#2148);
+#2140 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#2141,#2142,#2143,#2144,
+#2145,#2146,#2147),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2
+ ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786,
+6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE()
+GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,
+1.,0.5,1.)) REPRESENTATION_ITEM('') );
+#2141 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#2142 = CARTESIAN_POINT('',(-0.152935195362,-0.978971790679));
+#2143 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.772721790679));
+#2144 = CARTESIAN_POINT('',(8.522179067866E-02,-0.566471790679));
+#2145 = CARTESIAN_POINT('',(0.204300283699,-0.772721790679));
+#2146 = CARTESIAN_POINT('',(0.323378776719,-0.978971790679));
+#2147 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#2148 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2149 = PCURVE('',#2086,#2150);
+#2150 = DEFINITIONAL_REPRESENTATION('',(#2151),#2155);
+#2151 = LINE('',#2152,#2153);
+#2152 = CARTESIAN_POINT('',(4.712388980385,1.1));
+#2153 = VECTOR('',#2154,1.);
+#2154 = DIRECTION('',(-1.,0.));
+#2155 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2156 = ORIENTED_EDGE('',*,*,#1869,.T.);
+#2157 = ORIENTED_EDGE('',*,*,#2158,.F.);
+#2158 = EDGE_CURVE('',#2159,#1872,#2161,.T.);
+#2159 = VERTEX_POINT('',#2160);
+#2160 = CARTESIAN_POINT('',(3.6725,11.98,0.275));
+#2161 = SURFACE_CURVE('',#2162,(#2166,#2173),.PCURVE_S1.);
+#2162 = LINE('',#2163,#2164);
+#2163 = CARTESIAN_POINT('',(3.6725,11.98,0.275));
+#2164 = VECTOR('',#2165,1.);
+#2165 = DIRECTION('',(1.,0.,0.));
+#2166 = PCURVE('',#1892,#2167);
+#2167 = DEFINITIONAL_REPRESENTATION('',(#2168),#2172);
+#2168 = LINE('',#2169,#2170);
+#2169 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#2170 = VECTOR('',#2171,1.);
+#2171 = DIRECTION('',(1.,6.704108115824E-59));
+#2172 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2173 = PCURVE('',#1920,#2174);
+#2174 = DEFINITIONAL_REPRESENTATION('',(#2175),#2179);
+#2175 = LINE('',#2176,#2177);
+#2176 = CARTESIAN_POINT('',(4.710277376051E-16,0.));
+#2177 = VECTOR('',#2178,1.);
+#2178 = DIRECTION('',(0.,-1.));
+#2179 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2180 = ORIENTED_EDGE('',*,*,#2181,.F.);
+#2181 = EDGE_CURVE('',#2182,#2159,#2184,.T.);
+#2182 = VERTEX_POINT('',#2183);
+#2183 = CARTESIAN_POINT('',(3.6725,11.98,2.285));
+#2184 = SURFACE_CURVE('',#2185,(#2189,#2196),.PCURVE_S1.);
+#2185 = LINE('',#2186,#2187);
+#2186 = CARTESIAN_POINT('',(3.6725,11.98,2.56));
+#2187 = VECTOR('',#2188,1.);
+#2188 = DIRECTION('',(0.,0.,-1.));
+#2189 = PCURVE('',#1892,#2190);
+#2190 = DEFINITIONAL_REPRESENTATION('',(#2191),#2195);
+#2191 = LINE('',#2192,#2193);
+#2192 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#2193 = VECTOR('',#2194,1.);
+#2194 = DIRECTION('',(0.,1.));
+#2195 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2196 = PCURVE('',#2197,#2202);
+#2197 = PLANE('',#2198);
+#2198 = AXIS2_PLACEMENT_3D('',#2199,#2200,#2201);
+#2199 = CARTESIAN_POINT('',(3.6725,11.43,-0.34105853382));
+#2200 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#2201 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#2202 = DEFINITIONAL_REPRESENTATION('',(#2203),#2207);
+#2203 = LINE('',#2204,#2205);
+#2204 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#2205 = VECTOR('',#2206,1.);
+#2206 = DIRECTION('',(0.,-1.));
+#2207 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2208 = ORIENTED_EDGE('',*,*,#2209,.F.);
+#2209 = EDGE_CURVE('',#2210,#2182,#2212,.T.);
+#2210 = VERTEX_POINT('',#2211);
+#2211 = CARTESIAN_POINT('',(3.175,11.98,2.285));
+#2212 = SURFACE_CURVE('',#2213,(#2217,#2224),.PCURVE_S1.);
+#2213 = LINE('',#2214,#2215);
+#2214 = CARTESIAN_POINT('',(3.175,11.98,2.285));
+#2215 = VECTOR('',#2216,1.);
+#2216 = DIRECTION('',(1.,0.,0.));
+#2217 = PCURVE('',#1892,#2218);
+#2218 = DEFINITIONAL_REPRESENTATION('',(#2219),#2223);
+#2219 = LINE('',#2220,#2221);
+#2220 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#2221 = VECTOR('',#2222,1.);
+#2222 = DIRECTION('',(1.,6.704108115824E-59));
+#2223 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2224 = PCURVE('',#2225,#2230);
+#2225 = PLANE('',#2226);
+#2226 = AXIS2_PLACEMENT_3D('',#2227,#2228,#2229);
+#2227 = CARTESIAN_POINT('',(3.175,10.88,2.285));
+#2228 = DIRECTION('',(0.,0.,1.));
+#2229 = DIRECTION('',(1.,0.,0.));
+#2230 = DEFINITIONAL_REPRESENTATION('',(#2231),#2235);
+#2231 = LINE('',#2232,#2233);
+#2232 = CARTESIAN_POINT('',(0.,1.1));
+#2233 = VECTOR('',#2234,1.);
+#2234 = DIRECTION('',(1.,0.));
+#2235 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2236 = ORIENTED_EDGE('',*,*,#2237,.T.);
+#2237 = EDGE_CURVE('',#2210,#2102,#2238,.T.);
+#2238 = SURFACE_CURVE('',#2239,(#2243,#2250),.PCURVE_S1.);
+#2239 = LINE('',#2240,#2241);
+#2240 = CARTESIAN_POINT('',(3.175,11.98,2.285));
+#2241 = VECTOR('',#2242,1.);
+#2242 = DIRECTION('',(0.,0.,1.));
+#2243 = PCURVE('',#1892,#2244);
+#2244 = DEFINITIONAL_REPRESENTATION('',(#2245),#2249);
+#2245 = LINE('',#2246,#2247);
+#2246 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#2247 = VECTOR('',#2248,1.);
+#2248 = DIRECTION('',(0.,-1.));
+#2249 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2250 = PCURVE('',#2251,#2256);
+#2251 = PLANE('',#2252);
+#2252 = AXIS2_PLACEMENT_3D('',#2253,#2254,#2255);
+#2253 = CARTESIAN_POINT('',(3.175,10.88,2.285));
+#2254 = DIRECTION('',(1.,0.,0.));
+#2255 = DIRECTION('',(0.,0.,1.));
+#2256 = DEFINITIONAL_REPRESENTATION('',(#2257),#2261);
+#2257 = LINE('',#2258,#2259);
+#2258 = CARTESIAN_POINT('',(0.,-1.1));
+#2259 = VECTOR('',#2260,1.);
+#2260 = DIRECTION('',(1.,0.));
+#2261 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2262 = ADVANCED_FACE('',(#2263),#2086,.T.);
+#2263 = FACE_BOUND('',#2264,.F.);
+#2264 = EDGE_LOOP('',(#2265,#2289,#2310,#2311));
+#2265 = ORIENTED_EDGE('',*,*,#2266,.T.);
+#2266 = EDGE_CURVE('',#2045,#2267,#2269,.T.);
+#2267 = VERTEX_POINT('',#2268);
+#2268 = CARTESIAN_POINT('',(3.81,10.88,2.56));
+#2269 = SURFACE_CURVE('',#2270,(#2275,#2282),.PCURVE_S1.);
+#2270 = CIRCLE('',#2271,0.1375);
+#2271 = AXIS2_PLACEMENT_3D('',#2272,#2273,#2274);
+#2272 = CARTESIAN_POINT('',(3.81,10.88,2.4225));
+#2273 = DIRECTION('',(0.,-1.,0.));
+#2274 = DIRECTION('',(0.,0.,1.));
+#2275 = PCURVE('',#2086,#2276);
+#2276 = DEFINITIONAL_REPRESENTATION('',(#2277),#2281);
+#2277 = LINE('',#2278,#2279);
+#2278 = CARTESIAN_POINT('',(4.712388980385,-1.7763568394E-15));
+#2279 = VECTOR('',#2280,1.);
+#2280 = DIRECTION('',(-1.,0.));
+#2281 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2282 = PCURVE('',#2060,#2283);
+#2283 = DEFINITIONAL_REPRESENTATION('',(#2284),#2288);
+#2284 = CIRCLE('',#2285,0.1375);
+#2285 = AXIS2_PLACEMENT_2D('',#2286,#2287);
+#2286 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#2287 = DIRECTION('',(0.,-1.));
+#2288 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2289 = ORIENTED_EDGE('',*,*,#2290,.T.);
+#2290 = EDGE_CURVE('',#2267,#2104,#2291,.T.);
+#2291 = SURFACE_CURVE('',#2292,(#2296,#2303),.PCURVE_S1.);
+#2292 = LINE('',#2293,#2294);
+#2293 = CARTESIAN_POINT('',(3.81,10.88,2.56));
+#2294 = VECTOR('',#2295,1.);
+#2295 = DIRECTION('',(0.,1.,0.));
+#2296 = PCURVE('',#2086,#2297);
+#2297 = DEFINITIONAL_REPRESENTATION('',(#2298),#2302);
+#2298 = LINE('',#2299,#2300);
+#2299 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#2300 = VECTOR('',#2301,1.);
+#2301 = DIRECTION('',(-0.,1.));
+#2302 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2303 = PCURVE('',#2119,#2304);
+#2304 = DEFINITIONAL_REPRESENTATION('',(#2305),#2309);
+#2305 = LINE('',#2306,#2307);
+#2306 = CARTESIAN_POINT('',(0.24875,-0.55));
+#2307 = VECTOR('',#2308,1.);
+#2308 = DIRECTION('',(0.,1.));
+#2309 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2310 = ORIENTED_EDGE('',*,*,#2131,.F.);
+#2311 = ORIENTED_EDGE('',*,*,#2072,.F.);
+#2312 = ADVANCED_FACE('',(#2313),#1920,.T.);
+#2313 = FACE_BOUND('',#2314,.T.);
+#2314 = EDGE_LOOP('',(#2315,#2316,#2317,#2340));
+#2315 = ORIENTED_EDGE('',*,*,#2158,.T.);
+#2316 = ORIENTED_EDGE('',*,*,#1904,.T.);
+#2317 = ORIENTED_EDGE('',*,*,#2318,.F.);
+#2318 = EDGE_CURVE('',#2319,#1905,#2321,.T.);
+#2319 = VERTEX_POINT('',#2320);
+#2320 = CARTESIAN_POINT('',(3.6725,11.705,0.));
+#2321 = SURFACE_CURVE('',#2322,(#2326,#2333),.PCURVE_S1.);
+#2322 = LINE('',#2323,#2324);
+#2323 = CARTESIAN_POINT('',(3.6725,11.705,0.));
+#2324 = VECTOR('',#2325,1.);
+#2325 = DIRECTION('',(1.,0.,0.));
+#2326 = PCURVE('',#1920,#2327);
+#2327 = DEFINITIONAL_REPRESENTATION('',(#2328),#2332);
+#2328 = LINE('',#2329,#2330);
+#2329 = CARTESIAN_POINT('',(0.388908729653,0.));
+#2330 = VECTOR('',#2331,1.);
+#2331 = DIRECTION('',(0.,-1.));
+#2332 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2333 = PCURVE('',#1948,#2334);
+#2334 = DEFINITIONAL_REPRESENTATION('',(#2335),#2339);
+#2335 = LINE('',#2336,#2337);
+#2336 = CARTESIAN_POINT('',(0.,0.));
+#2337 = VECTOR('',#2338,1.);
+#2338 = DIRECTION('',(0.,-1.));
+#2339 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2340 = ORIENTED_EDGE('',*,*,#2341,.F.);
+#2341 = EDGE_CURVE('',#2159,#2319,#2342,.T.);
+#2342 = SURFACE_CURVE('',#2343,(#2347,#2354),.PCURVE_S1.);
+#2343 = LINE('',#2344,#2345);
+#2344 = CARTESIAN_POINT('',(3.6725,11.98,0.275));
+#2345 = VECTOR('',#2346,1.);
+#2346 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#2347 = PCURVE('',#1920,#2348);
+#2348 = DEFINITIONAL_REPRESENTATION('',(#2349),#2353);
+#2349 = LINE('',#2350,#2351);
+#2350 = CARTESIAN_POINT('',(0.,0.));
+#2351 = VECTOR('',#2352,1.);
+#2352 = DIRECTION('',(1.,0.));
+#2353 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2354 = PCURVE('',#2197,#2355);
+#2355 = DEFINITIONAL_REPRESENTATION('',(#2356),#2360);
+#2356 = LINE('',#2357,#2358);
+#2357 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#2358 = VECTOR('',#2359,1.);
+#2359 = DIRECTION('',(0.707106781187,-0.707106781187));
+#2360 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2361 = ADVANCED_FACE('',(#2362),#2060,.T.);
+#2362 = FACE_BOUND('',#2363,.T.);
+#2363 = EDGE_LOOP('',(#2364,#2365,#2366,#2389,#2412,#2435,#2458));
+#2364 = ORIENTED_EDGE('',*,*,#2044,.T.);
+#2365 = ORIENTED_EDGE('',*,*,#2266,.T.);
+#2366 = ORIENTED_EDGE('',*,*,#2367,.F.);
+#2367 = EDGE_CURVE('',#2368,#2267,#2370,.T.);
+#2368 = VERTEX_POINT('',#2369);
+#2369 = CARTESIAN_POINT('',(3.175,10.88,2.56));
+#2370 = SURFACE_CURVE('',#2371,(#2375,#2382),.PCURVE_S1.);
+#2371 = LINE('',#2372,#2373);
+#2372 = CARTESIAN_POINT('',(3.6725,10.88,2.56));
+#2373 = VECTOR('',#2374,1.);
+#2374 = DIRECTION('',(1.,0.,0.));
+#2375 = PCURVE('',#2060,#2376);
+#2376 = DEFINITIONAL_REPRESENTATION('',(#2377),#2381);
+#2377 = LINE('',#2378,#2379);
+#2378 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#2379 = VECTOR('',#2380,1.);
+#2380 = DIRECTION('',(-1.,1.51269824963E-59));
+#2381 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2382 = PCURVE('',#2119,#2383);
+#2383 = DEFINITIONAL_REPRESENTATION('',(#2384),#2388);
+#2384 = LINE('',#2385,#2386);
+#2385 = CARTESIAN_POINT('',(0.11125,-0.55));
+#2386 = VECTOR('',#2387,1.);
+#2387 = DIRECTION('',(1.,-2.162055258902E-60));
+#2388 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2389 = ORIENTED_EDGE('',*,*,#2390,.F.);
+#2390 = EDGE_CURVE('',#2391,#2368,#2393,.T.);
+#2391 = VERTEX_POINT('',#2392);
+#2392 = CARTESIAN_POINT('',(3.175,10.88,2.285));
+#2393 = SURFACE_CURVE('',#2394,(#2398,#2405),.PCURVE_S1.);
+#2394 = LINE('',#2395,#2396);
+#2395 = CARTESIAN_POINT('',(3.175,10.88,2.285));
+#2396 = VECTOR('',#2397,1.);
+#2397 = DIRECTION('',(0.,0.,1.));
+#2398 = PCURVE('',#2060,#2399);
+#2399 = DEFINITIONAL_REPRESENTATION('',(#2400),#2404);
+#2400 = LINE('',#2401,#2402);
+#2401 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#2402 = VECTOR('',#2403,1.);
+#2403 = DIRECTION('',(0.,-1.));
+#2404 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2405 = PCURVE('',#2251,#2406);
+#2406 = DEFINITIONAL_REPRESENTATION('',(#2407),#2411);
+#2407 = LINE('',#2408,#2409);
+#2408 = CARTESIAN_POINT('',(0.,0.));
+#2409 = VECTOR('',#2410,1.);
+#2410 = DIRECTION('',(1.,0.));
+#2411 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2412 = ORIENTED_EDGE('',*,*,#2413,.T.);
+#2413 = EDGE_CURVE('',#2391,#2414,#2416,.T.);
+#2414 = VERTEX_POINT('',#2415);
+#2415 = CARTESIAN_POINT('',(3.6725,10.88,2.285));
+#2416 = SURFACE_CURVE('',#2417,(#2421,#2428),.PCURVE_S1.);
+#2417 = LINE('',#2418,#2419);
+#2418 = CARTESIAN_POINT('',(3.175,10.88,2.285));
+#2419 = VECTOR('',#2420,1.);
+#2420 = DIRECTION('',(1.,0.,0.));
+#2421 = PCURVE('',#2060,#2422);
+#2422 = DEFINITIONAL_REPRESENTATION('',(#2423),#2427);
+#2423 = LINE('',#2424,#2425);
+#2424 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#2425 = VECTOR('',#2426,1.);
+#2426 = DIRECTION('',(-1.,1.51269824963E-59));
+#2427 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2428 = PCURVE('',#2225,#2429);
+#2429 = DEFINITIONAL_REPRESENTATION('',(#2430),#2434);
+#2430 = LINE('',#2431,#2432);
+#2431 = CARTESIAN_POINT('',(0.,0.));
+#2432 = VECTOR('',#2433,1.);
+#2433 = DIRECTION('',(1.,0.));
+#2434 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2435 = ORIENTED_EDGE('',*,*,#2436,.F.);
+#2436 = EDGE_CURVE('',#2437,#2414,#2439,.T.);
+#2437 = VERTEX_POINT('',#2438);
+#2438 = CARTESIAN_POINT('',(3.6725,10.88,0.275));
+#2439 = SURFACE_CURVE('',#2440,(#2444,#2451),.PCURVE_S1.);
+#2440 = LINE('',#2441,#2442);
+#2441 = CARTESIAN_POINT('',(3.6725,10.88,0.275));
+#2442 = VECTOR('',#2443,1.);
+#2443 = DIRECTION('',(0.,0.,1.));
+#2444 = PCURVE('',#2060,#2445);
+#2445 = DEFINITIONAL_REPRESENTATION('',(#2446),#2450);
+#2446 = LINE('',#2447,#2448);
+#2447 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#2448 = VECTOR('',#2449,1.);
+#2449 = DIRECTION('',(0.,-1.));
+#2450 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2451 = PCURVE('',#2197,#2452);
+#2452 = DEFINITIONAL_REPRESENTATION('',(#2453),#2457);
+#2453 = LINE('',#2454,#2455);
+#2454 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#2455 = VECTOR('',#2456,1.);
+#2456 = DIRECTION('',(0.,1.));
+#2457 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2458 = ORIENTED_EDGE('',*,*,#2459,.T.);
+#2459 = EDGE_CURVE('',#2437,#2017,#2460,.T.);
+#2460 = SURFACE_CURVE('',#2461,(#2465,#2472),.PCURVE_S1.);
+#2461 = LINE('',#2462,#2463);
+#2462 = CARTESIAN_POINT('',(3.6725,10.88,0.275));
+#2463 = VECTOR('',#2464,1.);
+#2464 = DIRECTION('',(1.,0.,0.));
+#2465 = PCURVE('',#2060,#2466);
+#2466 = DEFINITIONAL_REPRESENTATION('',(#2467),#2471);
+#2467 = LINE('',#2468,#2469);
+#2468 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#2469 = VECTOR('',#2470,1.);
+#2470 = DIRECTION('',(-1.,1.51269824963E-59));
+#2471 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2472 = PCURVE('',#2032,#2473);
+#2473 = DEFINITIONAL_REPRESENTATION('',(#2474),#2478);
+#2474 = LINE('',#2475,#2476);
+#2475 = CARTESIAN_POINT('',(0.388908729653,0.));
+#2476 = VECTOR('',#2477,1.);
+#2477 = DIRECTION('',(0.,-1.));
+#2478 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2479 = ADVANCED_FACE('',(#2480),#1948,.T.);
+#2480 = FACE_BOUND('',#2481,.T.);
+#2481 = EDGE_LOOP('',(#2482,#2483,#2484,#2507));
+#2482 = ORIENTED_EDGE('',*,*,#2318,.T.);
+#2483 = ORIENTED_EDGE('',*,*,#1932,.T.);
+#2484 = ORIENTED_EDGE('',*,*,#2485,.F.);
+#2485 = EDGE_CURVE('',#2486,#1933,#2488,.T.);
+#2486 = VERTEX_POINT('',#2487);
+#2487 = CARTESIAN_POINT('',(3.6725,11.705,-3.5));
+#2488 = SURFACE_CURVE('',#2489,(#2493,#2500),.PCURVE_S1.);
+#2489 = LINE('',#2490,#2491);
+#2490 = CARTESIAN_POINT('',(3.6725,11.705,-3.5));
+#2491 = VECTOR('',#2492,1.);
+#2492 = DIRECTION('',(1.,0.,0.));
+#2493 = PCURVE('',#1948,#2494);
+#2494 = DEFINITIONAL_REPRESENTATION('',(#2495),#2499);
+#2495 = LINE('',#2496,#2497);
+#2496 = CARTESIAN_POINT('',(3.5,0.));
+#2497 = VECTOR('',#2498,1.);
+#2498 = DIRECTION('',(0.,-1.));
+#2499 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2500 = PCURVE('',#1976,#2501);
+#2501 = DEFINITIONAL_REPRESENTATION('',(#2502),#2506);
+#2502 = LINE('',#2503,#2504);
+#2503 = CARTESIAN_POINT('',(7.771561172376E-16,0.));
+#2504 = VECTOR('',#2505,1.);
+#2505 = DIRECTION('',(0.,-1.));
+#2506 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2507 = ORIENTED_EDGE('',*,*,#2508,.F.);
+#2508 = EDGE_CURVE('',#2319,#2486,#2509,.T.);
+#2509 = SURFACE_CURVE('',#2510,(#2514,#2521),.PCURVE_S1.);
+#2510 = LINE('',#2511,#2512);
+#2511 = CARTESIAN_POINT('',(3.6725,11.705,0.));
+#2512 = VECTOR('',#2513,1.);
+#2513 = DIRECTION('',(0.,0.,-1.));
+#2514 = PCURVE('',#1948,#2515);
+#2515 = DEFINITIONAL_REPRESENTATION('',(#2516),#2520);
+#2516 = LINE('',#2517,#2518);
+#2517 = CARTESIAN_POINT('',(0.,0.));
+#2518 = VECTOR('',#2519,1.);
+#2519 = DIRECTION('',(1.,0.));
+#2520 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2521 = PCURVE('',#2197,#2522);
+#2522 = DEFINITIONAL_REPRESENTATION('',(#2523),#2527);
+#2523 = LINE('',#2524,#2525);
+#2524 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#2525 = VECTOR('',#2526,1.);
+#2526 = DIRECTION('',(0.,-1.));
+#2527 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2528 = ADVANCED_FACE('',(#2529),#2032,.T.);
+#2529 = FACE_BOUND('',#2530,.T.);
+#2530 = EDGE_LOOP('',(#2531,#2554,#2555,#2556));
+#2531 = ORIENTED_EDGE('',*,*,#2532,.T.);
+#2532 = EDGE_CURVE('',#2533,#1989,#2535,.T.);
+#2533 = VERTEX_POINT('',#2534);
+#2534 = CARTESIAN_POINT('',(3.6725,11.155,0.));
+#2535 = SURFACE_CURVE('',#2536,(#2540,#2547),.PCURVE_S1.);
+#2536 = LINE('',#2537,#2538);
+#2537 = CARTESIAN_POINT('',(3.6725,11.155,0.));
+#2538 = VECTOR('',#2539,1.);
+#2539 = DIRECTION('',(1.,0.,0.));
+#2540 = PCURVE('',#2032,#2541);
+#2541 = DEFINITIONAL_REPRESENTATION('',(#2542),#2546);
+#2542 = LINE('',#2543,#2544);
+#2543 = CARTESIAN_POINT('',(-1.177569344013E-16,0.));
+#2544 = VECTOR('',#2545,1.);
+#2545 = DIRECTION('',(0.,-1.));
+#2546 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2547 = PCURVE('',#2004,#2548);
+#2548 = DEFINITIONAL_REPRESENTATION('',(#2549),#2553);
+#2549 = LINE('',#2550,#2551);
+#2550 = CARTESIAN_POINT('',(3.5,0.));
+#2551 = VECTOR('',#2552,1.);
+#2552 = DIRECTION('',(0.,-1.));
+#2553 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2554 = ORIENTED_EDGE('',*,*,#2016,.T.);
+#2555 = ORIENTED_EDGE('',*,*,#2459,.F.);
+#2556 = ORIENTED_EDGE('',*,*,#2557,.F.);
+#2557 = EDGE_CURVE('',#2533,#2437,#2558,.T.);
+#2558 = SURFACE_CURVE('',#2559,(#2563,#2570),.PCURVE_S1.);
+#2559 = LINE('',#2560,#2561);
+#2560 = CARTESIAN_POINT('',(3.6725,11.155,0.));
+#2561 = VECTOR('',#2562,1.);
+#2562 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#2563 = PCURVE('',#2032,#2564);
+#2564 = DEFINITIONAL_REPRESENTATION('',(#2565),#2569);
+#2565 = LINE('',#2566,#2567);
+#2566 = CARTESIAN_POINT('',(0.,0.));
+#2567 = VECTOR('',#2568,1.);
+#2568 = DIRECTION('',(1.,0.));
+#2569 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2570 = PCURVE('',#2197,#2571);
+#2571 = DEFINITIONAL_REPRESENTATION('',(#2572),#2576);
+#2572 = LINE('',#2573,#2574);
+#2573 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#2574 = VECTOR('',#2575,1.);
+#2575 = DIRECTION('',(0.707106781187,0.707106781187));
+#2576 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2577 = ADVANCED_FACE('',(#2578),#1976,.T.);
+#2578 = FACE_BOUND('',#2579,.T.);
+#2579 = EDGE_LOOP('',(#2580,#2581,#2582,#2605));
+#2580 = ORIENTED_EDGE('',*,*,#2485,.T.);
+#2581 = ORIENTED_EDGE('',*,*,#1960,.T.);
+#2582 = ORIENTED_EDGE('',*,*,#2583,.F.);
+#2583 = EDGE_CURVE('',#2584,#1961,#2586,.T.);
+#2584 = VERTEX_POINT('',#2585);
+#2585 = CARTESIAN_POINT('',(3.6725,11.155,-3.5));
+#2586 = SURFACE_CURVE('',#2587,(#2591,#2598),.PCURVE_S1.);
+#2587 = LINE('',#2588,#2589);
+#2588 = CARTESIAN_POINT('',(3.6725,11.155,-3.5));
+#2589 = VECTOR('',#2590,1.);
+#2590 = DIRECTION('',(1.,0.,0.));
+#2591 = PCURVE('',#1976,#2592);
+#2592 = DEFINITIONAL_REPRESENTATION('',(#2593),#2597);
+#2593 = LINE('',#2594,#2595);
+#2594 = CARTESIAN_POINT('',(0.55,0.));
+#2595 = VECTOR('',#2596,1.);
+#2596 = DIRECTION('',(0.,-1.));
+#2597 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2598 = PCURVE('',#2004,#2599);
+#2599 = DEFINITIONAL_REPRESENTATION('',(#2600),#2604);
+#2600 = LINE('',#2601,#2602);
+#2601 = CARTESIAN_POINT('',(0.,0.));
+#2602 = VECTOR('',#2603,1.);
+#2603 = DIRECTION('',(0.,-1.));
+#2604 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2605 = ORIENTED_EDGE('',*,*,#2606,.F.);
+#2606 = EDGE_CURVE('',#2486,#2584,#2607,.T.);
+#2607 = SURFACE_CURVE('',#2608,(#2612,#2619),.PCURVE_S1.);
+#2608 = LINE('',#2609,#2610);
+#2609 = CARTESIAN_POINT('',(3.6725,11.705,-3.5));
+#2610 = VECTOR('',#2611,1.);
+#2611 = DIRECTION('',(0.,-1.,0.));
+#2612 = PCURVE('',#1976,#2613);
+#2613 = DEFINITIONAL_REPRESENTATION('',(#2614),#2618);
+#2614 = LINE('',#2615,#2616);
+#2615 = CARTESIAN_POINT('',(0.,-0.));
+#2616 = VECTOR('',#2617,1.);
+#2617 = DIRECTION('',(1.,0.));
+#2618 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2619 = PCURVE('',#2197,#2620);
+#2620 = DEFINITIONAL_REPRESENTATION('',(#2621),#2625);
+#2621 = LINE('',#2622,#2623);
+#2622 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#2623 = VECTOR('',#2624,1.);
+#2624 = DIRECTION('',(1.,2.226071387182E-62));
+#2625 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2626 = ADVANCED_FACE('',(#2627),#2004,.T.);
+#2627 = FACE_BOUND('',#2628,.T.);
+#2628 = EDGE_LOOP('',(#2629,#2630,#2631,#2632));
+#2629 = ORIENTED_EDGE('',*,*,#2583,.T.);
+#2630 = ORIENTED_EDGE('',*,*,#1988,.T.);
+#2631 = ORIENTED_EDGE('',*,*,#2532,.F.);
+#2632 = ORIENTED_EDGE('',*,*,#2633,.F.);
+#2633 = EDGE_CURVE('',#2584,#2533,#2634,.T.);
+#2634 = SURFACE_CURVE('',#2635,(#2639,#2646),.PCURVE_S1.);
+#2635 = LINE('',#2636,#2637);
+#2636 = CARTESIAN_POINT('',(3.6725,11.155,-3.5));
+#2637 = VECTOR('',#2638,1.);
+#2638 = DIRECTION('',(0.,0.,1.));
+#2639 = PCURVE('',#2004,#2640);
+#2640 = DEFINITIONAL_REPRESENTATION('',(#2641),#2645);
+#2641 = LINE('',#2642,#2643);
+#2642 = CARTESIAN_POINT('',(0.,0.));
+#2643 = VECTOR('',#2644,1.);
+#2644 = DIRECTION('',(1.,0.));
+#2645 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2646 = PCURVE('',#2197,#2647);
+#2647 = DEFINITIONAL_REPRESENTATION('',(#2648),#2652);
+#2648 = LINE('',#2649,#2650);
+#2649 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#2650 = VECTOR('',#2651,1.);
+#2651 = DIRECTION('',(0.,1.));
+#2652 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2653 = ADVANCED_FACE('',(#2654),#2119,.T.);
+#2654 = FACE_BOUND('',#2655,.T.);
+#2655 = EDGE_LOOP('',(#2656,#2657,#2658,#2659));
+#2656 = ORIENTED_EDGE('',*,*,#2367,.T.);
+#2657 = ORIENTED_EDGE('',*,*,#2290,.T.);
+#2658 = ORIENTED_EDGE('',*,*,#2101,.F.);
+#2659 = ORIENTED_EDGE('',*,*,#2660,.F.);
+#2660 = EDGE_CURVE('',#2368,#2102,#2661,.T.);
+#2661 = SURFACE_CURVE('',#2662,(#2666,#2673),.PCURVE_S1.);
+#2662 = LINE('',#2663,#2664);
+#2663 = CARTESIAN_POINT('',(3.175,10.88,2.56));
+#2664 = VECTOR('',#2665,1.);
+#2665 = DIRECTION('',(0.,1.,0.));
+#2666 = PCURVE('',#2119,#2667);
+#2667 = DEFINITIONAL_REPRESENTATION('',(#2668),#2672);
+#2668 = LINE('',#2669,#2670);
+#2669 = CARTESIAN_POINT('',(-0.38625,-0.55));
+#2670 = VECTOR('',#2671,1.);
+#2671 = DIRECTION('',(0.,1.));
+#2672 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2673 = PCURVE('',#2251,#2674);
+#2674 = DEFINITIONAL_REPRESENTATION('',(#2675),#2679);
+#2675 = LINE('',#2676,#2677);
+#2676 = CARTESIAN_POINT('',(0.275,0.));
+#2677 = VECTOR('',#2678,1.);
+#2678 = DIRECTION('',(0.,-1.));
+#2679 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2680 = ADVANCED_FACE('',(#2681),#2251,.F.);
+#2681 = FACE_BOUND('',#2682,.F.);
+#2682 = EDGE_LOOP('',(#2683,#2684,#2705,#2706));
+#2683 = ORIENTED_EDGE('',*,*,#2390,.F.);
+#2684 = ORIENTED_EDGE('',*,*,#2685,.T.);
+#2685 = EDGE_CURVE('',#2391,#2210,#2686,.T.);
+#2686 = SURFACE_CURVE('',#2687,(#2691,#2698),.PCURVE_S1.);
+#2687 = LINE('',#2688,#2689);
+#2688 = CARTESIAN_POINT('',(3.175,10.88,2.285));
+#2689 = VECTOR('',#2690,1.);
+#2690 = DIRECTION('',(0.,1.,0.));
+#2691 = PCURVE('',#2251,#2692);
+#2692 = DEFINITIONAL_REPRESENTATION('',(#2693),#2697);
+#2693 = LINE('',#2694,#2695);
+#2694 = CARTESIAN_POINT('',(0.,0.));
+#2695 = VECTOR('',#2696,1.);
+#2696 = DIRECTION('',(0.,-1.));
+#2697 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2698 = PCURVE('',#2225,#2699);
+#2699 = DEFINITIONAL_REPRESENTATION('',(#2700),#2704);
+#2700 = LINE('',#2701,#2702);
+#2701 = CARTESIAN_POINT('',(0.,0.));
+#2702 = VECTOR('',#2703,1.);
+#2703 = DIRECTION('',(0.,1.));
+#2704 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2705 = ORIENTED_EDGE('',*,*,#2237,.T.);
+#2706 = ORIENTED_EDGE('',*,*,#2660,.F.);
+#2707 = ADVANCED_FACE('',(#2708),#2225,.F.);
+#2708 = FACE_BOUND('',#2709,.F.);
+#2709 = EDGE_LOOP('',(#2710,#2711,#2712,#2733));
+#2710 = ORIENTED_EDGE('',*,*,#2685,.F.);
+#2711 = ORIENTED_EDGE('',*,*,#2413,.T.);
+#2712 = ORIENTED_EDGE('',*,*,#2713,.T.);
+#2713 = EDGE_CURVE('',#2414,#2182,#2714,.T.);
+#2714 = SURFACE_CURVE('',#2715,(#2719,#2726),.PCURVE_S1.);
+#2715 = LINE('',#2716,#2717);
+#2716 = CARTESIAN_POINT('',(3.6725,10.88,2.285));
+#2717 = VECTOR('',#2718,1.);
+#2718 = DIRECTION('',(0.,1.,0.));
+#2719 = PCURVE('',#2225,#2720);
+#2720 = DEFINITIONAL_REPRESENTATION('',(#2721),#2725);
+#2721 = LINE('',#2722,#2723);
+#2722 = CARTESIAN_POINT('',(0.4975,0.));
+#2723 = VECTOR('',#2724,1.);
+#2724 = DIRECTION('',(0.,1.));
+#2725 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2726 = PCURVE('',#2197,#2727);
+#2727 = DEFINITIONAL_REPRESENTATION('',(#2728),#2732);
+#2728 = LINE('',#2729,#2730);
+#2729 = CARTESIAN_POINT('',(0.55,2.62605853382));
+#2730 = VECTOR('',#2731,1.);
+#2731 = DIRECTION('',(-1.,-2.226071387182E-62));
+#2732 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2733 = ORIENTED_EDGE('',*,*,#2209,.F.);
+#2734 = ADVANCED_FACE('',(#2735),#2197,.T.);
+#2735 = FACE_BOUND('',#2736,.T.);
+#2736 = EDGE_LOOP('',(#2737,#2738,#2739,#2740,#2741,#2742,#2743,#2744));
+#2737 = ORIENTED_EDGE('',*,*,#2436,.T.);
+#2738 = ORIENTED_EDGE('',*,*,#2713,.T.);
+#2739 = ORIENTED_EDGE('',*,*,#2181,.T.);
+#2740 = ORIENTED_EDGE('',*,*,#2341,.T.);
+#2741 = ORIENTED_EDGE('',*,*,#2508,.T.);
+#2742 = ORIENTED_EDGE('',*,*,#2606,.T.);
+#2743 = ORIENTED_EDGE('',*,*,#2633,.T.);
+#2744 = ORIENTED_EDGE('',*,*,#2557,.T.);
+#2745 = MANIFOLD_SOLID_BREP('',#2746);
+#2746 = CLOSED_SHELL('',(#2747,#2979,#3144,#3194,#3243,#3361,#3410,#3459
+ ,#3508,#3535,#3562,#3589,#3616));
+#2747 = ADVANCED_FACE('',(#2748),#2762,.F.);
+#2748 = FACE_BOUND('',#2749,.F.);
+#2749 = EDGE_LOOP('',(#2750,#2785,#2813,#2841,#2869,#2897,#2925,#2953));
+#2750 = ORIENTED_EDGE('',*,*,#2751,.T.);
+#2751 = EDGE_CURVE('',#2752,#2754,#2756,.T.);
+#2752 = VERTEX_POINT('',#2753);
+#2753 = CARTESIAN_POINT('',(-3.9475,8.34,2.4225));
+#2754 = VERTEX_POINT('',#2755);
+#2755 = CARTESIAN_POINT('',(-3.9475,8.34,0.275));
+#2756 = SURFACE_CURVE('',#2757,(#2761,#2773),.PCURVE_S1.);
+#2757 = LINE('',#2758,#2759);
+#2758 = CARTESIAN_POINT('',(-3.9475,8.34,2.56));
+#2759 = VECTOR('',#2760,1.);
+#2760 = DIRECTION('',(0.,0.,-1.));
+#2761 = PCURVE('',#2762,#2767);
+#2762 = PLANE('',#2763);
+#2763 = AXIS2_PLACEMENT_3D('',#2764,#2765,#2766);
+#2764 = CARTESIAN_POINT('',(-3.9475,8.89,-0.34105853382));
+#2765 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#2766 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#2767 = DEFINITIONAL_REPRESENTATION('',(#2768),#2772);
+#2768 = LINE('',#2769,#2770);
+#2769 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#2770 = VECTOR('',#2771,1.);
+#2771 = DIRECTION('',(0.,-1.));
+#2772 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2773 = PCURVE('',#2774,#2779);
+#2774 = PLANE('',#2775);
+#2775 = AXIS2_PLACEMENT_3D('',#2776,#2777,#2778);
+#2776 = CARTESIAN_POINT('',(-3.724778209321,8.34,1.581028209321));
+#2777 = DIRECTION('',(1.58726821659E-29,-1.,-1.055919227411E-30));
+#2778 = DIRECTION('',(-1.,-1.58726821659E-29,0.));
+#2779 = DEFINITIONAL_REPRESENTATION('',(#2780),#2784);
+#2780 = LINE('',#2781,#2782);
+#2781 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#2782 = VECTOR('',#2783,1.);
+#2783 = DIRECTION('',(0.,1.));
+#2784 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2785 = ORIENTED_EDGE('',*,*,#2786,.T.);
+#2786 = EDGE_CURVE('',#2754,#2787,#2789,.T.);
+#2787 = VERTEX_POINT('',#2788);
+#2788 = CARTESIAN_POINT('',(-3.9475,8.615,0.));
+#2789 = SURFACE_CURVE('',#2790,(#2794,#2801),.PCURVE_S1.);
+#2790 = LINE('',#2791,#2792);
+#2791 = CARTESIAN_POINT('',(-3.9475,8.34,0.275));
+#2792 = VECTOR('',#2793,1.);
+#2793 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#2794 = PCURVE('',#2762,#2795);
+#2795 = DEFINITIONAL_REPRESENTATION('',(#2796),#2800);
+#2796 = LINE('',#2797,#2798);
+#2797 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#2798 = VECTOR('',#2799,1.);
+#2799 = DIRECTION('',(0.707106781187,-0.707106781187));
+#2800 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2801 = PCURVE('',#2802,#2807);
+#2802 = PLANE('',#2803);
+#2803 = AXIS2_PLACEMENT_3D('',#2804,#2805,#2806);
+#2804 = CARTESIAN_POINT('',(-3.6725,8.34,0.275));
+#2805 = DIRECTION('',(-0.,-0.707106781187,-0.707106781187));
+#2806 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#2807 = DEFINITIONAL_REPRESENTATION('',(#2808),#2812);
+#2808 = LINE('',#2809,#2810);
+#2809 = CARTESIAN_POINT('',(0.,-0.275));
+#2810 = VECTOR('',#2811,1.);
+#2811 = DIRECTION('',(1.,0.));
+#2812 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2813 = ORIENTED_EDGE('',*,*,#2814,.T.);
+#2814 = EDGE_CURVE('',#2787,#2815,#2817,.T.);
+#2815 = VERTEX_POINT('',#2816);
+#2816 = CARTESIAN_POINT('',(-3.9475,8.615,-3.5));
+#2817 = SURFACE_CURVE('',#2818,(#2822,#2829),.PCURVE_S1.);
+#2818 = LINE('',#2819,#2820);
+#2819 = CARTESIAN_POINT('',(-3.9475,8.615,0.));
+#2820 = VECTOR('',#2821,1.);
+#2821 = DIRECTION('',(0.,0.,-1.));
+#2822 = PCURVE('',#2762,#2823);
+#2823 = DEFINITIONAL_REPRESENTATION('',(#2824),#2828);
+#2824 = LINE('',#2825,#2826);
+#2825 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#2826 = VECTOR('',#2827,1.);
+#2827 = DIRECTION('',(0.,-1.));
+#2828 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2829 = PCURVE('',#2830,#2835);
+#2830 = PLANE('',#2831);
+#2831 = AXIS2_PLACEMENT_3D('',#2832,#2833,#2834);
+#2832 = CARTESIAN_POINT('',(-3.6725,8.615,0.));
+#2833 = DIRECTION('',(-0.,-1.,-0.));
+#2834 = DIRECTION('',(0.,0.,-1.));
+#2835 = DEFINITIONAL_REPRESENTATION('',(#2836),#2840);
+#2836 = LINE('',#2837,#2838);
+#2837 = CARTESIAN_POINT('',(0.,-0.275));
+#2838 = VECTOR('',#2839,1.);
+#2839 = DIRECTION('',(1.,0.));
+#2840 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2841 = ORIENTED_EDGE('',*,*,#2842,.T.);
+#2842 = EDGE_CURVE('',#2815,#2843,#2845,.T.);
+#2843 = VERTEX_POINT('',#2844);
+#2844 = CARTESIAN_POINT('',(-3.9475,9.165,-3.5));
+#2845 = SURFACE_CURVE('',#2846,(#2850,#2857),.PCURVE_S1.);
+#2846 = LINE('',#2847,#2848);
+#2847 = CARTESIAN_POINT('',(-3.9475,8.615,-3.5));
+#2848 = VECTOR('',#2849,1.);
+#2849 = DIRECTION('',(0.,1.,0.));
+#2850 = PCURVE('',#2762,#2851);
+#2851 = DEFINITIONAL_REPRESENTATION('',(#2852),#2856);
+#2852 = LINE('',#2853,#2854);
+#2853 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#2854 = VECTOR('',#2855,1.);
+#2855 = DIRECTION('',(1.,-2.226071387182E-62));
+#2856 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2857 = PCURVE('',#2858,#2863);
+#2858 = PLANE('',#2859);
+#2859 = AXIS2_PLACEMENT_3D('',#2860,#2861,#2862);
+#2860 = CARTESIAN_POINT('',(-3.6725,8.615,-3.5));
+#2861 = DIRECTION('',(0.,0.,-1.));
+#2862 = DIRECTION('',(0.,1.,0.));
+#2863 = DEFINITIONAL_REPRESENTATION('',(#2864),#2868);
+#2864 = LINE('',#2865,#2866);
+#2865 = CARTESIAN_POINT('',(0.,-0.275));
+#2866 = VECTOR('',#2867,1.);
+#2867 = DIRECTION('',(1.,0.));
+#2868 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2869 = ORIENTED_EDGE('',*,*,#2870,.T.);
+#2870 = EDGE_CURVE('',#2843,#2871,#2873,.T.);
+#2871 = VERTEX_POINT('',#2872);
+#2872 = CARTESIAN_POINT('',(-3.9475,9.165,0.));
+#2873 = SURFACE_CURVE('',#2874,(#2878,#2885),.PCURVE_S1.);
+#2874 = LINE('',#2875,#2876);
+#2875 = CARTESIAN_POINT('',(-3.9475,9.165,-3.5));
+#2876 = VECTOR('',#2877,1.);
+#2877 = DIRECTION('',(0.,0.,1.));
+#2878 = PCURVE('',#2762,#2879);
+#2879 = DEFINITIONAL_REPRESENTATION('',(#2880),#2884);
+#2880 = LINE('',#2881,#2882);
+#2881 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#2882 = VECTOR('',#2883,1.);
+#2883 = DIRECTION('',(0.,1.));
+#2884 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2885 = PCURVE('',#2886,#2891);
+#2886 = PLANE('',#2887);
+#2887 = AXIS2_PLACEMENT_3D('',#2888,#2889,#2890);
+#2888 = CARTESIAN_POINT('',(-3.6725,9.165,-3.5));
+#2889 = DIRECTION('',(0.,1.,0.));
+#2890 = DIRECTION('',(0.,0.,1.));
+#2891 = DEFINITIONAL_REPRESENTATION('',(#2892),#2896);
+#2892 = LINE('',#2893,#2894);
+#2893 = CARTESIAN_POINT('',(0.,-0.275));
+#2894 = VECTOR('',#2895,1.);
+#2895 = DIRECTION('',(1.,0.));
+#2896 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2897 = ORIENTED_EDGE('',*,*,#2898,.T.);
+#2898 = EDGE_CURVE('',#2871,#2899,#2901,.T.);
+#2899 = VERTEX_POINT('',#2900);
+#2900 = CARTESIAN_POINT('',(-3.9475,9.44,0.275));
+#2901 = SURFACE_CURVE('',#2902,(#2906,#2913),.PCURVE_S1.);
+#2902 = LINE('',#2903,#2904);
+#2903 = CARTESIAN_POINT('',(-3.9475,9.165,0.));
+#2904 = VECTOR('',#2905,1.);
+#2905 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#2906 = PCURVE('',#2762,#2907);
+#2907 = DEFINITIONAL_REPRESENTATION('',(#2908),#2912);
+#2908 = LINE('',#2909,#2910);
+#2909 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#2910 = VECTOR('',#2911,1.);
+#2911 = DIRECTION('',(0.707106781187,0.707106781187));
+#2912 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2913 = PCURVE('',#2914,#2919);
+#2914 = PLANE('',#2915);
+#2915 = AXIS2_PLACEMENT_3D('',#2916,#2917,#2918);
+#2916 = CARTESIAN_POINT('',(-3.6725,9.165,0.));
+#2917 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#2918 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#2919 = DEFINITIONAL_REPRESENTATION('',(#2920),#2924);
+#2920 = LINE('',#2921,#2922);
+#2921 = CARTESIAN_POINT('',(0.,-0.275));
+#2922 = VECTOR('',#2923,1.);
+#2923 = DIRECTION('',(1.,0.));
+#2924 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2925 = ORIENTED_EDGE('',*,*,#2926,.T.);
+#2926 = EDGE_CURVE('',#2899,#2927,#2929,.T.);
+#2927 = VERTEX_POINT('',#2928);
+#2928 = CARTESIAN_POINT('',(-3.9475,9.44,2.4225));
+#2929 = SURFACE_CURVE('',#2930,(#2934,#2941),.PCURVE_S1.);
+#2930 = LINE('',#2931,#2932);
+#2931 = CARTESIAN_POINT('',(-3.9475,9.44,0.275));
+#2932 = VECTOR('',#2933,1.);
+#2933 = DIRECTION('',(0.,0.,1.));
+#2934 = PCURVE('',#2762,#2935);
+#2935 = DEFINITIONAL_REPRESENTATION('',(#2936),#2940);
+#2936 = LINE('',#2937,#2938);
+#2937 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#2938 = VECTOR('',#2939,1.);
+#2939 = DIRECTION('',(0.,1.));
+#2940 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2941 = PCURVE('',#2942,#2947);
+#2942 = PLANE('',#2943);
+#2943 = AXIS2_PLACEMENT_3D('',#2944,#2945,#2946);
+#2944 = CARTESIAN_POINT('',(-3.724778209321,9.44,1.581028209321));
+#2945 = DIRECTION('',(2.616880222009E-29,1.,-2.312216259511E-30));
+#2946 = DIRECTION('',(1.,-2.616880222009E-29,0.));
+#2947 = DEFINITIONAL_REPRESENTATION('',(#2948),#2952);
+#2948 = LINE('',#2949,#2950);
+#2949 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#2950 = VECTOR('',#2951,1.);
+#2951 = DIRECTION('',(0.,-1.));
+#2952 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2953 = ORIENTED_EDGE('',*,*,#2954,.T.);
+#2954 = EDGE_CURVE('',#2927,#2752,#2955,.T.);
+#2955 = SURFACE_CURVE('',#2956,(#2960,#2967),.PCURVE_S1.);
+#2956 = LINE('',#2957,#2958);
+#2957 = CARTESIAN_POINT('',(-3.9475,9.44,2.4225));
+#2958 = VECTOR('',#2959,1.);
+#2959 = DIRECTION('',(0.,-1.,0.));
+#2960 = PCURVE('',#2762,#2961);
+#2961 = DEFINITIONAL_REPRESENTATION('',(#2962),#2966);
+#2962 = LINE('',#2963,#2964);
+#2963 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#2964 = VECTOR('',#2965,1.);
+#2965 = DIRECTION('',(-1.,2.226071387182E-62));
+#2966 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2967 = PCURVE('',#2968,#2973);
+#2968 = CYLINDRICAL_SURFACE('',#2969,0.1375);
+#2969 = AXIS2_PLACEMENT_3D('',#2970,#2971,#2972);
+#2970 = CARTESIAN_POINT('',(-3.81,9.44,2.4225));
+#2971 = DIRECTION('',(0.,-1.,0.));
+#2972 = DIRECTION('',(-1.,-0.,-9.8088568672E-33));
+#2973 = DEFINITIONAL_REPRESENTATION('',(#2974),#2978);
+#2974 = LINE('',#2975,#2976);
+#2975 = CARTESIAN_POINT('',(-0.,0.));
+#2976 = VECTOR('',#2977,1.);
+#2977 = DIRECTION('',(-0.,1.));
+#2978 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#2979 = ADVANCED_FACE('',(#2980),#2774,.T.);
+#2980 = FACE_BOUND('',#2981,.T.);
+#2981 = EDGE_LOOP('',(#2982,#3012,#3038,#3039,#3062,#3090,#3118));
+#2982 = ORIENTED_EDGE('',*,*,#2983,.T.);
+#2983 = EDGE_CURVE('',#2984,#2986,#2988,.T.);
+#2984 = VERTEX_POINT('',#2985);
+#2985 = CARTESIAN_POINT('',(-3.175,8.34,2.56));
+#2986 = VERTEX_POINT('',#2987);
+#2987 = CARTESIAN_POINT('',(-3.81,8.34,2.56));
+#2988 = SURFACE_CURVE('',#2989,(#2993,#3000),.PCURVE_S1.);
+#2989 = LINE('',#2990,#2991);
+#2990 = CARTESIAN_POINT('',(-3.6725,8.34,2.56));
+#2991 = VECTOR('',#2992,1.);
+#2992 = DIRECTION('',(-1.,0.,0.));
+#2993 = PCURVE('',#2774,#2994);
+#2994 = DEFINITIONAL_REPRESENTATION('',(#2995),#2999);
+#2995 = LINE('',#2996,#2997);
+#2996 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#2997 = VECTOR('',#2998,1.);
+#2998 = DIRECTION('',(1.,1.676027028956E-59));
+#2999 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3000 = PCURVE('',#3001,#3006);
+#3001 = PLANE('',#3002);
+#3002 = AXIS2_PLACEMENT_3D('',#3003,#3004,#3005);
+#3003 = CARTESIAN_POINT('',(-3.56125,8.89,2.56));
+#3004 = DIRECTION('',(1.601195610168E-30,3.925633828627E-30,1.));
+#3005 = DIRECTION('',(0.,1.,-3.925633828627E-30));
+#3006 = DEFINITIONAL_REPRESENTATION('',(#3007),#3011);
+#3007 = LINE('',#3008,#3009);
+#3008 = CARTESIAN_POINT('',(-0.55,0.11125));
+#3009 = VECTOR('',#3010,1.);
+#3010 = DIRECTION('',(0.,1.));
+#3011 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3012 = ORIENTED_EDGE('',*,*,#3013,.F.);
+#3013 = EDGE_CURVE('',#2752,#2986,#3014,.T.);
+#3014 = SURFACE_CURVE('',#3015,(#3020,#3031),.PCURVE_S1.);
+#3015 = CIRCLE('',#3016,0.1375);
+#3016 = AXIS2_PLACEMENT_3D('',#3017,#3018,#3019);
+#3017 = CARTESIAN_POINT('',(-3.81,8.34,2.4225));
+#3018 = DIRECTION('',(-0.,1.,0.));
+#3019 = DIRECTION('',(0.,0.,-1.));
+#3020 = PCURVE('',#2774,#3021);
+#3021 = DEFINITIONAL_REPRESENTATION('',(#3022),#3030);
+#3022 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#3023,#3024,#3025,#3026,
+#3027,#3028,#3029),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2
+ ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786,
+6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE()
+GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,
+1.,0.5,1.)) REPRESENTATION_ITEM('') );
+#3023 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#3024 = CARTESIAN_POINT('',(0.323378776719,-0.703971790679));
+#3025 = CARTESIAN_POINT('',(0.204300283699,-0.910221790679));
+#3026 = CARTESIAN_POINT('',(8.522179067866E-02,-1.116471790679));
+#3027 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.910221790679));
+#3028 = CARTESIAN_POINT('',(-0.152935195362,-0.703971790679));
+#3029 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#3030 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3031 = PCURVE('',#2968,#3032);
+#3032 = DEFINITIONAL_REPRESENTATION('',(#3033),#3037);
+#3033 = LINE('',#3034,#3035);
+#3034 = CARTESIAN_POINT('',(1.570796326795,1.1));
+#3035 = VECTOR('',#3036,1.);
+#3036 = DIRECTION('',(-1.,0.));
+#3037 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3038 = ORIENTED_EDGE('',*,*,#2751,.T.);
+#3039 = ORIENTED_EDGE('',*,*,#3040,.F.);
+#3040 = EDGE_CURVE('',#3041,#2754,#3043,.T.);
+#3041 = VERTEX_POINT('',#3042);
+#3042 = CARTESIAN_POINT('',(-3.6725,8.34,0.275));
+#3043 = SURFACE_CURVE('',#3044,(#3048,#3055),.PCURVE_S1.);
+#3044 = LINE('',#3045,#3046);
+#3045 = CARTESIAN_POINT('',(-3.6725,8.34,0.275));
+#3046 = VECTOR('',#3047,1.);
+#3047 = DIRECTION('',(-1.,0.,0.));
+#3048 = PCURVE('',#2774,#3049);
+#3049 = DEFINITIONAL_REPRESENTATION('',(#3050),#3054);
+#3050 = LINE('',#3051,#3052);
+#3051 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#3052 = VECTOR('',#3053,1.);
+#3053 = DIRECTION('',(1.,1.676027028956E-59));
+#3054 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3055 = PCURVE('',#2802,#3056);
+#3056 = DEFINITIONAL_REPRESENTATION('',(#3057),#3061);
+#3057 = LINE('',#3058,#3059);
+#3058 = CARTESIAN_POINT('',(0.,0.));
+#3059 = VECTOR('',#3060,1.);
+#3060 = DIRECTION('',(0.,-1.));
+#3061 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3062 = ORIENTED_EDGE('',*,*,#3063,.F.);
+#3063 = EDGE_CURVE('',#3064,#3041,#3066,.T.);
+#3064 = VERTEX_POINT('',#3065);
+#3065 = CARTESIAN_POINT('',(-3.6725,8.34,2.285));
+#3066 = SURFACE_CURVE('',#3067,(#3071,#3078),.PCURVE_S1.);
+#3067 = LINE('',#3068,#3069);
+#3068 = CARTESIAN_POINT('',(-3.6725,8.34,2.56));
+#3069 = VECTOR('',#3070,1.);
+#3070 = DIRECTION('',(0.,0.,-1.));
+#3071 = PCURVE('',#2774,#3072);
+#3072 = DEFINITIONAL_REPRESENTATION('',(#3073),#3077);
+#3073 = LINE('',#3074,#3075);
+#3074 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#3075 = VECTOR('',#3076,1.);
+#3076 = DIRECTION('',(0.,1.));
+#3077 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3078 = PCURVE('',#3079,#3084);
+#3079 = PLANE('',#3080);
+#3080 = AXIS2_PLACEMENT_3D('',#3081,#3082,#3083);
+#3081 = CARTESIAN_POINT('',(-3.6725,8.89,-0.34105853382));
+#3082 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#3083 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#3084 = DEFINITIONAL_REPRESENTATION('',(#3085),#3089);
+#3085 = LINE('',#3086,#3087);
+#3086 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#3087 = VECTOR('',#3088,1.);
+#3088 = DIRECTION('',(0.,-1.));
+#3089 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3090 = ORIENTED_EDGE('',*,*,#3091,.T.);
+#3091 = EDGE_CURVE('',#3064,#3092,#3094,.T.);
+#3092 = VERTEX_POINT('',#3093);
+#3093 = CARTESIAN_POINT('',(-3.175,8.34,2.285));
+#3094 = SURFACE_CURVE('',#3095,(#3099,#3106),.PCURVE_S1.);
+#3095 = LINE('',#3096,#3097);
+#3096 = CARTESIAN_POINT('',(-3.6725,8.34,2.285));
+#3097 = VECTOR('',#3098,1.);
+#3098 = DIRECTION('',(1.,0.,0.));
+#3099 = PCURVE('',#2774,#3100);
+#3100 = DEFINITIONAL_REPRESENTATION('',(#3101),#3105);
+#3101 = LINE('',#3102,#3103);
+#3102 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.703971790679));
+#3103 = VECTOR('',#3104,1.);
+#3104 = DIRECTION('',(-1.,-1.676027028956E-59));
+#3105 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3106 = PCURVE('',#3107,#3112);
+#3107 = PLANE('',#3108);
+#3108 = AXIS2_PLACEMENT_3D('',#3109,#3110,#3111);
+#3109 = CARTESIAN_POINT('',(-3.6725,8.34,2.285));
+#3110 = DIRECTION('',(0.,0.,1.));
+#3111 = DIRECTION('',(1.,0.,0.));
+#3112 = DEFINITIONAL_REPRESENTATION('',(#3113),#3117);
+#3113 = LINE('',#3114,#3115);
+#3114 = CARTESIAN_POINT('',(0.,0.));
+#3115 = VECTOR('',#3116,1.);
+#3116 = DIRECTION('',(1.,0.));
+#3117 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3118 = ORIENTED_EDGE('',*,*,#3119,.T.);
+#3119 = EDGE_CURVE('',#3092,#2984,#3120,.T.);
+#3120 = SURFACE_CURVE('',#3121,(#3125,#3132),.PCURVE_S1.);
+#3121 = LINE('',#3122,#3123);
+#3122 = CARTESIAN_POINT('',(-3.175,8.34,2.285));
+#3123 = VECTOR('',#3124,1.);
+#3124 = DIRECTION('',(0.,0.,1.));
+#3125 = PCURVE('',#2774,#3126);
+#3126 = DEFINITIONAL_REPRESENTATION('',(#3127),#3131);
+#3127 = LINE('',#3128,#3129);
+#3128 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#3129 = VECTOR('',#3130,1.);
+#3130 = DIRECTION('',(0.,-1.));
+#3131 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3132 = PCURVE('',#3133,#3138);
+#3133 = PLANE('',#3134);
+#3134 = AXIS2_PLACEMENT_3D('',#3135,#3136,#3137);
+#3135 = CARTESIAN_POINT('',(-3.175,8.34,2.285));
+#3136 = DIRECTION('',(1.,0.,0.));
+#3137 = DIRECTION('',(0.,0.,1.));
+#3138 = DEFINITIONAL_REPRESENTATION('',(#3139),#3143);
+#3139 = LINE('',#3140,#3141);
+#3140 = CARTESIAN_POINT('',(0.,0.));
+#3141 = VECTOR('',#3142,1.);
+#3142 = DIRECTION('',(1.,0.));
+#3143 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3144 = ADVANCED_FACE('',(#3145),#2968,.T.);
+#3145 = FACE_BOUND('',#3146,.F.);
+#3146 = EDGE_LOOP('',(#3147,#3171,#3192,#3193));
+#3147 = ORIENTED_EDGE('',*,*,#3148,.T.);
+#3148 = EDGE_CURVE('',#2927,#3149,#3151,.T.);
+#3149 = VERTEX_POINT('',#3150);
+#3150 = CARTESIAN_POINT('',(-3.81,9.44,2.56));
+#3151 = SURFACE_CURVE('',#3152,(#3157,#3164),.PCURVE_S1.);
+#3152 = CIRCLE('',#3153,0.1375);
+#3153 = AXIS2_PLACEMENT_3D('',#3154,#3155,#3156);
+#3154 = CARTESIAN_POINT('',(-3.81,9.44,2.4225));
+#3155 = DIRECTION('',(-0.,1.,0.));
+#3156 = DIRECTION('',(0.,0.,-1.));
+#3157 = PCURVE('',#2968,#3158);
+#3158 = DEFINITIONAL_REPRESENTATION('',(#3159),#3163);
+#3159 = LINE('',#3160,#3161);
+#3160 = CARTESIAN_POINT('',(1.570796326795,3.552713678801E-15));
+#3161 = VECTOR('',#3162,1.);
+#3162 = DIRECTION('',(-1.,0.));
+#3163 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3164 = PCURVE('',#2942,#3165);
+#3165 = DEFINITIONAL_REPRESENTATION('',(#3166),#3170);
+#3166 = CIRCLE('',#3167,0.1375);
+#3167 = AXIS2_PLACEMENT_2D('',#3168,#3169);
+#3168 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#3169 = DIRECTION('',(0.,1.));
+#3170 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3171 = ORIENTED_EDGE('',*,*,#3172,.T.);
+#3172 = EDGE_CURVE('',#3149,#2986,#3173,.T.);
+#3173 = SURFACE_CURVE('',#3174,(#3178,#3185),.PCURVE_S1.);
+#3174 = LINE('',#3175,#3176);
+#3175 = CARTESIAN_POINT('',(-3.81,9.44,2.56));
+#3176 = VECTOR('',#3177,1.);
+#3177 = DIRECTION('',(0.,-1.,0.));
+#3178 = PCURVE('',#2968,#3179);
+#3179 = DEFINITIONAL_REPRESENTATION('',(#3180),#3184);
+#3180 = LINE('',#3181,#3182);
+#3181 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#3182 = VECTOR('',#3183,1.);
+#3183 = DIRECTION('',(-0.,1.));
+#3184 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3185 = PCURVE('',#3001,#3186);
+#3186 = DEFINITIONAL_REPRESENTATION('',(#3187),#3191);
+#3187 = LINE('',#3188,#3189);
+#3188 = CARTESIAN_POINT('',(0.55,0.24875));
+#3189 = VECTOR('',#3190,1.);
+#3190 = DIRECTION('',(-1.,-6.285707653525E-60));
+#3191 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3192 = ORIENTED_EDGE('',*,*,#3013,.F.);
+#3193 = ORIENTED_EDGE('',*,*,#2954,.F.);
+#3194 = ADVANCED_FACE('',(#3195),#2802,.T.);
+#3195 = FACE_BOUND('',#3196,.T.);
+#3196 = EDGE_LOOP('',(#3197,#3198,#3199,#3222));
+#3197 = ORIENTED_EDGE('',*,*,#3040,.T.);
+#3198 = ORIENTED_EDGE('',*,*,#2786,.T.);
+#3199 = ORIENTED_EDGE('',*,*,#3200,.F.);
+#3200 = EDGE_CURVE('',#3201,#2787,#3203,.T.);
+#3201 = VERTEX_POINT('',#3202);
+#3202 = CARTESIAN_POINT('',(-3.6725,8.615,0.));
+#3203 = SURFACE_CURVE('',#3204,(#3208,#3215),.PCURVE_S1.);
+#3204 = LINE('',#3205,#3206);
+#3205 = CARTESIAN_POINT('',(-3.6725,8.615,0.));
+#3206 = VECTOR('',#3207,1.);
+#3207 = DIRECTION('',(-1.,0.,0.));
+#3208 = PCURVE('',#2802,#3209);
+#3209 = DEFINITIONAL_REPRESENTATION('',(#3210),#3214);
+#3210 = LINE('',#3211,#3212);
+#3211 = CARTESIAN_POINT('',(0.388908729653,0.));
+#3212 = VECTOR('',#3213,1.);
+#3213 = DIRECTION('',(0.,-1.));
+#3214 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3215 = PCURVE('',#2830,#3216);
+#3216 = DEFINITIONAL_REPRESENTATION('',(#3217),#3221);
+#3217 = LINE('',#3218,#3219);
+#3218 = CARTESIAN_POINT('',(0.,0.));
+#3219 = VECTOR('',#3220,1.);
+#3220 = DIRECTION('',(0.,-1.));
+#3221 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3222 = ORIENTED_EDGE('',*,*,#3223,.F.);
+#3223 = EDGE_CURVE('',#3041,#3201,#3224,.T.);
+#3224 = SURFACE_CURVE('',#3225,(#3229,#3236),.PCURVE_S1.);
+#3225 = LINE('',#3226,#3227);
+#3226 = CARTESIAN_POINT('',(-3.6725,8.34,0.275));
+#3227 = VECTOR('',#3228,1.);
+#3228 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#3229 = PCURVE('',#2802,#3230);
+#3230 = DEFINITIONAL_REPRESENTATION('',(#3231),#3235);
+#3231 = LINE('',#3232,#3233);
+#3232 = CARTESIAN_POINT('',(0.,0.));
+#3233 = VECTOR('',#3234,1.);
+#3234 = DIRECTION('',(1.,0.));
+#3235 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3236 = PCURVE('',#3079,#3237);
+#3237 = DEFINITIONAL_REPRESENTATION('',(#3238),#3242);
+#3238 = LINE('',#3239,#3240);
+#3239 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#3240 = VECTOR('',#3241,1.);
+#3241 = DIRECTION('',(0.707106781187,-0.707106781187));
+#3242 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3243 = ADVANCED_FACE('',(#3244),#2942,.T.);
+#3244 = FACE_BOUND('',#3245,.T.);
+#3245 = EDGE_LOOP('',(#3246,#3247,#3248,#3271,#3294,#3317,#3340));
+#3246 = ORIENTED_EDGE('',*,*,#2926,.T.);
+#3247 = ORIENTED_EDGE('',*,*,#3148,.T.);
+#3248 = ORIENTED_EDGE('',*,*,#3249,.T.);
+#3249 = EDGE_CURVE('',#3149,#3250,#3252,.T.);
+#3250 = VERTEX_POINT('',#3251);
+#3251 = CARTESIAN_POINT('',(-3.175,9.44,2.56));
+#3252 = SURFACE_CURVE('',#3253,(#3257,#3264),.PCURVE_S1.);
+#3253 = LINE('',#3254,#3255);
+#3254 = CARTESIAN_POINT('',(-3.6725,9.44,2.56));
+#3255 = VECTOR('',#3256,1.);
+#3256 = DIRECTION('',(1.,0.,0.));
+#3257 = PCURVE('',#2942,#3258);
+#3258 = DEFINITIONAL_REPRESENTATION('',(#3259),#3263);
+#3259 = LINE('',#3260,#3261);
+#3260 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#3261 = VECTOR('',#3262,1.);
+#3262 = DIRECTION('',(1.,-6.050792998522E-59));
+#3263 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3264 = PCURVE('',#3001,#3265);
+#3265 = DEFINITIONAL_REPRESENTATION('',(#3266),#3270);
+#3266 = LINE('',#3267,#3268);
+#3267 = CARTESIAN_POINT('',(0.55,0.11125));
+#3268 = VECTOR('',#3269,1.);
+#3269 = DIRECTION('',(0.,-1.));
+#3270 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3271 = ORIENTED_EDGE('',*,*,#3272,.F.);
+#3272 = EDGE_CURVE('',#3273,#3250,#3275,.T.);
+#3273 = VERTEX_POINT('',#3274);
+#3274 = CARTESIAN_POINT('',(-3.175,9.44,2.285));
+#3275 = SURFACE_CURVE('',#3276,(#3280,#3287),.PCURVE_S1.);
+#3276 = LINE('',#3277,#3278);
+#3277 = CARTESIAN_POINT('',(-3.175,9.44,2.285));
+#3278 = VECTOR('',#3279,1.);
+#3279 = DIRECTION('',(0.,0.,1.));
+#3280 = PCURVE('',#2942,#3281);
+#3281 = DEFINITIONAL_REPRESENTATION('',(#3282),#3286);
+#3282 = LINE('',#3283,#3284);
+#3283 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#3284 = VECTOR('',#3285,1.);
+#3285 = DIRECTION('',(0.,-1.));
+#3286 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3287 = PCURVE('',#3133,#3288);
+#3288 = DEFINITIONAL_REPRESENTATION('',(#3289),#3293);
+#3289 = LINE('',#3290,#3291);
+#3290 = CARTESIAN_POINT('',(0.,-1.1));
+#3291 = VECTOR('',#3292,1.);
+#3292 = DIRECTION('',(1.,0.));
+#3293 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3294 = ORIENTED_EDGE('',*,*,#3295,.F.);
+#3295 = EDGE_CURVE('',#3296,#3273,#3298,.T.);
+#3296 = VERTEX_POINT('',#3297);
+#3297 = CARTESIAN_POINT('',(-3.6725,9.44,2.285));
+#3298 = SURFACE_CURVE('',#3299,(#3303,#3310),.PCURVE_S1.);
+#3299 = LINE('',#3300,#3301);
+#3300 = CARTESIAN_POINT('',(-3.6725,9.44,2.285));
+#3301 = VECTOR('',#3302,1.);
+#3302 = DIRECTION('',(1.,0.,0.));
+#3303 = PCURVE('',#2942,#3304);
+#3304 = DEFINITIONAL_REPRESENTATION('',(#3305),#3309);
+#3305 = LINE('',#3306,#3307);
+#3306 = CARTESIAN_POINT('',(5.227820932134E-02,-0.703971790679));
+#3307 = VECTOR('',#3308,1.);
+#3308 = DIRECTION('',(1.,-6.050792998522E-59));
+#3309 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3310 = PCURVE('',#3107,#3311);
+#3311 = DEFINITIONAL_REPRESENTATION('',(#3312),#3316);
+#3312 = LINE('',#3313,#3314);
+#3313 = CARTESIAN_POINT('',(0.,1.1));
+#3314 = VECTOR('',#3315,1.);
+#3315 = DIRECTION('',(1.,0.));
+#3316 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3317 = ORIENTED_EDGE('',*,*,#3318,.F.);
+#3318 = EDGE_CURVE('',#3319,#3296,#3321,.T.);
+#3319 = VERTEX_POINT('',#3320);
+#3320 = CARTESIAN_POINT('',(-3.6725,9.44,0.275));
+#3321 = SURFACE_CURVE('',#3322,(#3326,#3333),.PCURVE_S1.);
+#3322 = LINE('',#3323,#3324);
+#3323 = CARTESIAN_POINT('',(-3.6725,9.44,0.275));
+#3324 = VECTOR('',#3325,1.);
+#3325 = DIRECTION('',(0.,0.,1.));
+#3326 = PCURVE('',#2942,#3327);
+#3327 = DEFINITIONAL_REPRESENTATION('',(#3328),#3332);
+#3328 = LINE('',#3329,#3330);
+#3329 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#3330 = VECTOR('',#3331,1.);
+#3331 = DIRECTION('',(0.,-1.));
+#3332 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3333 = PCURVE('',#3079,#3334);
+#3334 = DEFINITIONAL_REPRESENTATION('',(#3335),#3339);
+#3335 = LINE('',#3336,#3337);
+#3336 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#3337 = VECTOR('',#3338,1.);
+#3338 = DIRECTION('',(0.,1.));
+#3339 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3340 = ORIENTED_EDGE('',*,*,#3341,.T.);
+#3341 = EDGE_CURVE('',#3319,#2899,#3342,.T.);
+#3342 = SURFACE_CURVE('',#3343,(#3347,#3354),.PCURVE_S1.);
+#3343 = LINE('',#3344,#3345);
+#3344 = CARTESIAN_POINT('',(-3.6725,9.44,0.275));
+#3345 = VECTOR('',#3346,1.);
+#3346 = DIRECTION('',(-1.,0.,0.));
+#3347 = PCURVE('',#2942,#3348);
+#3348 = DEFINITIONAL_REPRESENTATION('',(#3349),#3353);
+#3349 = LINE('',#3350,#3351);
+#3350 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#3351 = VECTOR('',#3352,1.);
+#3352 = DIRECTION('',(-1.,6.050792998522E-59));
+#3353 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3354 = PCURVE('',#2914,#3355);
+#3355 = DEFINITIONAL_REPRESENTATION('',(#3356),#3360);
+#3356 = LINE('',#3357,#3358);
+#3357 = CARTESIAN_POINT('',(0.388908729653,0.));
+#3358 = VECTOR('',#3359,1.);
+#3359 = DIRECTION('',(0.,-1.));
+#3360 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3361 = ADVANCED_FACE('',(#3362),#2830,.T.);
+#3362 = FACE_BOUND('',#3363,.T.);
+#3363 = EDGE_LOOP('',(#3364,#3365,#3366,#3389));
+#3364 = ORIENTED_EDGE('',*,*,#3200,.T.);
+#3365 = ORIENTED_EDGE('',*,*,#2814,.T.);
+#3366 = ORIENTED_EDGE('',*,*,#3367,.F.);
+#3367 = EDGE_CURVE('',#3368,#2815,#3370,.T.);
+#3368 = VERTEX_POINT('',#3369);
+#3369 = CARTESIAN_POINT('',(-3.6725,8.615,-3.5));
+#3370 = SURFACE_CURVE('',#3371,(#3375,#3382),.PCURVE_S1.);
+#3371 = LINE('',#3372,#3373);
+#3372 = CARTESIAN_POINT('',(-3.6725,8.615,-3.5));
+#3373 = VECTOR('',#3374,1.);
+#3374 = DIRECTION('',(-1.,0.,0.));
+#3375 = PCURVE('',#2830,#3376);
+#3376 = DEFINITIONAL_REPRESENTATION('',(#3377),#3381);
+#3377 = LINE('',#3378,#3379);
+#3378 = CARTESIAN_POINT('',(3.5,0.));
+#3379 = VECTOR('',#3380,1.);
+#3380 = DIRECTION('',(0.,-1.));
+#3381 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3382 = PCURVE('',#2858,#3383);
+#3383 = DEFINITIONAL_REPRESENTATION('',(#3384),#3388);
+#3384 = LINE('',#3385,#3386);
+#3385 = CARTESIAN_POINT('',(3.330669073875E-16,0.));
+#3386 = VECTOR('',#3387,1.);
+#3387 = DIRECTION('',(0.,-1.));
+#3388 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3389 = ORIENTED_EDGE('',*,*,#3390,.F.);
+#3390 = EDGE_CURVE('',#3201,#3368,#3391,.T.);
+#3391 = SURFACE_CURVE('',#3392,(#3396,#3403),.PCURVE_S1.);
+#3392 = LINE('',#3393,#3394);
+#3393 = CARTESIAN_POINT('',(-3.6725,8.615,0.));
+#3394 = VECTOR('',#3395,1.);
+#3395 = DIRECTION('',(0.,0.,-1.));
+#3396 = PCURVE('',#2830,#3397);
+#3397 = DEFINITIONAL_REPRESENTATION('',(#3398),#3402);
+#3398 = LINE('',#3399,#3400);
+#3399 = CARTESIAN_POINT('',(0.,0.));
+#3400 = VECTOR('',#3401,1.);
+#3401 = DIRECTION('',(1.,0.));
+#3402 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3403 = PCURVE('',#3079,#3404);
+#3404 = DEFINITIONAL_REPRESENTATION('',(#3405),#3409);
+#3405 = LINE('',#3406,#3407);
+#3406 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#3407 = VECTOR('',#3408,1.);
+#3408 = DIRECTION('',(0.,-1.));
+#3409 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3410 = ADVANCED_FACE('',(#3411),#2914,.T.);
+#3411 = FACE_BOUND('',#3412,.T.);
+#3412 = EDGE_LOOP('',(#3413,#3436,#3437,#3438));
+#3413 = ORIENTED_EDGE('',*,*,#3414,.T.);
+#3414 = EDGE_CURVE('',#3415,#2871,#3417,.T.);
+#3415 = VERTEX_POINT('',#3416);
+#3416 = CARTESIAN_POINT('',(-3.6725,9.165,0.));
+#3417 = SURFACE_CURVE('',#3418,(#3422,#3429),.PCURVE_S1.);
+#3418 = LINE('',#3419,#3420);
+#3419 = CARTESIAN_POINT('',(-3.6725,9.165,0.));
+#3420 = VECTOR('',#3421,1.);
+#3421 = DIRECTION('',(-1.,0.,0.));
+#3422 = PCURVE('',#2914,#3423);
+#3423 = DEFINITIONAL_REPRESENTATION('',(#3424),#3428);
+#3424 = LINE('',#3425,#3426);
+#3425 = CARTESIAN_POINT('',(-6.280369834735E-16,0.));
+#3426 = VECTOR('',#3427,1.);
+#3427 = DIRECTION('',(0.,-1.));
+#3428 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3429 = PCURVE('',#2886,#3430);
+#3430 = DEFINITIONAL_REPRESENTATION('',(#3431),#3435);
+#3431 = LINE('',#3432,#3433);
+#3432 = CARTESIAN_POINT('',(3.5,0.));
+#3433 = VECTOR('',#3434,1.);
+#3434 = DIRECTION('',(0.,-1.));
+#3435 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3436 = ORIENTED_EDGE('',*,*,#2898,.T.);
+#3437 = ORIENTED_EDGE('',*,*,#3341,.F.);
+#3438 = ORIENTED_EDGE('',*,*,#3439,.F.);
+#3439 = EDGE_CURVE('',#3415,#3319,#3440,.T.);
+#3440 = SURFACE_CURVE('',#3441,(#3445,#3452),.PCURVE_S1.);
+#3441 = LINE('',#3442,#3443);
+#3442 = CARTESIAN_POINT('',(-3.6725,9.165,0.));
+#3443 = VECTOR('',#3444,1.);
+#3444 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#3445 = PCURVE('',#2914,#3446);
+#3446 = DEFINITIONAL_REPRESENTATION('',(#3447),#3451);
+#3447 = LINE('',#3448,#3449);
+#3448 = CARTESIAN_POINT('',(0.,0.));
+#3449 = VECTOR('',#3450,1.);
+#3450 = DIRECTION('',(1.,0.));
+#3451 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3452 = PCURVE('',#3079,#3453);
+#3453 = DEFINITIONAL_REPRESENTATION('',(#3454),#3458);
+#3454 = LINE('',#3455,#3456);
+#3455 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#3456 = VECTOR('',#3457,1.);
+#3457 = DIRECTION('',(0.707106781187,0.707106781187));
+#3458 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3459 = ADVANCED_FACE('',(#3460),#2858,.T.);
+#3460 = FACE_BOUND('',#3461,.T.);
+#3461 = EDGE_LOOP('',(#3462,#3463,#3464,#3487));
+#3462 = ORIENTED_EDGE('',*,*,#3367,.T.);
+#3463 = ORIENTED_EDGE('',*,*,#2842,.T.);
+#3464 = ORIENTED_EDGE('',*,*,#3465,.F.);
+#3465 = EDGE_CURVE('',#3466,#2843,#3468,.T.);
+#3466 = VERTEX_POINT('',#3467);
+#3467 = CARTESIAN_POINT('',(-3.6725,9.165,-3.5));
+#3468 = SURFACE_CURVE('',#3469,(#3473,#3480),.PCURVE_S1.);
+#3469 = LINE('',#3470,#3471);
+#3470 = CARTESIAN_POINT('',(-3.6725,9.165,-3.5));
+#3471 = VECTOR('',#3472,1.);
+#3472 = DIRECTION('',(-1.,0.,0.));
+#3473 = PCURVE('',#2858,#3474);
+#3474 = DEFINITIONAL_REPRESENTATION('',(#3475),#3479);
+#3475 = LINE('',#3476,#3477);
+#3476 = CARTESIAN_POINT('',(0.55,0.));
+#3477 = VECTOR('',#3478,1.);
+#3478 = DIRECTION('',(0.,-1.));
+#3479 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3480 = PCURVE('',#2886,#3481);
+#3481 = DEFINITIONAL_REPRESENTATION('',(#3482),#3486);
+#3482 = LINE('',#3483,#3484);
+#3483 = CARTESIAN_POINT('',(0.,0.));
+#3484 = VECTOR('',#3485,1.);
+#3485 = DIRECTION('',(0.,-1.));
+#3486 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3487 = ORIENTED_EDGE('',*,*,#3488,.F.);
+#3488 = EDGE_CURVE('',#3368,#3466,#3489,.T.);
+#3489 = SURFACE_CURVE('',#3490,(#3494,#3501),.PCURVE_S1.);
+#3490 = LINE('',#3491,#3492);
+#3491 = CARTESIAN_POINT('',(-3.6725,8.615,-3.5));
+#3492 = VECTOR('',#3493,1.);
+#3493 = DIRECTION('',(0.,1.,0.));
+#3494 = PCURVE('',#2858,#3495);
+#3495 = DEFINITIONAL_REPRESENTATION('',(#3496),#3500);
+#3496 = LINE('',#3497,#3498);
+#3497 = CARTESIAN_POINT('',(0.,0.));
+#3498 = VECTOR('',#3499,1.);
+#3499 = DIRECTION('',(1.,0.));
+#3500 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3501 = PCURVE('',#3079,#3502);
+#3502 = DEFINITIONAL_REPRESENTATION('',(#3503),#3507);
+#3503 = LINE('',#3504,#3505);
+#3504 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#3505 = VECTOR('',#3506,1.);
+#3506 = DIRECTION('',(1.,-2.226071387182E-62));
+#3507 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3508 = ADVANCED_FACE('',(#3509),#2886,.T.);
+#3509 = FACE_BOUND('',#3510,.T.);
+#3510 = EDGE_LOOP('',(#3511,#3512,#3513,#3514));
+#3511 = ORIENTED_EDGE('',*,*,#3465,.T.);
+#3512 = ORIENTED_EDGE('',*,*,#2870,.T.);
+#3513 = ORIENTED_EDGE('',*,*,#3414,.F.);
+#3514 = ORIENTED_EDGE('',*,*,#3515,.F.);
+#3515 = EDGE_CURVE('',#3466,#3415,#3516,.T.);
+#3516 = SURFACE_CURVE('',#3517,(#3521,#3528),.PCURVE_S1.);
+#3517 = LINE('',#3518,#3519);
+#3518 = CARTESIAN_POINT('',(-3.6725,9.165,-3.5));
+#3519 = VECTOR('',#3520,1.);
+#3520 = DIRECTION('',(0.,0.,1.));
+#3521 = PCURVE('',#2886,#3522);
+#3522 = DEFINITIONAL_REPRESENTATION('',(#3523),#3527);
+#3523 = LINE('',#3524,#3525);
+#3524 = CARTESIAN_POINT('',(0.,0.));
+#3525 = VECTOR('',#3526,1.);
+#3526 = DIRECTION('',(1.,0.));
+#3527 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3528 = PCURVE('',#3079,#3529);
+#3529 = DEFINITIONAL_REPRESENTATION('',(#3530),#3534);
+#3530 = LINE('',#3531,#3532);
+#3531 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#3532 = VECTOR('',#3533,1.);
+#3533 = DIRECTION('',(0.,1.));
+#3534 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3535 = ADVANCED_FACE('',(#3536),#3001,.T.);
+#3536 = FACE_BOUND('',#3537,.T.);
+#3537 = EDGE_LOOP('',(#3538,#3539,#3560,#3561));
+#3538 = ORIENTED_EDGE('',*,*,#2983,.F.);
+#3539 = ORIENTED_EDGE('',*,*,#3540,.T.);
+#3540 = EDGE_CURVE('',#2984,#3250,#3541,.T.);
+#3541 = SURFACE_CURVE('',#3542,(#3546,#3553),.PCURVE_S1.);
+#3542 = LINE('',#3543,#3544);
+#3543 = CARTESIAN_POINT('',(-3.175,8.34,2.56));
+#3544 = VECTOR('',#3545,1.);
+#3545 = DIRECTION('',(0.,1.,0.));
+#3546 = PCURVE('',#3001,#3547);
+#3547 = DEFINITIONAL_REPRESENTATION('',(#3548),#3552);
+#3548 = LINE('',#3549,#3550);
+#3549 = CARTESIAN_POINT('',(-0.55,-0.38625));
+#3550 = VECTOR('',#3551,1.);
+#3551 = DIRECTION('',(1.,6.285707653525E-60));
+#3552 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3553 = PCURVE('',#3133,#3554);
+#3554 = DEFINITIONAL_REPRESENTATION('',(#3555),#3559);
+#3555 = LINE('',#3556,#3557);
+#3556 = CARTESIAN_POINT('',(0.275,0.));
+#3557 = VECTOR('',#3558,1.);
+#3558 = DIRECTION('',(0.,-1.));
+#3559 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3560 = ORIENTED_EDGE('',*,*,#3249,.F.);
+#3561 = ORIENTED_EDGE('',*,*,#3172,.T.);
+#3562 = ADVANCED_FACE('',(#3563),#3133,.T.);
+#3563 = FACE_BOUND('',#3564,.T.);
+#3564 = EDGE_LOOP('',(#3565,#3566,#3587,#3588));
+#3565 = ORIENTED_EDGE('',*,*,#3119,.F.);
+#3566 = ORIENTED_EDGE('',*,*,#3567,.T.);
+#3567 = EDGE_CURVE('',#3092,#3273,#3568,.T.);
+#3568 = SURFACE_CURVE('',#3569,(#3573,#3580),.PCURVE_S1.);
+#3569 = LINE('',#3570,#3571);
+#3570 = CARTESIAN_POINT('',(-3.175,8.34,2.285));
+#3571 = VECTOR('',#3572,1.);
+#3572 = DIRECTION('',(0.,1.,0.));
+#3573 = PCURVE('',#3133,#3574);
+#3574 = DEFINITIONAL_REPRESENTATION('',(#3575),#3579);
+#3575 = LINE('',#3576,#3577);
+#3576 = CARTESIAN_POINT('',(0.,0.));
+#3577 = VECTOR('',#3578,1.);
+#3578 = DIRECTION('',(0.,-1.));
+#3579 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3580 = PCURVE('',#3107,#3581);
+#3581 = DEFINITIONAL_REPRESENTATION('',(#3582),#3586);
+#3582 = LINE('',#3583,#3584);
+#3583 = CARTESIAN_POINT('',(0.4975,0.));
+#3584 = VECTOR('',#3585,1.);
+#3585 = DIRECTION('',(0.,1.));
+#3586 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3587 = ORIENTED_EDGE('',*,*,#3272,.T.);
+#3588 = ORIENTED_EDGE('',*,*,#3540,.F.);
+#3589 = ADVANCED_FACE('',(#3590),#3107,.F.);
+#3590 = FACE_BOUND('',#3591,.F.);
+#3591 = EDGE_LOOP('',(#3592,#3613,#3614,#3615));
+#3592 = ORIENTED_EDGE('',*,*,#3593,.F.);
+#3593 = EDGE_CURVE('',#3064,#3296,#3594,.T.);
+#3594 = SURFACE_CURVE('',#3595,(#3599,#3606),.PCURVE_S1.);
+#3595 = LINE('',#3596,#3597);
+#3596 = CARTESIAN_POINT('',(-3.6725,8.34,2.285));
+#3597 = VECTOR('',#3598,1.);
+#3598 = DIRECTION('',(0.,1.,0.));
+#3599 = PCURVE('',#3107,#3600);
+#3600 = DEFINITIONAL_REPRESENTATION('',(#3601),#3605);
+#3601 = LINE('',#3602,#3603);
+#3602 = CARTESIAN_POINT('',(0.,0.));
+#3603 = VECTOR('',#3604,1.);
+#3604 = DIRECTION('',(0.,1.));
+#3605 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3606 = PCURVE('',#3079,#3607);
+#3607 = DEFINITIONAL_REPRESENTATION('',(#3608),#3612);
+#3608 = LINE('',#3609,#3610);
+#3609 = CARTESIAN_POINT('',(-0.55,2.62605853382));
+#3610 = VECTOR('',#3611,1.);
+#3611 = DIRECTION('',(1.,-2.226071387182E-62));
+#3612 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3613 = ORIENTED_EDGE('',*,*,#3091,.T.);
+#3614 = ORIENTED_EDGE('',*,*,#3567,.T.);
+#3615 = ORIENTED_EDGE('',*,*,#3295,.F.);
+#3616 = ADVANCED_FACE('',(#3617),#3079,.T.);
+#3617 = FACE_BOUND('',#3618,.T.);
+#3618 = EDGE_LOOP('',(#3619,#3620,#3621,#3622,#3623,#3624,#3625,#3626));
+#3619 = ORIENTED_EDGE('',*,*,#3318,.T.);
+#3620 = ORIENTED_EDGE('',*,*,#3593,.F.);
+#3621 = ORIENTED_EDGE('',*,*,#3063,.T.);
+#3622 = ORIENTED_EDGE('',*,*,#3223,.T.);
+#3623 = ORIENTED_EDGE('',*,*,#3390,.T.);
+#3624 = ORIENTED_EDGE('',*,*,#3488,.T.);
+#3625 = ORIENTED_EDGE('',*,*,#3515,.T.);
+#3626 = ORIENTED_EDGE('',*,*,#3439,.T.);
+#3627 = MANIFOLD_SOLID_BREP('',#3628);
+#3628 = CLOSED_SHELL('',(#3629,#3861,#4026,#4076,#4125,#4243,#4292,#4341
+ ,#4390,#4417,#4444,#4471,#4498));
+#3629 = ADVANCED_FACE('',(#3630),#3644,.F.);
+#3630 = FACE_BOUND('',#3631,.F.);
+#3631 = EDGE_LOOP('',(#3632,#3667,#3695,#3723,#3751,#3779,#3807,#3835));
+#3632 = ORIENTED_EDGE('',*,*,#3633,.T.);
+#3633 = EDGE_CURVE('',#3634,#3636,#3638,.T.);
+#3634 = VERTEX_POINT('',#3635);
+#3635 = CARTESIAN_POINT('',(3.9475,9.44,2.4225));
+#3636 = VERTEX_POINT('',#3637);
+#3637 = CARTESIAN_POINT('',(3.9475,9.44,0.275));
+#3638 = SURFACE_CURVE('',#3639,(#3643,#3655),.PCURVE_S1.);
+#3639 = LINE('',#3640,#3641);
+#3640 = CARTESIAN_POINT('',(3.9475,9.44,2.56));
+#3641 = VECTOR('',#3642,1.);
+#3642 = DIRECTION('',(0.,0.,-1.));
+#3643 = PCURVE('',#3644,#3649);
+#3644 = PLANE('',#3645);
+#3645 = AXIS2_PLACEMENT_3D('',#3646,#3647,#3648);
+#3646 = CARTESIAN_POINT('',(3.9475,8.89,-0.34105853382));
+#3647 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#3648 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#3649 = DEFINITIONAL_REPRESENTATION('',(#3650),#3654);
+#3650 = LINE('',#3651,#3652);
+#3651 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#3652 = VECTOR('',#3653,1.);
+#3653 = DIRECTION('',(0.,-1.));
+#3654 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3655 = PCURVE('',#3656,#3661);
+#3656 = PLANE('',#3657);
+#3657 = AXIS2_PLACEMENT_3D('',#3658,#3659,#3660);
+#3658 = CARTESIAN_POINT('',(3.724778209321,9.44,1.581028209321));
+#3659 = DIRECTION('',(3.17453643318E-29,1.,2.111838454822E-30));
+#3660 = DIRECTION('',(1.,-3.17453643318E-29,0.));
+#3661 = DEFINITIONAL_REPRESENTATION('',(#3662),#3666);
+#3662 = LINE('',#3663,#3664);
+#3663 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#3664 = VECTOR('',#3665,1.);
+#3665 = DIRECTION('',(0.,1.));
+#3666 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3667 = ORIENTED_EDGE('',*,*,#3668,.T.);
+#3668 = EDGE_CURVE('',#3636,#3669,#3671,.T.);
+#3669 = VERTEX_POINT('',#3670);
+#3670 = CARTESIAN_POINT('',(3.9475,9.165,0.));
+#3671 = SURFACE_CURVE('',#3672,(#3676,#3683),.PCURVE_S1.);
+#3672 = LINE('',#3673,#3674);
+#3673 = CARTESIAN_POINT('',(3.9475,9.44,0.275));
+#3674 = VECTOR('',#3675,1.);
+#3675 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#3676 = PCURVE('',#3644,#3677);
+#3677 = DEFINITIONAL_REPRESENTATION('',(#3678),#3682);
+#3678 = LINE('',#3679,#3680);
+#3679 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#3680 = VECTOR('',#3681,1.);
+#3681 = DIRECTION('',(0.707106781187,-0.707106781187));
+#3682 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3683 = PCURVE('',#3684,#3689);
+#3684 = PLANE('',#3685);
+#3685 = AXIS2_PLACEMENT_3D('',#3686,#3687,#3688);
+#3686 = CARTESIAN_POINT('',(3.6725,9.44,0.275));
+#3687 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#3688 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#3689 = DEFINITIONAL_REPRESENTATION('',(#3690),#3694);
+#3690 = LINE('',#3691,#3692);
+#3691 = CARTESIAN_POINT('',(0.,-0.275));
+#3692 = VECTOR('',#3693,1.);
+#3693 = DIRECTION('',(1.,0.));
+#3694 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3695 = ORIENTED_EDGE('',*,*,#3696,.T.);
+#3696 = EDGE_CURVE('',#3669,#3697,#3699,.T.);
+#3697 = VERTEX_POINT('',#3698);
+#3698 = CARTESIAN_POINT('',(3.9475,9.165,-3.5));
+#3699 = SURFACE_CURVE('',#3700,(#3704,#3711),.PCURVE_S1.);
+#3700 = LINE('',#3701,#3702);
+#3701 = CARTESIAN_POINT('',(3.9475,9.165,0.));
+#3702 = VECTOR('',#3703,1.);
+#3703 = DIRECTION('',(0.,0.,-1.));
+#3704 = PCURVE('',#3644,#3705);
+#3705 = DEFINITIONAL_REPRESENTATION('',(#3706),#3710);
+#3706 = LINE('',#3707,#3708);
+#3707 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#3708 = VECTOR('',#3709,1.);
+#3709 = DIRECTION('',(0.,-1.));
+#3710 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3711 = PCURVE('',#3712,#3717);
+#3712 = PLANE('',#3713);
+#3713 = AXIS2_PLACEMENT_3D('',#3714,#3715,#3716);
+#3714 = CARTESIAN_POINT('',(3.6725,9.165,0.));
+#3715 = DIRECTION('',(0.,1.,0.));
+#3716 = DIRECTION('',(0.,0.,-1.));
+#3717 = DEFINITIONAL_REPRESENTATION('',(#3718),#3722);
+#3718 = LINE('',#3719,#3720);
+#3719 = CARTESIAN_POINT('',(0.,-0.275));
+#3720 = VECTOR('',#3721,1.);
+#3721 = DIRECTION('',(1.,0.));
+#3722 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3723 = ORIENTED_EDGE('',*,*,#3724,.T.);
+#3724 = EDGE_CURVE('',#3697,#3725,#3727,.T.);
+#3725 = VERTEX_POINT('',#3726);
+#3726 = CARTESIAN_POINT('',(3.9475,8.615,-3.5));
+#3727 = SURFACE_CURVE('',#3728,(#3732,#3739),.PCURVE_S1.);
+#3728 = LINE('',#3729,#3730);
+#3729 = CARTESIAN_POINT('',(3.9475,9.165,-3.5));
+#3730 = VECTOR('',#3731,1.);
+#3731 = DIRECTION('',(0.,-1.,0.));
+#3732 = PCURVE('',#3644,#3733);
+#3733 = DEFINITIONAL_REPRESENTATION('',(#3734),#3738);
+#3734 = LINE('',#3735,#3736);
+#3735 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#3736 = VECTOR('',#3737,1.);
+#3737 = DIRECTION('',(1.,2.226071387182E-62));
+#3738 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3739 = PCURVE('',#3740,#3745);
+#3740 = PLANE('',#3741);
+#3741 = AXIS2_PLACEMENT_3D('',#3742,#3743,#3744);
+#3742 = CARTESIAN_POINT('',(3.6725,9.165,-3.5));
+#3743 = DIRECTION('',(0.,0.,-1.));
+#3744 = DIRECTION('',(0.,-1.,0.));
+#3745 = DEFINITIONAL_REPRESENTATION('',(#3746),#3750);
+#3746 = LINE('',#3747,#3748);
+#3747 = CARTESIAN_POINT('',(0.,-0.275));
+#3748 = VECTOR('',#3749,1.);
+#3749 = DIRECTION('',(1.,0.));
+#3750 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3751 = ORIENTED_EDGE('',*,*,#3752,.T.);
+#3752 = EDGE_CURVE('',#3725,#3753,#3755,.T.);
+#3753 = VERTEX_POINT('',#3754);
+#3754 = CARTESIAN_POINT('',(3.9475,8.615,0.));
+#3755 = SURFACE_CURVE('',#3756,(#3760,#3767),.PCURVE_S1.);
+#3756 = LINE('',#3757,#3758);
+#3757 = CARTESIAN_POINT('',(3.9475,8.615,-3.5));
+#3758 = VECTOR('',#3759,1.);
+#3759 = DIRECTION('',(0.,0.,1.));
+#3760 = PCURVE('',#3644,#3761);
+#3761 = DEFINITIONAL_REPRESENTATION('',(#3762),#3766);
+#3762 = LINE('',#3763,#3764);
+#3763 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#3764 = VECTOR('',#3765,1.);
+#3765 = DIRECTION('',(0.,1.));
+#3766 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3767 = PCURVE('',#3768,#3773);
+#3768 = PLANE('',#3769);
+#3769 = AXIS2_PLACEMENT_3D('',#3770,#3771,#3772);
+#3770 = CARTESIAN_POINT('',(3.6725,8.615,-3.5));
+#3771 = DIRECTION('',(0.,-1.,0.));
+#3772 = DIRECTION('',(0.,0.,1.));
+#3773 = DEFINITIONAL_REPRESENTATION('',(#3774),#3778);
+#3774 = LINE('',#3775,#3776);
+#3775 = CARTESIAN_POINT('',(0.,-0.275));
+#3776 = VECTOR('',#3777,1.);
+#3777 = DIRECTION('',(1.,0.));
+#3778 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3779 = ORIENTED_EDGE('',*,*,#3780,.T.);
+#3780 = EDGE_CURVE('',#3753,#3781,#3783,.T.);
+#3781 = VERTEX_POINT('',#3782);
+#3782 = CARTESIAN_POINT('',(3.9475,8.34,0.275));
+#3783 = SURFACE_CURVE('',#3784,(#3788,#3795),.PCURVE_S1.);
+#3784 = LINE('',#3785,#3786);
+#3785 = CARTESIAN_POINT('',(3.9475,8.615,0.));
+#3786 = VECTOR('',#3787,1.);
+#3787 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#3788 = PCURVE('',#3644,#3789);
+#3789 = DEFINITIONAL_REPRESENTATION('',(#3790),#3794);
+#3790 = LINE('',#3791,#3792);
+#3791 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#3792 = VECTOR('',#3793,1.);
+#3793 = DIRECTION('',(0.707106781187,0.707106781187));
+#3794 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3795 = PCURVE('',#3796,#3801);
+#3796 = PLANE('',#3797);
+#3797 = AXIS2_PLACEMENT_3D('',#3798,#3799,#3800);
+#3798 = CARTESIAN_POINT('',(3.6725,8.615,0.));
+#3799 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#3800 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#3801 = DEFINITIONAL_REPRESENTATION('',(#3802),#3806);
+#3802 = LINE('',#3803,#3804);
+#3803 = CARTESIAN_POINT('',(0.,-0.275));
+#3804 = VECTOR('',#3805,1.);
+#3805 = DIRECTION('',(1.,0.));
+#3806 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3807 = ORIENTED_EDGE('',*,*,#3808,.T.);
+#3808 = EDGE_CURVE('',#3781,#3809,#3811,.T.);
+#3809 = VERTEX_POINT('',#3810);
+#3810 = CARTESIAN_POINT('',(3.9475,8.34,2.4225));
+#3811 = SURFACE_CURVE('',#3812,(#3816,#3823),.PCURVE_S1.);
+#3812 = LINE('',#3813,#3814);
+#3813 = CARTESIAN_POINT('',(3.9475,8.34,0.275));
+#3814 = VECTOR('',#3815,1.);
+#3815 = DIRECTION('',(0.,0.,1.));
+#3816 = PCURVE('',#3644,#3817);
+#3817 = DEFINITIONAL_REPRESENTATION('',(#3818),#3822);
+#3818 = LINE('',#3819,#3820);
+#3819 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#3820 = VECTOR('',#3821,1.);
+#3821 = DIRECTION('',(0.,1.));
+#3822 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3823 = PCURVE('',#3824,#3829);
+#3824 = PLANE('',#3825);
+#3825 = AXIS2_PLACEMENT_3D('',#3826,#3827,#3828);
+#3826 = CARTESIAN_POINT('',(3.724778209321,8.34,1.581028209321));
+#3827 = DIRECTION('',(1.308440111004E-29,-1.,1.156108129756E-30));
+#3828 = DIRECTION('',(-1.,-1.308440111004E-29,0.));
+#3829 = DEFINITIONAL_REPRESENTATION('',(#3830),#3834);
+#3830 = LINE('',#3831,#3832);
+#3831 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#3832 = VECTOR('',#3833,1.);
+#3833 = DIRECTION('',(0.,-1.));
+#3834 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3835 = ORIENTED_EDGE('',*,*,#3836,.T.);
+#3836 = EDGE_CURVE('',#3809,#3634,#3837,.T.);
+#3837 = SURFACE_CURVE('',#3838,(#3842,#3849),.PCURVE_S1.);
+#3838 = LINE('',#3839,#3840);
+#3839 = CARTESIAN_POINT('',(3.9475,8.34,2.4225));
+#3840 = VECTOR('',#3841,1.);
+#3841 = DIRECTION('',(0.,1.,0.));
+#3842 = PCURVE('',#3644,#3843);
+#3843 = DEFINITIONAL_REPRESENTATION('',(#3844),#3848);
+#3844 = LINE('',#3845,#3846);
+#3845 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#3846 = VECTOR('',#3847,1.);
+#3847 = DIRECTION('',(-1.,-2.226071387182E-62));
+#3848 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3849 = PCURVE('',#3850,#3855);
+#3850 = CYLINDRICAL_SURFACE('',#3851,0.1375);
+#3851 = AXIS2_PLACEMENT_3D('',#3852,#3853,#3854);
+#3852 = CARTESIAN_POINT('',(3.81,8.34,2.4225));
+#3853 = DIRECTION('',(0.,1.,0.));
+#3854 = DIRECTION('',(1.,0.,-9.8088568672E-33));
+#3855 = DEFINITIONAL_REPRESENTATION('',(#3856),#3860);
+#3856 = LINE('',#3857,#3858);
+#3857 = CARTESIAN_POINT('',(-0.,0.));
+#3858 = VECTOR('',#3859,1.);
+#3859 = DIRECTION('',(-0.,1.));
+#3860 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3861 = ADVANCED_FACE('',(#3862),#3656,.T.);
+#3862 = FACE_BOUND('',#3863,.T.);
+#3863 = EDGE_LOOP('',(#3864,#3894,#3920,#3921,#3944,#3972,#4000));
+#3864 = ORIENTED_EDGE('',*,*,#3865,.T.);
+#3865 = EDGE_CURVE('',#3866,#3868,#3870,.T.);
+#3866 = VERTEX_POINT('',#3867);
+#3867 = CARTESIAN_POINT('',(3.175,9.44,2.56));
+#3868 = VERTEX_POINT('',#3869);
+#3869 = CARTESIAN_POINT('',(3.81,9.44,2.56));
+#3870 = SURFACE_CURVE('',#3871,(#3875,#3882),.PCURVE_S1.);
+#3871 = LINE('',#3872,#3873);
+#3872 = CARTESIAN_POINT('',(3.6725,9.44,2.56));
+#3873 = VECTOR('',#3874,1.);
+#3874 = DIRECTION('',(1.,0.,0.));
+#3875 = PCURVE('',#3656,#3876);
+#3876 = DEFINITIONAL_REPRESENTATION('',(#3877),#3881);
+#3877 = LINE('',#3878,#3879);
+#3878 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#3879 = VECTOR('',#3880,1.);
+#3880 = DIRECTION('',(1.,6.704108115824E-59));
+#3881 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3882 = PCURVE('',#3883,#3888);
+#3883 = PLANE('',#3884);
+#3884 = AXIS2_PLACEMENT_3D('',#3885,#3886,#3887);
+#3885 = CARTESIAN_POINT('',(3.56125,8.89,2.56));
+#3886 = DIRECTION('',(-1.657312278749E-30,-1.304555144269E-30,1.));
+#3887 = DIRECTION('',(1.,0.,1.657312278749E-30));
+#3888 = DEFINITIONAL_REPRESENTATION('',(#3889),#3893);
+#3889 = LINE('',#3890,#3891);
+#3890 = CARTESIAN_POINT('',(0.11125,0.55));
+#3891 = VECTOR('',#3892,1.);
+#3892 = DIRECTION('',(1.,-2.162055258902E-60));
+#3893 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3894 = ORIENTED_EDGE('',*,*,#3895,.F.);
+#3895 = EDGE_CURVE('',#3634,#3868,#3896,.T.);
+#3896 = SURFACE_CURVE('',#3897,(#3902,#3913),.PCURVE_S1.);
+#3897 = CIRCLE('',#3898,0.1375);
+#3898 = AXIS2_PLACEMENT_3D('',#3899,#3900,#3901);
+#3899 = CARTESIAN_POINT('',(3.81,9.44,2.4225));
+#3900 = DIRECTION('',(0.,-1.,0.));
+#3901 = DIRECTION('',(0.,0.,1.));
+#3902 = PCURVE('',#3656,#3903);
+#3903 = DEFINITIONAL_REPRESENTATION('',(#3904),#3912);
+#3904 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#3905,#3906,#3907,#3908,
+#3909,#3910,#3911),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2
+ ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786,
+6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE()
+GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,
+1.,0.5,1.)) REPRESENTATION_ITEM('') );
+#3905 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#3906 = CARTESIAN_POINT('',(-0.152935195362,-0.978971790679));
+#3907 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.772721790679));
+#3908 = CARTESIAN_POINT('',(8.522179067866E-02,-0.566471790679));
+#3909 = CARTESIAN_POINT('',(0.204300283699,-0.772721790679));
+#3910 = CARTESIAN_POINT('',(0.323378776719,-0.978971790679));
+#3911 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#3912 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3913 = PCURVE('',#3850,#3914);
+#3914 = DEFINITIONAL_REPRESENTATION('',(#3915),#3919);
+#3915 = LINE('',#3916,#3917);
+#3916 = CARTESIAN_POINT('',(4.712388980385,1.1));
+#3917 = VECTOR('',#3918,1.);
+#3918 = DIRECTION('',(-1.,0.));
+#3919 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3920 = ORIENTED_EDGE('',*,*,#3633,.T.);
+#3921 = ORIENTED_EDGE('',*,*,#3922,.F.);
+#3922 = EDGE_CURVE('',#3923,#3636,#3925,.T.);
+#3923 = VERTEX_POINT('',#3924);
+#3924 = CARTESIAN_POINT('',(3.6725,9.44,0.275));
+#3925 = SURFACE_CURVE('',#3926,(#3930,#3937),.PCURVE_S1.);
+#3926 = LINE('',#3927,#3928);
+#3927 = CARTESIAN_POINT('',(3.6725,9.44,0.275));
+#3928 = VECTOR('',#3929,1.);
+#3929 = DIRECTION('',(1.,0.,0.));
+#3930 = PCURVE('',#3656,#3931);
+#3931 = DEFINITIONAL_REPRESENTATION('',(#3932),#3936);
+#3932 = LINE('',#3933,#3934);
+#3933 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#3934 = VECTOR('',#3935,1.);
+#3935 = DIRECTION('',(1.,6.704108115824E-59));
+#3936 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3937 = PCURVE('',#3684,#3938);
+#3938 = DEFINITIONAL_REPRESENTATION('',(#3939),#3943);
+#3939 = LINE('',#3940,#3941);
+#3940 = CARTESIAN_POINT('',(4.710277376051E-16,0.));
+#3941 = VECTOR('',#3942,1.);
+#3942 = DIRECTION('',(0.,-1.));
+#3943 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3944 = ORIENTED_EDGE('',*,*,#3945,.F.);
+#3945 = EDGE_CURVE('',#3946,#3923,#3948,.T.);
+#3946 = VERTEX_POINT('',#3947);
+#3947 = CARTESIAN_POINT('',(3.6725,9.44,2.285));
+#3948 = SURFACE_CURVE('',#3949,(#3953,#3960),.PCURVE_S1.);
+#3949 = LINE('',#3950,#3951);
+#3950 = CARTESIAN_POINT('',(3.6725,9.44,2.56));
+#3951 = VECTOR('',#3952,1.);
+#3952 = DIRECTION('',(0.,0.,-1.));
+#3953 = PCURVE('',#3656,#3954);
+#3954 = DEFINITIONAL_REPRESENTATION('',(#3955),#3959);
+#3955 = LINE('',#3956,#3957);
+#3956 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#3957 = VECTOR('',#3958,1.);
+#3958 = DIRECTION('',(0.,1.));
+#3959 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3960 = PCURVE('',#3961,#3966);
+#3961 = PLANE('',#3962);
+#3962 = AXIS2_PLACEMENT_3D('',#3963,#3964,#3965);
+#3963 = CARTESIAN_POINT('',(3.6725,8.89,-0.34105853382));
+#3964 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#3965 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#3966 = DEFINITIONAL_REPRESENTATION('',(#3967),#3971);
+#3967 = LINE('',#3968,#3969);
+#3968 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#3969 = VECTOR('',#3970,1.);
+#3970 = DIRECTION('',(0.,-1.));
+#3971 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3972 = ORIENTED_EDGE('',*,*,#3973,.F.);
+#3973 = EDGE_CURVE('',#3974,#3946,#3976,.T.);
+#3974 = VERTEX_POINT('',#3975);
+#3975 = CARTESIAN_POINT('',(3.175,9.44,2.285));
+#3976 = SURFACE_CURVE('',#3977,(#3981,#3988),.PCURVE_S1.);
+#3977 = LINE('',#3978,#3979);
+#3978 = CARTESIAN_POINT('',(3.175,9.44,2.285));
+#3979 = VECTOR('',#3980,1.);
+#3980 = DIRECTION('',(1.,0.,0.));
+#3981 = PCURVE('',#3656,#3982);
+#3982 = DEFINITIONAL_REPRESENTATION('',(#3983),#3987);
+#3983 = LINE('',#3984,#3985);
+#3984 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#3985 = VECTOR('',#3986,1.);
+#3986 = DIRECTION('',(1.,6.704108115824E-59));
+#3987 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#3988 = PCURVE('',#3989,#3994);
+#3989 = PLANE('',#3990);
+#3990 = AXIS2_PLACEMENT_3D('',#3991,#3992,#3993);
+#3991 = CARTESIAN_POINT('',(3.175,8.34,2.285));
+#3992 = DIRECTION('',(0.,0.,1.));
+#3993 = DIRECTION('',(1.,0.,0.));
+#3994 = DEFINITIONAL_REPRESENTATION('',(#3995),#3999);
+#3995 = LINE('',#3996,#3997);
+#3996 = CARTESIAN_POINT('',(0.,1.1));
+#3997 = VECTOR('',#3998,1.);
+#3998 = DIRECTION('',(1.,0.));
+#3999 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4000 = ORIENTED_EDGE('',*,*,#4001,.T.);
+#4001 = EDGE_CURVE('',#3974,#3866,#4002,.T.);
+#4002 = SURFACE_CURVE('',#4003,(#4007,#4014),.PCURVE_S1.);
+#4003 = LINE('',#4004,#4005);
+#4004 = CARTESIAN_POINT('',(3.175,9.44,2.285));
+#4005 = VECTOR('',#4006,1.);
+#4006 = DIRECTION('',(0.,0.,1.));
+#4007 = PCURVE('',#3656,#4008);
+#4008 = DEFINITIONAL_REPRESENTATION('',(#4009),#4013);
+#4009 = LINE('',#4010,#4011);
+#4010 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#4011 = VECTOR('',#4012,1.);
+#4012 = DIRECTION('',(0.,-1.));
+#4013 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4014 = PCURVE('',#4015,#4020);
+#4015 = PLANE('',#4016);
+#4016 = AXIS2_PLACEMENT_3D('',#4017,#4018,#4019);
+#4017 = CARTESIAN_POINT('',(3.175,8.34,2.285));
+#4018 = DIRECTION('',(1.,0.,0.));
+#4019 = DIRECTION('',(0.,0.,1.));
+#4020 = DEFINITIONAL_REPRESENTATION('',(#4021),#4025);
+#4021 = LINE('',#4022,#4023);
+#4022 = CARTESIAN_POINT('',(0.,-1.1));
+#4023 = VECTOR('',#4024,1.);
+#4024 = DIRECTION('',(1.,0.));
+#4025 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4026 = ADVANCED_FACE('',(#4027),#3850,.T.);
+#4027 = FACE_BOUND('',#4028,.F.);
+#4028 = EDGE_LOOP('',(#4029,#4053,#4074,#4075));
+#4029 = ORIENTED_EDGE('',*,*,#4030,.T.);
+#4030 = EDGE_CURVE('',#3809,#4031,#4033,.T.);
+#4031 = VERTEX_POINT('',#4032);
+#4032 = CARTESIAN_POINT('',(3.81,8.34,2.56));
+#4033 = SURFACE_CURVE('',#4034,(#4039,#4046),.PCURVE_S1.);
+#4034 = CIRCLE('',#4035,0.1375);
+#4035 = AXIS2_PLACEMENT_3D('',#4036,#4037,#4038);
+#4036 = CARTESIAN_POINT('',(3.81,8.34,2.4225));
+#4037 = DIRECTION('',(0.,-1.,0.));
+#4038 = DIRECTION('',(0.,0.,1.));
+#4039 = PCURVE('',#3850,#4040);
+#4040 = DEFINITIONAL_REPRESENTATION('',(#4041),#4045);
+#4041 = LINE('',#4042,#4043);
+#4042 = CARTESIAN_POINT('',(4.712388980385,-1.7763568394E-15));
+#4043 = VECTOR('',#4044,1.);
+#4044 = DIRECTION('',(-1.,0.));
+#4045 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4046 = PCURVE('',#3824,#4047);
+#4047 = DEFINITIONAL_REPRESENTATION('',(#4048),#4052);
+#4048 = CIRCLE('',#4049,0.1375);
+#4049 = AXIS2_PLACEMENT_2D('',#4050,#4051);
+#4050 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#4051 = DIRECTION('',(0.,-1.));
+#4052 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4053 = ORIENTED_EDGE('',*,*,#4054,.T.);
+#4054 = EDGE_CURVE('',#4031,#3868,#4055,.T.);
+#4055 = SURFACE_CURVE('',#4056,(#4060,#4067),.PCURVE_S1.);
+#4056 = LINE('',#4057,#4058);
+#4057 = CARTESIAN_POINT('',(3.81,8.34,2.56));
+#4058 = VECTOR('',#4059,1.);
+#4059 = DIRECTION('',(0.,1.,0.));
+#4060 = PCURVE('',#3850,#4061);
+#4061 = DEFINITIONAL_REPRESENTATION('',(#4062),#4066);
+#4062 = LINE('',#4063,#4064);
+#4063 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#4064 = VECTOR('',#4065,1.);
+#4065 = DIRECTION('',(-0.,1.));
+#4066 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4067 = PCURVE('',#3883,#4068);
+#4068 = DEFINITIONAL_REPRESENTATION('',(#4069),#4073);
+#4069 = LINE('',#4070,#4071);
+#4070 = CARTESIAN_POINT('',(0.24875,-0.55));
+#4071 = VECTOR('',#4072,1.);
+#4072 = DIRECTION('',(0.,1.));
+#4073 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4074 = ORIENTED_EDGE('',*,*,#3895,.F.);
+#4075 = ORIENTED_EDGE('',*,*,#3836,.F.);
+#4076 = ADVANCED_FACE('',(#4077),#3684,.T.);
+#4077 = FACE_BOUND('',#4078,.T.);
+#4078 = EDGE_LOOP('',(#4079,#4080,#4081,#4104));
+#4079 = ORIENTED_EDGE('',*,*,#3922,.T.);
+#4080 = ORIENTED_EDGE('',*,*,#3668,.T.);
+#4081 = ORIENTED_EDGE('',*,*,#4082,.F.);
+#4082 = EDGE_CURVE('',#4083,#3669,#4085,.T.);
+#4083 = VERTEX_POINT('',#4084);
+#4084 = CARTESIAN_POINT('',(3.6725,9.165,0.));
+#4085 = SURFACE_CURVE('',#4086,(#4090,#4097),.PCURVE_S1.);
+#4086 = LINE('',#4087,#4088);
+#4087 = CARTESIAN_POINT('',(3.6725,9.165,0.));
+#4088 = VECTOR('',#4089,1.);
+#4089 = DIRECTION('',(1.,0.,0.));
+#4090 = PCURVE('',#3684,#4091);
+#4091 = DEFINITIONAL_REPRESENTATION('',(#4092),#4096);
+#4092 = LINE('',#4093,#4094);
+#4093 = CARTESIAN_POINT('',(0.388908729653,0.));
+#4094 = VECTOR('',#4095,1.);
+#4095 = DIRECTION('',(0.,-1.));
+#4096 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4097 = PCURVE('',#3712,#4098);
+#4098 = DEFINITIONAL_REPRESENTATION('',(#4099),#4103);
+#4099 = LINE('',#4100,#4101);
+#4100 = CARTESIAN_POINT('',(0.,0.));
+#4101 = VECTOR('',#4102,1.);
+#4102 = DIRECTION('',(0.,-1.));
+#4103 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4104 = ORIENTED_EDGE('',*,*,#4105,.F.);
+#4105 = EDGE_CURVE('',#3923,#4083,#4106,.T.);
+#4106 = SURFACE_CURVE('',#4107,(#4111,#4118),.PCURVE_S1.);
+#4107 = LINE('',#4108,#4109);
+#4108 = CARTESIAN_POINT('',(3.6725,9.44,0.275));
+#4109 = VECTOR('',#4110,1.);
+#4110 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#4111 = PCURVE('',#3684,#4112);
+#4112 = DEFINITIONAL_REPRESENTATION('',(#4113),#4117);
+#4113 = LINE('',#4114,#4115);
+#4114 = CARTESIAN_POINT('',(0.,0.));
+#4115 = VECTOR('',#4116,1.);
+#4116 = DIRECTION('',(1.,0.));
+#4117 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4118 = PCURVE('',#3961,#4119);
+#4119 = DEFINITIONAL_REPRESENTATION('',(#4120),#4124);
+#4120 = LINE('',#4121,#4122);
+#4121 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#4122 = VECTOR('',#4123,1.);
+#4123 = DIRECTION('',(0.707106781187,-0.707106781187));
+#4124 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4125 = ADVANCED_FACE('',(#4126),#3824,.T.);
+#4126 = FACE_BOUND('',#4127,.T.);
+#4127 = EDGE_LOOP('',(#4128,#4129,#4130,#4153,#4176,#4199,#4222));
+#4128 = ORIENTED_EDGE('',*,*,#3808,.T.);
+#4129 = ORIENTED_EDGE('',*,*,#4030,.T.);
+#4130 = ORIENTED_EDGE('',*,*,#4131,.F.);
+#4131 = EDGE_CURVE('',#4132,#4031,#4134,.T.);
+#4132 = VERTEX_POINT('',#4133);
+#4133 = CARTESIAN_POINT('',(3.175,8.34,2.56));
+#4134 = SURFACE_CURVE('',#4135,(#4139,#4146),.PCURVE_S1.);
+#4135 = LINE('',#4136,#4137);
+#4136 = CARTESIAN_POINT('',(3.6725,8.34,2.56));
+#4137 = VECTOR('',#4138,1.);
+#4138 = DIRECTION('',(1.,0.,0.));
+#4139 = PCURVE('',#3824,#4140);
+#4140 = DEFINITIONAL_REPRESENTATION('',(#4141),#4145);
+#4141 = LINE('',#4142,#4143);
+#4142 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#4143 = VECTOR('',#4144,1.);
+#4144 = DIRECTION('',(-1.,1.51269824963E-59));
+#4145 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4146 = PCURVE('',#3883,#4147);
+#4147 = DEFINITIONAL_REPRESENTATION('',(#4148),#4152);
+#4148 = LINE('',#4149,#4150);
+#4149 = CARTESIAN_POINT('',(0.11125,-0.55));
+#4150 = VECTOR('',#4151,1.);
+#4151 = DIRECTION('',(1.,-2.162055258902E-60));
+#4152 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4153 = ORIENTED_EDGE('',*,*,#4154,.F.);
+#4154 = EDGE_CURVE('',#4155,#4132,#4157,.T.);
+#4155 = VERTEX_POINT('',#4156);
+#4156 = CARTESIAN_POINT('',(3.175,8.34,2.285));
+#4157 = SURFACE_CURVE('',#4158,(#4162,#4169),.PCURVE_S1.);
+#4158 = LINE('',#4159,#4160);
+#4159 = CARTESIAN_POINT('',(3.175,8.34,2.285));
+#4160 = VECTOR('',#4161,1.);
+#4161 = DIRECTION('',(0.,0.,1.));
+#4162 = PCURVE('',#3824,#4163);
+#4163 = DEFINITIONAL_REPRESENTATION('',(#4164),#4168);
+#4164 = LINE('',#4165,#4166);
+#4165 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#4166 = VECTOR('',#4167,1.);
+#4167 = DIRECTION('',(0.,-1.));
+#4168 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4169 = PCURVE('',#4015,#4170);
+#4170 = DEFINITIONAL_REPRESENTATION('',(#4171),#4175);
+#4171 = LINE('',#4172,#4173);
+#4172 = CARTESIAN_POINT('',(0.,0.));
+#4173 = VECTOR('',#4174,1.);
+#4174 = DIRECTION('',(1.,0.));
+#4175 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4176 = ORIENTED_EDGE('',*,*,#4177,.T.);
+#4177 = EDGE_CURVE('',#4155,#4178,#4180,.T.);
+#4178 = VERTEX_POINT('',#4179);
+#4179 = CARTESIAN_POINT('',(3.6725,8.34,2.285));
+#4180 = SURFACE_CURVE('',#4181,(#4185,#4192),.PCURVE_S1.);
+#4181 = LINE('',#4182,#4183);
+#4182 = CARTESIAN_POINT('',(3.175,8.34,2.285));
+#4183 = VECTOR('',#4184,1.);
+#4184 = DIRECTION('',(1.,0.,0.));
+#4185 = PCURVE('',#3824,#4186);
+#4186 = DEFINITIONAL_REPRESENTATION('',(#4187),#4191);
+#4187 = LINE('',#4188,#4189);
+#4188 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#4189 = VECTOR('',#4190,1.);
+#4190 = DIRECTION('',(-1.,1.51269824963E-59));
+#4191 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4192 = PCURVE('',#3989,#4193);
+#4193 = DEFINITIONAL_REPRESENTATION('',(#4194),#4198);
+#4194 = LINE('',#4195,#4196);
+#4195 = CARTESIAN_POINT('',(0.,0.));
+#4196 = VECTOR('',#4197,1.);
+#4197 = DIRECTION('',(1.,0.));
+#4198 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4199 = ORIENTED_EDGE('',*,*,#4200,.F.);
+#4200 = EDGE_CURVE('',#4201,#4178,#4203,.T.);
+#4201 = VERTEX_POINT('',#4202);
+#4202 = CARTESIAN_POINT('',(3.6725,8.34,0.275));
+#4203 = SURFACE_CURVE('',#4204,(#4208,#4215),.PCURVE_S1.);
+#4204 = LINE('',#4205,#4206);
+#4205 = CARTESIAN_POINT('',(3.6725,8.34,0.275));
+#4206 = VECTOR('',#4207,1.);
+#4207 = DIRECTION('',(0.,0.,1.));
+#4208 = PCURVE('',#3824,#4209);
+#4209 = DEFINITIONAL_REPRESENTATION('',(#4210),#4214);
+#4210 = LINE('',#4211,#4212);
+#4211 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#4212 = VECTOR('',#4213,1.);
+#4213 = DIRECTION('',(0.,-1.));
+#4214 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4215 = PCURVE('',#3961,#4216);
+#4216 = DEFINITIONAL_REPRESENTATION('',(#4217),#4221);
+#4217 = LINE('',#4218,#4219);
+#4218 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#4219 = VECTOR('',#4220,1.);
+#4220 = DIRECTION('',(0.,1.));
+#4221 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4222 = ORIENTED_EDGE('',*,*,#4223,.T.);
+#4223 = EDGE_CURVE('',#4201,#3781,#4224,.T.);
+#4224 = SURFACE_CURVE('',#4225,(#4229,#4236),.PCURVE_S1.);
+#4225 = LINE('',#4226,#4227);
+#4226 = CARTESIAN_POINT('',(3.6725,8.34,0.275));
+#4227 = VECTOR('',#4228,1.);
+#4228 = DIRECTION('',(1.,0.,0.));
+#4229 = PCURVE('',#3824,#4230);
+#4230 = DEFINITIONAL_REPRESENTATION('',(#4231),#4235);
+#4231 = LINE('',#4232,#4233);
+#4232 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#4233 = VECTOR('',#4234,1.);
+#4234 = DIRECTION('',(-1.,1.51269824963E-59));
+#4235 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4236 = PCURVE('',#3796,#4237);
+#4237 = DEFINITIONAL_REPRESENTATION('',(#4238),#4242);
+#4238 = LINE('',#4239,#4240);
+#4239 = CARTESIAN_POINT('',(0.388908729653,0.));
+#4240 = VECTOR('',#4241,1.);
+#4241 = DIRECTION('',(0.,-1.));
+#4242 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4243 = ADVANCED_FACE('',(#4244),#3712,.T.);
+#4244 = FACE_BOUND('',#4245,.T.);
+#4245 = EDGE_LOOP('',(#4246,#4247,#4248,#4271));
+#4246 = ORIENTED_EDGE('',*,*,#4082,.T.);
+#4247 = ORIENTED_EDGE('',*,*,#3696,.T.);
+#4248 = ORIENTED_EDGE('',*,*,#4249,.F.);
+#4249 = EDGE_CURVE('',#4250,#3697,#4252,.T.);
+#4250 = VERTEX_POINT('',#4251);
+#4251 = CARTESIAN_POINT('',(3.6725,9.165,-3.5));
+#4252 = SURFACE_CURVE('',#4253,(#4257,#4264),.PCURVE_S1.);
+#4253 = LINE('',#4254,#4255);
+#4254 = CARTESIAN_POINT('',(3.6725,9.165,-3.5));
+#4255 = VECTOR('',#4256,1.);
+#4256 = DIRECTION('',(1.,0.,0.));
+#4257 = PCURVE('',#3712,#4258);
+#4258 = DEFINITIONAL_REPRESENTATION('',(#4259),#4263);
+#4259 = LINE('',#4260,#4261);
+#4260 = CARTESIAN_POINT('',(3.5,0.));
+#4261 = VECTOR('',#4262,1.);
+#4262 = DIRECTION('',(0.,-1.));
+#4263 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4264 = PCURVE('',#3740,#4265);
+#4265 = DEFINITIONAL_REPRESENTATION('',(#4266),#4270);
+#4266 = LINE('',#4267,#4268);
+#4267 = CARTESIAN_POINT('',(7.771561172376E-16,0.));
+#4268 = VECTOR('',#4269,1.);
+#4269 = DIRECTION('',(0.,-1.));
+#4270 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4271 = ORIENTED_EDGE('',*,*,#4272,.F.);
+#4272 = EDGE_CURVE('',#4083,#4250,#4273,.T.);
+#4273 = SURFACE_CURVE('',#4274,(#4278,#4285),.PCURVE_S1.);
+#4274 = LINE('',#4275,#4276);
+#4275 = CARTESIAN_POINT('',(3.6725,9.165,0.));
+#4276 = VECTOR('',#4277,1.);
+#4277 = DIRECTION('',(0.,0.,-1.));
+#4278 = PCURVE('',#3712,#4279);
+#4279 = DEFINITIONAL_REPRESENTATION('',(#4280),#4284);
+#4280 = LINE('',#4281,#4282);
+#4281 = CARTESIAN_POINT('',(0.,0.));
+#4282 = VECTOR('',#4283,1.);
+#4283 = DIRECTION('',(1.,0.));
+#4284 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4285 = PCURVE('',#3961,#4286);
+#4286 = DEFINITIONAL_REPRESENTATION('',(#4287),#4291);
+#4287 = LINE('',#4288,#4289);
+#4288 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#4289 = VECTOR('',#4290,1.);
+#4290 = DIRECTION('',(0.,-1.));
+#4291 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4292 = ADVANCED_FACE('',(#4293),#3796,.T.);
+#4293 = FACE_BOUND('',#4294,.T.);
+#4294 = EDGE_LOOP('',(#4295,#4318,#4319,#4320));
+#4295 = ORIENTED_EDGE('',*,*,#4296,.T.);
+#4296 = EDGE_CURVE('',#4297,#3753,#4299,.T.);
+#4297 = VERTEX_POINT('',#4298);
+#4298 = CARTESIAN_POINT('',(3.6725,8.615,0.));
+#4299 = SURFACE_CURVE('',#4300,(#4304,#4311),.PCURVE_S1.);
+#4300 = LINE('',#4301,#4302);
+#4301 = CARTESIAN_POINT('',(3.6725,8.615,0.));
+#4302 = VECTOR('',#4303,1.);
+#4303 = DIRECTION('',(1.,0.,0.));
+#4304 = PCURVE('',#3796,#4305);
+#4305 = DEFINITIONAL_REPRESENTATION('',(#4306),#4310);
+#4306 = LINE('',#4307,#4308);
+#4307 = CARTESIAN_POINT('',(-1.177569344013E-16,0.));
+#4308 = VECTOR('',#4309,1.);
+#4309 = DIRECTION('',(0.,-1.));
+#4310 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4311 = PCURVE('',#3768,#4312);
+#4312 = DEFINITIONAL_REPRESENTATION('',(#4313),#4317);
+#4313 = LINE('',#4314,#4315);
+#4314 = CARTESIAN_POINT('',(3.5,0.));
+#4315 = VECTOR('',#4316,1.);
+#4316 = DIRECTION('',(0.,-1.));
+#4317 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4318 = ORIENTED_EDGE('',*,*,#3780,.T.);
+#4319 = ORIENTED_EDGE('',*,*,#4223,.F.);
+#4320 = ORIENTED_EDGE('',*,*,#4321,.F.);
+#4321 = EDGE_CURVE('',#4297,#4201,#4322,.T.);
+#4322 = SURFACE_CURVE('',#4323,(#4327,#4334),.PCURVE_S1.);
+#4323 = LINE('',#4324,#4325);
+#4324 = CARTESIAN_POINT('',(3.6725,8.615,0.));
+#4325 = VECTOR('',#4326,1.);
+#4326 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#4327 = PCURVE('',#3796,#4328);
+#4328 = DEFINITIONAL_REPRESENTATION('',(#4329),#4333);
+#4329 = LINE('',#4330,#4331);
+#4330 = CARTESIAN_POINT('',(0.,0.));
+#4331 = VECTOR('',#4332,1.);
+#4332 = DIRECTION('',(1.,0.));
+#4333 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4334 = PCURVE('',#3961,#4335);
+#4335 = DEFINITIONAL_REPRESENTATION('',(#4336),#4340);
+#4336 = LINE('',#4337,#4338);
+#4337 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#4338 = VECTOR('',#4339,1.);
+#4339 = DIRECTION('',(0.707106781187,0.707106781187));
+#4340 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4341 = ADVANCED_FACE('',(#4342),#3740,.T.);
+#4342 = FACE_BOUND('',#4343,.T.);
+#4343 = EDGE_LOOP('',(#4344,#4345,#4346,#4369));
+#4344 = ORIENTED_EDGE('',*,*,#4249,.T.);
+#4345 = ORIENTED_EDGE('',*,*,#3724,.T.);
+#4346 = ORIENTED_EDGE('',*,*,#4347,.F.);
+#4347 = EDGE_CURVE('',#4348,#3725,#4350,.T.);
+#4348 = VERTEX_POINT('',#4349);
+#4349 = CARTESIAN_POINT('',(3.6725,8.615,-3.5));
+#4350 = SURFACE_CURVE('',#4351,(#4355,#4362),.PCURVE_S1.);
+#4351 = LINE('',#4352,#4353);
+#4352 = CARTESIAN_POINT('',(3.6725,8.615,-3.5));
+#4353 = VECTOR('',#4354,1.);
+#4354 = DIRECTION('',(1.,0.,0.));
+#4355 = PCURVE('',#3740,#4356);
+#4356 = DEFINITIONAL_REPRESENTATION('',(#4357),#4361);
+#4357 = LINE('',#4358,#4359);
+#4358 = CARTESIAN_POINT('',(0.55,0.));
+#4359 = VECTOR('',#4360,1.);
+#4360 = DIRECTION('',(0.,-1.));
+#4361 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4362 = PCURVE('',#3768,#4363);
+#4363 = DEFINITIONAL_REPRESENTATION('',(#4364),#4368);
+#4364 = LINE('',#4365,#4366);
+#4365 = CARTESIAN_POINT('',(0.,0.));
+#4366 = VECTOR('',#4367,1.);
+#4367 = DIRECTION('',(0.,-1.));
+#4368 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4369 = ORIENTED_EDGE('',*,*,#4370,.F.);
+#4370 = EDGE_CURVE('',#4250,#4348,#4371,.T.);
+#4371 = SURFACE_CURVE('',#4372,(#4376,#4383),.PCURVE_S1.);
+#4372 = LINE('',#4373,#4374);
+#4373 = CARTESIAN_POINT('',(3.6725,9.165,-3.5));
+#4374 = VECTOR('',#4375,1.);
+#4375 = DIRECTION('',(0.,-1.,0.));
+#4376 = PCURVE('',#3740,#4377);
+#4377 = DEFINITIONAL_REPRESENTATION('',(#4378),#4382);
+#4378 = LINE('',#4379,#4380);
+#4379 = CARTESIAN_POINT('',(0.,-0.));
+#4380 = VECTOR('',#4381,1.);
+#4381 = DIRECTION('',(1.,0.));
+#4382 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4383 = PCURVE('',#3961,#4384);
+#4384 = DEFINITIONAL_REPRESENTATION('',(#4385),#4389);
+#4385 = LINE('',#4386,#4387);
+#4386 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#4387 = VECTOR('',#4388,1.);
+#4388 = DIRECTION('',(1.,2.226071387182E-62));
+#4389 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4390 = ADVANCED_FACE('',(#4391),#3768,.T.);
+#4391 = FACE_BOUND('',#4392,.T.);
+#4392 = EDGE_LOOP('',(#4393,#4394,#4395,#4396));
+#4393 = ORIENTED_EDGE('',*,*,#4347,.T.);
+#4394 = ORIENTED_EDGE('',*,*,#3752,.T.);
+#4395 = ORIENTED_EDGE('',*,*,#4296,.F.);
+#4396 = ORIENTED_EDGE('',*,*,#4397,.F.);
+#4397 = EDGE_CURVE('',#4348,#4297,#4398,.T.);
+#4398 = SURFACE_CURVE('',#4399,(#4403,#4410),.PCURVE_S1.);
+#4399 = LINE('',#4400,#4401);
+#4400 = CARTESIAN_POINT('',(3.6725,8.615,-3.5));
+#4401 = VECTOR('',#4402,1.);
+#4402 = DIRECTION('',(0.,0.,1.));
+#4403 = PCURVE('',#3768,#4404);
+#4404 = DEFINITIONAL_REPRESENTATION('',(#4405),#4409);
+#4405 = LINE('',#4406,#4407);
+#4406 = CARTESIAN_POINT('',(0.,0.));
+#4407 = VECTOR('',#4408,1.);
+#4408 = DIRECTION('',(1.,0.));
+#4409 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4410 = PCURVE('',#3961,#4411);
+#4411 = DEFINITIONAL_REPRESENTATION('',(#4412),#4416);
+#4412 = LINE('',#4413,#4414);
+#4413 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#4414 = VECTOR('',#4415,1.);
+#4415 = DIRECTION('',(0.,1.));
+#4416 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4417 = ADVANCED_FACE('',(#4418),#3883,.T.);
+#4418 = FACE_BOUND('',#4419,.T.);
+#4419 = EDGE_LOOP('',(#4420,#4421,#4422,#4423));
+#4420 = ORIENTED_EDGE('',*,*,#4131,.T.);
+#4421 = ORIENTED_EDGE('',*,*,#4054,.T.);
+#4422 = ORIENTED_EDGE('',*,*,#3865,.F.);
+#4423 = ORIENTED_EDGE('',*,*,#4424,.F.);
+#4424 = EDGE_CURVE('',#4132,#3866,#4425,.T.);
+#4425 = SURFACE_CURVE('',#4426,(#4430,#4437),.PCURVE_S1.);
+#4426 = LINE('',#4427,#4428);
+#4427 = CARTESIAN_POINT('',(3.175,8.34,2.56));
+#4428 = VECTOR('',#4429,1.);
+#4429 = DIRECTION('',(0.,1.,0.));
+#4430 = PCURVE('',#3883,#4431);
+#4431 = DEFINITIONAL_REPRESENTATION('',(#4432),#4436);
+#4432 = LINE('',#4433,#4434);
+#4433 = CARTESIAN_POINT('',(-0.38625,-0.55));
+#4434 = VECTOR('',#4435,1.);
+#4435 = DIRECTION('',(0.,1.));
+#4436 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4437 = PCURVE('',#4015,#4438);
+#4438 = DEFINITIONAL_REPRESENTATION('',(#4439),#4443);
+#4439 = LINE('',#4440,#4441);
+#4440 = CARTESIAN_POINT('',(0.275,0.));
+#4441 = VECTOR('',#4442,1.);
+#4442 = DIRECTION('',(0.,-1.));
+#4443 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4444 = ADVANCED_FACE('',(#4445),#4015,.F.);
+#4445 = FACE_BOUND('',#4446,.F.);
+#4446 = EDGE_LOOP('',(#4447,#4448,#4469,#4470));
+#4447 = ORIENTED_EDGE('',*,*,#4154,.F.);
+#4448 = ORIENTED_EDGE('',*,*,#4449,.T.);
+#4449 = EDGE_CURVE('',#4155,#3974,#4450,.T.);
+#4450 = SURFACE_CURVE('',#4451,(#4455,#4462),.PCURVE_S1.);
+#4451 = LINE('',#4452,#4453);
+#4452 = CARTESIAN_POINT('',(3.175,8.34,2.285));
+#4453 = VECTOR('',#4454,1.);
+#4454 = DIRECTION('',(0.,1.,0.));
+#4455 = PCURVE('',#4015,#4456);
+#4456 = DEFINITIONAL_REPRESENTATION('',(#4457),#4461);
+#4457 = LINE('',#4458,#4459);
+#4458 = CARTESIAN_POINT('',(0.,0.));
+#4459 = VECTOR('',#4460,1.);
+#4460 = DIRECTION('',(0.,-1.));
+#4461 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4462 = PCURVE('',#3989,#4463);
+#4463 = DEFINITIONAL_REPRESENTATION('',(#4464),#4468);
+#4464 = LINE('',#4465,#4466);
+#4465 = CARTESIAN_POINT('',(0.,0.));
+#4466 = VECTOR('',#4467,1.);
+#4467 = DIRECTION('',(0.,1.));
+#4468 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4469 = ORIENTED_EDGE('',*,*,#4001,.T.);
+#4470 = ORIENTED_EDGE('',*,*,#4424,.F.);
+#4471 = ADVANCED_FACE('',(#4472),#3989,.F.);
+#4472 = FACE_BOUND('',#4473,.F.);
+#4473 = EDGE_LOOP('',(#4474,#4475,#4476,#4497));
+#4474 = ORIENTED_EDGE('',*,*,#4449,.F.);
+#4475 = ORIENTED_EDGE('',*,*,#4177,.T.);
+#4476 = ORIENTED_EDGE('',*,*,#4477,.T.);
+#4477 = EDGE_CURVE('',#4178,#3946,#4478,.T.);
+#4478 = SURFACE_CURVE('',#4479,(#4483,#4490),.PCURVE_S1.);
+#4479 = LINE('',#4480,#4481);
+#4480 = CARTESIAN_POINT('',(3.6725,8.34,2.285));
+#4481 = VECTOR('',#4482,1.);
+#4482 = DIRECTION('',(0.,1.,0.));
+#4483 = PCURVE('',#3989,#4484);
+#4484 = DEFINITIONAL_REPRESENTATION('',(#4485),#4489);
+#4485 = LINE('',#4486,#4487);
+#4486 = CARTESIAN_POINT('',(0.4975,0.));
+#4487 = VECTOR('',#4488,1.);
+#4488 = DIRECTION('',(0.,1.));
+#4489 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4490 = PCURVE('',#3961,#4491);
+#4491 = DEFINITIONAL_REPRESENTATION('',(#4492),#4496);
+#4492 = LINE('',#4493,#4494);
+#4493 = CARTESIAN_POINT('',(0.55,2.62605853382));
+#4494 = VECTOR('',#4495,1.);
+#4495 = DIRECTION('',(-1.,-2.226071387182E-62));
+#4496 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4497 = ORIENTED_EDGE('',*,*,#3973,.F.);
+#4498 = ADVANCED_FACE('',(#4499),#3961,.T.);
+#4499 = FACE_BOUND('',#4500,.T.);
+#4500 = EDGE_LOOP('',(#4501,#4502,#4503,#4504,#4505,#4506,#4507,#4508));
+#4501 = ORIENTED_EDGE('',*,*,#4200,.T.);
+#4502 = ORIENTED_EDGE('',*,*,#4477,.T.);
+#4503 = ORIENTED_EDGE('',*,*,#3945,.T.);
+#4504 = ORIENTED_EDGE('',*,*,#4105,.T.);
+#4505 = ORIENTED_EDGE('',*,*,#4272,.T.);
+#4506 = ORIENTED_EDGE('',*,*,#4370,.T.);
+#4507 = ORIENTED_EDGE('',*,*,#4397,.T.);
+#4508 = ORIENTED_EDGE('',*,*,#4321,.T.);
+#4509 = MANIFOLD_SOLID_BREP('',#4510);
+#4510 = CLOSED_SHELL('',(#4511,#4743,#4908,#4958,#5007,#5125,#5174,#5223
+ ,#5272,#5299,#5326,#5353,#5380));
+#4511 = ADVANCED_FACE('',(#4512),#4526,.F.);
+#4512 = FACE_BOUND('',#4513,.F.);
+#4513 = EDGE_LOOP('',(#4514,#4549,#4577,#4605,#4633,#4661,#4689,#4717));
+#4514 = ORIENTED_EDGE('',*,*,#4515,.T.);
+#4515 = EDGE_CURVE('',#4516,#4518,#4520,.T.);
+#4516 = VERTEX_POINT('',#4517);
+#4517 = CARTESIAN_POINT('',(-3.9475,5.8,2.4225));
+#4518 = VERTEX_POINT('',#4519);
+#4519 = CARTESIAN_POINT('',(-3.9475,5.8,0.275));
+#4520 = SURFACE_CURVE('',#4521,(#4525,#4537),.PCURVE_S1.);
+#4521 = LINE('',#4522,#4523);
+#4522 = CARTESIAN_POINT('',(-3.9475,5.8,2.56));
+#4523 = VECTOR('',#4524,1.);
+#4524 = DIRECTION('',(0.,0.,-1.));
+#4525 = PCURVE('',#4526,#4531);
+#4526 = PLANE('',#4527);
+#4527 = AXIS2_PLACEMENT_3D('',#4528,#4529,#4530);
+#4528 = CARTESIAN_POINT('',(-3.9475,6.35,-0.34105853382));
+#4529 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#4530 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#4531 = DEFINITIONAL_REPRESENTATION('',(#4532),#4536);
+#4532 = LINE('',#4533,#4534);
+#4533 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#4534 = VECTOR('',#4535,1.);
+#4535 = DIRECTION('',(0.,-1.));
+#4536 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4537 = PCURVE('',#4538,#4543);
+#4538 = PLANE('',#4539);
+#4539 = AXIS2_PLACEMENT_3D('',#4540,#4541,#4542);
+#4540 = CARTESIAN_POINT('',(-3.724778209321,5.8,1.581028209321));
+#4541 = DIRECTION('',(1.58726821659E-29,-1.,-1.055919227411E-30));
+#4542 = DIRECTION('',(-1.,-1.58726821659E-29,0.));
+#4543 = DEFINITIONAL_REPRESENTATION('',(#4544),#4548);
+#4544 = LINE('',#4545,#4546);
+#4545 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#4546 = VECTOR('',#4547,1.);
+#4547 = DIRECTION('',(0.,1.));
+#4548 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4549 = ORIENTED_EDGE('',*,*,#4550,.T.);
+#4550 = EDGE_CURVE('',#4518,#4551,#4553,.T.);
+#4551 = VERTEX_POINT('',#4552);
+#4552 = CARTESIAN_POINT('',(-3.9475,6.075,0.));
+#4553 = SURFACE_CURVE('',#4554,(#4558,#4565),.PCURVE_S1.);
+#4554 = LINE('',#4555,#4556);
+#4555 = CARTESIAN_POINT('',(-3.9475,5.8,0.275));
+#4556 = VECTOR('',#4557,1.);
+#4557 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#4558 = PCURVE('',#4526,#4559);
+#4559 = DEFINITIONAL_REPRESENTATION('',(#4560),#4564);
+#4560 = LINE('',#4561,#4562);
+#4561 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#4562 = VECTOR('',#4563,1.);
+#4563 = DIRECTION('',(0.707106781187,-0.707106781187));
+#4564 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4565 = PCURVE('',#4566,#4571);
+#4566 = PLANE('',#4567);
+#4567 = AXIS2_PLACEMENT_3D('',#4568,#4569,#4570);
+#4568 = CARTESIAN_POINT('',(-3.6725,5.8,0.275));
+#4569 = DIRECTION('',(-0.,-0.707106781187,-0.707106781187));
+#4570 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#4571 = DEFINITIONAL_REPRESENTATION('',(#4572),#4576);
+#4572 = LINE('',#4573,#4574);
+#4573 = CARTESIAN_POINT('',(0.,-0.275));
+#4574 = VECTOR('',#4575,1.);
+#4575 = DIRECTION('',(1.,0.));
+#4576 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4577 = ORIENTED_EDGE('',*,*,#4578,.T.);
+#4578 = EDGE_CURVE('',#4551,#4579,#4581,.T.);
+#4579 = VERTEX_POINT('',#4580);
+#4580 = CARTESIAN_POINT('',(-3.9475,6.075,-3.5));
+#4581 = SURFACE_CURVE('',#4582,(#4586,#4593),.PCURVE_S1.);
+#4582 = LINE('',#4583,#4584);
+#4583 = CARTESIAN_POINT('',(-3.9475,6.075,0.));
+#4584 = VECTOR('',#4585,1.);
+#4585 = DIRECTION('',(0.,0.,-1.));
+#4586 = PCURVE('',#4526,#4587);
+#4587 = DEFINITIONAL_REPRESENTATION('',(#4588),#4592);
+#4588 = LINE('',#4589,#4590);
+#4589 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#4590 = VECTOR('',#4591,1.);
+#4591 = DIRECTION('',(0.,-1.));
+#4592 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4593 = PCURVE('',#4594,#4599);
+#4594 = PLANE('',#4595);
+#4595 = AXIS2_PLACEMENT_3D('',#4596,#4597,#4598);
+#4596 = CARTESIAN_POINT('',(-3.6725,6.075,0.));
+#4597 = DIRECTION('',(-0.,-1.,-0.));
+#4598 = DIRECTION('',(0.,0.,-1.));
+#4599 = DEFINITIONAL_REPRESENTATION('',(#4600),#4604);
+#4600 = LINE('',#4601,#4602);
+#4601 = CARTESIAN_POINT('',(0.,-0.275));
+#4602 = VECTOR('',#4603,1.);
+#4603 = DIRECTION('',(1.,0.));
+#4604 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4605 = ORIENTED_EDGE('',*,*,#4606,.T.);
+#4606 = EDGE_CURVE('',#4579,#4607,#4609,.T.);
+#4607 = VERTEX_POINT('',#4608);
+#4608 = CARTESIAN_POINT('',(-3.9475,6.625,-3.5));
+#4609 = SURFACE_CURVE('',#4610,(#4614,#4621),.PCURVE_S1.);
+#4610 = LINE('',#4611,#4612);
+#4611 = CARTESIAN_POINT('',(-3.9475,6.075,-3.5));
+#4612 = VECTOR('',#4613,1.);
+#4613 = DIRECTION('',(0.,1.,0.));
+#4614 = PCURVE('',#4526,#4615);
+#4615 = DEFINITIONAL_REPRESENTATION('',(#4616),#4620);
+#4616 = LINE('',#4617,#4618);
+#4617 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#4618 = VECTOR('',#4619,1.);
+#4619 = DIRECTION('',(1.,-2.226071387182E-62));
+#4620 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4621 = PCURVE('',#4622,#4627);
+#4622 = PLANE('',#4623);
+#4623 = AXIS2_PLACEMENT_3D('',#4624,#4625,#4626);
+#4624 = CARTESIAN_POINT('',(-3.6725,6.075,-3.5));
+#4625 = DIRECTION('',(0.,0.,-1.));
+#4626 = DIRECTION('',(0.,1.,0.));
+#4627 = DEFINITIONAL_REPRESENTATION('',(#4628),#4632);
+#4628 = LINE('',#4629,#4630);
+#4629 = CARTESIAN_POINT('',(0.,-0.275));
+#4630 = VECTOR('',#4631,1.);
+#4631 = DIRECTION('',(1.,0.));
+#4632 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4633 = ORIENTED_EDGE('',*,*,#4634,.T.);
+#4634 = EDGE_CURVE('',#4607,#4635,#4637,.T.);
+#4635 = VERTEX_POINT('',#4636);
+#4636 = CARTESIAN_POINT('',(-3.9475,6.625,0.));
+#4637 = SURFACE_CURVE('',#4638,(#4642,#4649),.PCURVE_S1.);
+#4638 = LINE('',#4639,#4640);
+#4639 = CARTESIAN_POINT('',(-3.9475,6.625,-3.5));
+#4640 = VECTOR('',#4641,1.);
+#4641 = DIRECTION('',(0.,0.,1.));
+#4642 = PCURVE('',#4526,#4643);
+#4643 = DEFINITIONAL_REPRESENTATION('',(#4644),#4648);
+#4644 = LINE('',#4645,#4646);
+#4645 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#4646 = VECTOR('',#4647,1.);
+#4647 = DIRECTION('',(0.,1.));
+#4648 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4649 = PCURVE('',#4650,#4655);
+#4650 = PLANE('',#4651);
+#4651 = AXIS2_PLACEMENT_3D('',#4652,#4653,#4654);
+#4652 = CARTESIAN_POINT('',(-3.6725,6.625,-3.5));
+#4653 = DIRECTION('',(0.,1.,0.));
+#4654 = DIRECTION('',(0.,0.,1.));
+#4655 = DEFINITIONAL_REPRESENTATION('',(#4656),#4660);
+#4656 = LINE('',#4657,#4658);
+#4657 = CARTESIAN_POINT('',(0.,-0.275));
+#4658 = VECTOR('',#4659,1.);
+#4659 = DIRECTION('',(1.,0.));
+#4660 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4661 = ORIENTED_EDGE('',*,*,#4662,.T.);
+#4662 = EDGE_CURVE('',#4635,#4663,#4665,.T.);
+#4663 = VERTEX_POINT('',#4664);
+#4664 = CARTESIAN_POINT('',(-3.9475,6.9,0.275));
+#4665 = SURFACE_CURVE('',#4666,(#4670,#4677),.PCURVE_S1.);
+#4666 = LINE('',#4667,#4668);
+#4667 = CARTESIAN_POINT('',(-3.9475,6.625,0.));
+#4668 = VECTOR('',#4669,1.);
+#4669 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#4670 = PCURVE('',#4526,#4671);
+#4671 = DEFINITIONAL_REPRESENTATION('',(#4672),#4676);
+#4672 = LINE('',#4673,#4674);
+#4673 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#4674 = VECTOR('',#4675,1.);
+#4675 = DIRECTION('',(0.707106781187,0.707106781187));
+#4676 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4677 = PCURVE('',#4678,#4683);
+#4678 = PLANE('',#4679);
+#4679 = AXIS2_PLACEMENT_3D('',#4680,#4681,#4682);
+#4680 = CARTESIAN_POINT('',(-3.6725,6.625,0.));
+#4681 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#4682 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#4683 = DEFINITIONAL_REPRESENTATION('',(#4684),#4688);
+#4684 = LINE('',#4685,#4686);
+#4685 = CARTESIAN_POINT('',(0.,-0.275));
+#4686 = VECTOR('',#4687,1.);
+#4687 = DIRECTION('',(1.,0.));
+#4688 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4689 = ORIENTED_EDGE('',*,*,#4690,.T.);
+#4690 = EDGE_CURVE('',#4663,#4691,#4693,.T.);
+#4691 = VERTEX_POINT('',#4692);
+#4692 = CARTESIAN_POINT('',(-3.9475,6.9,2.4225));
+#4693 = SURFACE_CURVE('',#4694,(#4698,#4705),.PCURVE_S1.);
+#4694 = LINE('',#4695,#4696);
+#4695 = CARTESIAN_POINT('',(-3.9475,6.9,0.275));
+#4696 = VECTOR('',#4697,1.);
+#4697 = DIRECTION('',(0.,0.,1.));
+#4698 = PCURVE('',#4526,#4699);
+#4699 = DEFINITIONAL_REPRESENTATION('',(#4700),#4704);
+#4700 = LINE('',#4701,#4702);
+#4701 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#4702 = VECTOR('',#4703,1.);
+#4703 = DIRECTION('',(0.,1.));
+#4704 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4705 = PCURVE('',#4706,#4711);
+#4706 = PLANE('',#4707);
+#4707 = AXIS2_PLACEMENT_3D('',#4708,#4709,#4710);
+#4708 = CARTESIAN_POINT('',(-3.724778209321,6.9,1.581028209321));
+#4709 = DIRECTION('',(2.616880222009E-29,1.,-2.312216259511E-30));
+#4710 = DIRECTION('',(1.,-2.616880222009E-29,0.));
+#4711 = DEFINITIONAL_REPRESENTATION('',(#4712),#4716);
+#4712 = LINE('',#4713,#4714);
+#4713 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#4714 = VECTOR('',#4715,1.);
+#4715 = DIRECTION('',(0.,-1.));
+#4716 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4717 = ORIENTED_EDGE('',*,*,#4718,.T.);
+#4718 = EDGE_CURVE('',#4691,#4516,#4719,.T.);
+#4719 = SURFACE_CURVE('',#4720,(#4724,#4731),.PCURVE_S1.);
+#4720 = LINE('',#4721,#4722);
+#4721 = CARTESIAN_POINT('',(-3.9475,6.9,2.4225));
+#4722 = VECTOR('',#4723,1.);
+#4723 = DIRECTION('',(0.,-1.,0.));
+#4724 = PCURVE('',#4526,#4725);
+#4725 = DEFINITIONAL_REPRESENTATION('',(#4726),#4730);
+#4726 = LINE('',#4727,#4728);
+#4727 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#4728 = VECTOR('',#4729,1.);
+#4729 = DIRECTION('',(-1.,2.226071387182E-62));
+#4730 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4731 = PCURVE('',#4732,#4737);
+#4732 = CYLINDRICAL_SURFACE('',#4733,0.1375);
+#4733 = AXIS2_PLACEMENT_3D('',#4734,#4735,#4736);
+#4734 = CARTESIAN_POINT('',(-3.81,6.9,2.4225));
+#4735 = DIRECTION('',(0.,-1.,0.));
+#4736 = DIRECTION('',(-1.,-0.,-9.8088568672E-33));
+#4737 = DEFINITIONAL_REPRESENTATION('',(#4738),#4742);
+#4738 = LINE('',#4739,#4740);
+#4739 = CARTESIAN_POINT('',(-0.,0.));
+#4740 = VECTOR('',#4741,1.);
+#4741 = DIRECTION('',(-0.,1.));
+#4742 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4743 = ADVANCED_FACE('',(#4744),#4538,.T.);
+#4744 = FACE_BOUND('',#4745,.T.);
+#4745 = EDGE_LOOP('',(#4746,#4776,#4802,#4803,#4826,#4854,#4882));
+#4746 = ORIENTED_EDGE('',*,*,#4747,.T.);
+#4747 = EDGE_CURVE('',#4748,#4750,#4752,.T.);
+#4748 = VERTEX_POINT('',#4749);
+#4749 = CARTESIAN_POINT('',(-3.175,5.8,2.56));
+#4750 = VERTEX_POINT('',#4751);
+#4751 = CARTESIAN_POINT('',(-3.81,5.8,2.56));
+#4752 = SURFACE_CURVE('',#4753,(#4757,#4764),.PCURVE_S1.);
+#4753 = LINE('',#4754,#4755);
+#4754 = CARTESIAN_POINT('',(-3.6725,5.8,2.56));
+#4755 = VECTOR('',#4756,1.);
+#4756 = DIRECTION('',(-1.,0.,0.));
+#4757 = PCURVE('',#4538,#4758);
+#4758 = DEFINITIONAL_REPRESENTATION('',(#4759),#4763);
+#4759 = LINE('',#4760,#4761);
+#4760 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#4761 = VECTOR('',#4762,1.);
+#4762 = DIRECTION('',(1.,1.676027028956E-59));
+#4763 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4764 = PCURVE('',#4765,#4770);
+#4765 = PLANE('',#4766);
+#4766 = AXIS2_PLACEMENT_3D('',#4767,#4768,#4769);
+#4767 = CARTESIAN_POINT('',(-3.56125,6.35,2.56));
+#4768 = DIRECTION('',(1.601195610168E-30,3.925633828627E-30,1.));
+#4769 = DIRECTION('',(0.,1.,-3.925633828627E-30));
+#4770 = DEFINITIONAL_REPRESENTATION('',(#4771),#4775);
+#4771 = LINE('',#4772,#4773);
+#4772 = CARTESIAN_POINT('',(-0.55,0.11125));
+#4773 = VECTOR('',#4774,1.);
+#4774 = DIRECTION('',(0.,1.));
+#4775 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4776 = ORIENTED_EDGE('',*,*,#4777,.F.);
+#4777 = EDGE_CURVE('',#4516,#4750,#4778,.T.);
+#4778 = SURFACE_CURVE('',#4779,(#4784,#4795),.PCURVE_S1.);
+#4779 = CIRCLE('',#4780,0.1375);
+#4780 = AXIS2_PLACEMENT_3D('',#4781,#4782,#4783);
+#4781 = CARTESIAN_POINT('',(-3.81,5.8,2.4225));
+#4782 = DIRECTION('',(-0.,1.,0.));
+#4783 = DIRECTION('',(0.,0.,-1.));
+#4784 = PCURVE('',#4538,#4785);
+#4785 = DEFINITIONAL_REPRESENTATION('',(#4786),#4794);
+#4786 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#4787,#4788,#4789,#4790,
+#4791,#4792,#4793),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2
+ ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786,
+6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE()
+GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,
+1.,0.5,1.)) REPRESENTATION_ITEM('') );
+#4787 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#4788 = CARTESIAN_POINT('',(0.323378776719,-0.703971790679));
+#4789 = CARTESIAN_POINT('',(0.204300283699,-0.910221790679));
+#4790 = CARTESIAN_POINT('',(8.522179067866E-02,-1.116471790679));
+#4791 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.910221790679));
+#4792 = CARTESIAN_POINT('',(-0.152935195362,-0.703971790679));
+#4793 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#4794 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4795 = PCURVE('',#4732,#4796);
+#4796 = DEFINITIONAL_REPRESENTATION('',(#4797),#4801);
+#4797 = LINE('',#4798,#4799);
+#4798 = CARTESIAN_POINT('',(1.570796326795,1.1));
+#4799 = VECTOR('',#4800,1.);
+#4800 = DIRECTION('',(-1.,0.));
+#4801 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4802 = ORIENTED_EDGE('',*,*,#4515,.T.);
+#4803 = ORIENTED_EDGE('',*,*,#4804,.F.);
+#4804 = EDGE_CURVE('',#4805,#4518,#4807,.T.);
+#4805 = VERTEX_POINT('',#4806);
+#4806 = CARTESIAN_POINT('',(-3.6725,5.8,0.275));
+#4807 = SURFACE_CURVE('',#4808,(#4812,#4819),.PCURVE_S1.);
+#4808 = LINE('',#4809,#4810);
+#4809 = CARTESIAN_POINT('',(-3.6725,5.8,0.275));
+#4810 = VECTOR('',#4811,1.);
+#4811 = DIRECTION('',(-1.,0.,0.));
+#4812 = PCURVE('',#4538,#4813);
+#4813 = DEFINITIONAL_REPRESENTATION('',(#4814),#4818);
+#4814 = LINE('',#4815,#4816);
+#4815 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#4816 = VECTOR('',#4817,1.);
+#4817 = DIRECTION('',(1.,1.676027028956E-59));
+#4818 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4819 = PCURVE('',#4566,#4820);
+#4820 = DEFINITIONAL_REPRESENTATION('',(#4821),#4825);
+#4821 = LINE('',#4822,#4823);
+#4822 = CARTESIAN_POINT('',(0.,0.));
+#4823 = VECTOR('',#4824,1.);
+#4824 = DIRECTION('',(0.,-1.));
+#4825 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4826 = ORIENTED_EDGE('',*,*,#4827,.F.);
+#4827 = EDGE_CURVE('',#4828,#4805,#4830,.T.);
+#4828 = VERTEX_POINT('',#4829);
+#4829 = CARTESIAN_POINT('',(-3.6725,5.8,2.285));
+#4830 = SURFACE_CURVE('',#4831,(#4835,#4842),.PCURVE_S1.);
+#4831 = LINE('',#4832,#4833);
+#4832 = CARTESIAN_POINT('',(-3.6725,5.8,2.56));
+#4833 = VECTOR('',#4834,1.);
+#4834 = DIRECTION('',(0.,0.,-1.));
+#4835 = PCURVE('',#4538,#4836);
+#4836 = DEFINITIONAL_REPRESENTATION('',(#4837),#4841);
+#4837 = LINE('',#4838,#4839);
+#4838 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#4839 = VECTOR('',#4840,1.);
+#4840 = DIRECTION('',(0.,1.));
+#4841 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4842 = PCURVE('',#4843,#4848);
+#4843 = PLANE('',#4844);
+#4844 = AXIS2_PLACEMENT_3D('',#4845,#4846,#4847);
+#4845 = CARTESIAN_POINT('',(-3.6725,6.35,-0.34105853382));
+#4846 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#4847 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#4848 = DEFINITIONAL_REPRESENTATION('',(#4849),#4853);
+#4849 = LINE('',#4850,#4851);
+#4850 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#4851 = VECTOR('',#4852,1.);
+#4852 = DIRECTION('',(0.,-1.));
+#4853 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4854 = ORIENTED_EDGE('',*,*,#4855,.T.);
+#4855 = EDGE_CURVE('',#4828,#4856,#4858,.T.);
+#4856 = VERTEX_POINT('',#4857);
+#4857 = CARTESIAN_POINT('',(-3.175,5.8,2.285));
+#4858 = SURFACE_CURVE('',#4859,(#4863,#4870),.PCURVE_S1.);
+#4859 = LINE('',#4860,#4861);
+#4860 = CARTESIAN_POINT('',(-3.6725,5.8,2.285));
+#4861 = VECTOR('',#4862,1.);
+#4862 = DIRECTION('',(1.,0.,0.));
+#4863 = PCURVE('',#4538,#4864);
+#4864 = DEFINITIONAL_REPRESENTATION('',(#4865),#4869);
+#4865 = LINE('',#4866,#4867);
+#4866 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.703971790679));
+#4867 = VECTOR('',#4868,1.);
+#4868 = DIRECTION('',(-1.,-1.676027028956E-59));
+#4869 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4870 = PCURVE('',#4871,#4876);
+#4871 = PLANE('',#4872);
+#4872 = AXIS2_PLACEMENT_3D('',#4873,#4874,#4875);
+#4873 = CARTESIAN_POINT('',(-3.6725,5.8,2.285));
+#4874 = DIRECTION('',(0.,0.,1.));
+#4875 = DIRECTION('',(1.,0.,0.));
+#4876 = DEFINITIONAL_REPRESENTATION('',(#4877),#4881);
+#4877 = LINE('',#4878,#4879);
+#4878 = CARTESIAN_POINT('',(0.,0.));
+#4879 = VECTOR('',#4880,1.);
+#4880 = DIRECTION('',(1.,0.));
+#4881 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4882 = ORIENTED_EDGE('',*,*,#4883,.T.);
+#4883 = EDGE_CURVE('',#4856,#4748,#4884,.T.);
+#4884 = SURFACE_CURVE('',#4885,(#4889,#4896),.PCURVE_S1.);
+#4885 = LINE('',#4886,#4887);
+#4886 = CARTESIAN_POINT('',(-3.175,5.8,2.285));
+#4887 = VECTOR('',#4888,1.);
+#4888 = DIRECTION('',(0.,0.,1.));
+#4889 = PCURVE('',#4538,#4890);
+#4890 = DEFINITIONAL_REPRESENTATION('',(#4891),#4895);
+#4891 = LINE('',#4892,#4893);
+#4892 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#4893 = VECTOR('',#4894,1.);
+#4894 = DIRECTION('',(0.,-1.));
+#4895 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4896 = PCURVE('',#4897,#4902);
+#4897 = PLANE('',#4898);
+#4898 = AXIS2_PLACEMENT_3D('',#4899,#4900,#4901);
+#4899 = CARTESIAN_POINT('',(-3.175,5.8,2.285));
+#4900 = DIRECTION('',(1.,0.,0.));
+#4901 = DIRECTION('',(0.,0.,1.));
+#4902 = DEFINITIONAL_REPRESENTATION('',(#4903),#4907);
+#4903 = LINE('',#4904,#4905);
+#4904 = CARTESIAN_POINT('',(0.,0.));
+#4905 = VECTOR('',#4906,1.);
+#4906 = DIRECTION('',(1.,0.));
+#4907 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4908 = ADVANCED_FACE('',(#4909),#4732,.T.);
+#4909 = FACE_BOUND('',#4910,.F.);
+#4910 = EDGE_LOOP('',(#4911,#4935,#4956,#4957));
+#4911 = ORIENTED_EDGE('',*,*,#4912,.T.);
+#4912 = EDGE_CURVE('',#4691,#4913,#4915,.T.);
+#4913 = VERTEX_POINT('',#4914);
+#4914 = CARTESIAN_POINT('',(-3.81,6.9,2.56));
+#4915 = SURFACE_CURVE('',#4916,(#4921,#4928),.PCURVE_S1.);
+#4916 = CIRCLE('',#4917,0.1375);
+#4917 = AXIS2_PLACEMENT_3D('',#4918,#4919,#4920);
+#4918 = CARTESIAN_POINT('',(-3.81,6.9,2.4225));
+#4919 = DIRECTION('',(-0.,1.,0.));
+#4920 = DIRECTION('',(0.,0.,-1.));
+#4921 = PCURVE('',#4732,#4922);
+#4922 = DEFINITIONAL_REPRESENTATION('',(#4923),#4927);
+#4923 = LINE('',#4924,#4925);
+#4924 = CARTESIAN_POINT('',(1.570796326795,3.552713678801E-15));
+#4925 = VECTOR('',#4926,1.);
+#4926 = DIRECTION('',(-1.,0.));
+#4927 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4928 = PCURVE('',#4706,#4929);
+#4929 = DEFINITIONAL_REPRESENTATION('',(#4930),#4934);
+#4930 = CIRCLE('',#4931,0.1375);
+#4931 = AXIS2_PLACEMENT_2D('',#4932,#4933);
+#4932 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#4933 = DIRECTION('',(0.,1.));
+#4934 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4935 = ORIENTED_EDGE('',*,*,#4936,.T.);
+#4936 = EDGE_CURVE('',#4913,#4750,#4937,.T.);
+#4937 = SURFACE_CURVE('',#4938,(#4942,#4949),.PCURVE_S1.);
+#4938 = LINE('',#4939,#4940);
+#4939 = CARTESIAN_POINT('',(-3.81,6.9,2.56));
+#4940 = VECTOR('',#4941,1.);
+#4941 = DIRECTION('',(0.,-1.,0.));
+#4942 = PCURVE('',#4732,#4943);
+#4943 = DEFINITIONAL_REPRESENTATION('',(#4944),#4948);
+#4944 = LINE('',#4945,#4946);
+#4945 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#4946 = VECTOR('',#4947,1.);
+#4947 = DIRECTION('',(-0.,1.));
+#4948 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4949 = PCURVE('',#4765,#4950);
+#4950 = DEFINITIONAL_REPRESENTATION('',(#4951),#4955);
+#4951 = LINE('',#4952,#4953);
+#4952 = CARTESIAN_POINT('',(0.55,0.24875));
+#4953 = VECTOR('',#4954,1.);
+#4954 = DIRECTION('',(-1.,-6.285707653525E-60));
+#4955 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4956 = ORIENTED_EDGE('',*,*,#4777,.F.);
+#4957 = ORIENTED_EDGE('',*,*,#4718,.F.);
+#4958 = ADVANCED_FACE('',(#4959),#4566,.T.);
+#4959 = FACE_BOUND('',#4960,.T.);
+#4960 = EDGE_LOOP('',(#4961,#4962,#4963,#4986));
+#4961 = ORIENTED_EDGE('',*,*,#4804,.T.);
+#4962 = ORIENTED_EDGE('',*,*,#4550,.T.);
+#4963 = ORIENTED_EDGE('',*,*,#4964,.F.);
+#4964 = EDGE_CURVE('',#4965,#4551,#4967,.T.);
+#4965 = VERTEX_POINT('',#4966);
+#4966 = CARTESIAN_POINT('',(-3.6725,6.075,0.));
+#4967 = SURFACE_CURVE('',#4968,(#4972,#4979),.PCURVE_S1.);
+#4968 = LINE('',#4969,#4970);
+#4969 = CARTESIAN_POINT('',(-3.6725,6.075,0.));
+#4970 = VECTOR('',#4971,1.);
+#4971 = DIRECTION('',(-1.,0.,0.));
+#4972 = PCURVE('',#4566,#4973);
+#4973 = DEFINITIONAL_REPRESENTATION('',(#4974),#4978);
+#4974 = LINE('',#4975,#4976);
+#4975 = CARTESIAN_POINT('',(0.388908729653,0.));
+#4976 = VECTOR('',#4977,1.);
+#4977 = DIRECTION('',(0.,-1.));
+#4978 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4979 = PCURVE('',#4594,#4980);
+#4980 = DEFINITIONAL_REPRESENTATION('',(#4981),#4985);
+#4981 = LINE('',#4982,#4983);
+#4982 = CARTESIAN_POINT('',(0.,0.));
+#4983 = VECTOR('',#4984,1.);
+#4984 = DIRECTION('',(0.,-1.));
+#4985 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#4986 = ORIENTED_EDGE('',*,*,#4987,.F.);
+#4987 = EDGE_CURVE('',#4805,#4965,#4988,.T.);
+#4988 = SURFACE_CURVE('',#4989,(#4993,#5000),.PCURVE_S1.);
+#4989 = LINE('',#4990,#4991);
+#4990 = CARTESIAN_POINT('',(-3.6725,5.8,0.275));
+#4991 = VECTOR('',#4992,1.);
+#4992 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#4993 = PCURVE('',#4566,#4994);
+#4994 = DEFINITIONAL_REPRESENTATION('',(#4995),#4999);
+#4995 = LINE('',#4996,#4997);
+#4996 = CARTESIAN_POINT('',(0.,0.));
+#4997 = VECTOR('',#4998,1.);
+#4998 = DIRECTION('',(1.,0.));
+#4999 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5000 = PCURVE('',#4843,#5001);
+#5001 = DEFINITIONAL_REPRESENTATION('',(#5002),#5006);
+#5002 = LINE('',#5003,#5004);
+#5003 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#5004 = VECTOR('',#5005,1.);
+#5005 = DIRECTION('',(0.707106781187,-0.707106781187));
+#5006 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5007 = ADVANCED_FACE('',(#5008),#4706,.T.);
+#5008 = FACE_BOUND('',#5009,.T.);
+#5009 = EDGE_LOOP('',(#5010,#5011,#5012,#5035,#5058,#5081,#5104));
+#5010 = ORIENTED_EDGE('',*,*,#4690,.T.);
+#5011 = ORIENTED_EDGE('',*,*,#4912,.T.);
+#5012 = ORIENTED_EDGE('',*,*,#5013,.T.);
+#5013 = EDGE_CURVE('',#4913,#5014,#5016,.T.);
+#5014 = VERTEX_POINT('',#5015);
+#5015 = CARTESIAN_POINT('',(-3.175,6.9,2.56));
+#5016 = SURFACE_CURVE('',#5017,(#5021,#5028),.PCURVE_S1.);
+#5017 = LINE('',#5018,#5019);
+#5018 = CARTESIAN_POINT('',(-3.6725,6.9,2.56));
+#5019 = VECTOR('',#5020,1.);
+#5020 = DIRECTION('',(1.,0.,0.));
+#5021 = PCURVE('',#4706,#5022);
+#5022 = DEFINITIONAL_REPRESENTATION('',(#5023),#5027);
+#5023 = LINE('',#5024,#5025);
+#5024 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#5025 = VECTOR('',#5026,1.);
+#5026 = DIRECTION('',(1.,-6.050792998522E-59));
+#5027 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5028 = PCURVE('',#4765,#5029);
+#5029 = DEFINITIONAL_REPRESENTATION('',(#5030),#5034);
+#5030 = LINE('',#5031,#5032);
+#5031 = CARTESIAN_POINT('',(0.55,0.11125));
+#5032 = VECTOR('',#5033,1.);
+#5033 = DIRECTION('',(0.,-1.));
+#5034 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5035 = ORIENTED_EDGE('',*,*,#5036,.F.);
+#5036 = EDGE_CURVE('',#5037,#5014,#5039,.T.);
+#5037 = VERTEX_POINT('',#5038);
+#5038 = CARTESIAN_POINT('',(-3.175,6.9,2.285));
+#5039 = SURFACE_CURVE('',#5040,(#5044,#5051),.PCURVE_S1.);
+#5040 = LINE('',#5041,#5042);
+#5041 = CARTESIAN_POINT('',(-3.175,6.9,2.285));
+#5042 = VECTOR('',#5043,1.);
+#5043 = DIRECTION('',(0.,0.,1.));
+#5044 = PCURVE('',#4706,#5045);
+#5045 = DEFINITIONAL_REPRESENTATION('',(#5046),#5050);
+#5046 = LINE('',#5047,#5048);
+#5047 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#5048 = VECTOR('',#5049,1.);
+#5049 = DIRECTION('',(0.,-1.));
+#5050 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5051 = PCURVE('',#4897,#5052);
+#5052 = DEFINITIONAL_REPRESENTATION('',(#5053),#5057);
+#5053 = LINE('',#5054,#5055);
+#5054 = CARTESIAN_POINT('',(0.,-1.1));
+#5055 = VECTOR('',#5056,1.);
+#5056 = DIRECTION('',(1.,0.));
+#5057 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5058 = ORIENTED_EDGE('',*,*,#5059,.F.);
+#5059 = EDGE_CURVE('',#5060,#5037,#5062,.T.);
+#5060 = VERTEX_POINT('',#5061);
+#5061 = CARTESIAN_POINT('',(-3.6725,6.9,2.285));
+#5062 = SURFACE_CURVE('',#5063,(#5067,#5074),.PCURVE_S1.);
+#5063 = LINE('',#5064,#5065);
+#5064 = CARTESIAN_POINT('',(-3.6725,6.9,2.285));
+#5065 = VECTOR('',#5066,1.);
+#5066 = DIRECTION('',(1.,0.,0.));
+#5067 = PCURVE('',#4706,#5068);
+#5068 = DEFINITIONAL_REPRESENTATION('',(#5069),#5073);
+#5069 = LINE('',#5070,#5071);
+#5070 = CARTESIAN_POINT('',(5.227820932134E-02,-0.703971790679));
+#5071 = VECTOR('',#5072,1.);
+#5072 = DIRECTION('',(1.,-6.050792998522E-59));
+#5073 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5074 = PCURVE('',#4871,#5075);
+#5075 = DEFINITIONAL_REPRESENTATION('',(#5076),#5080);
+#5076 = LINE('',#5077,#5078);
+#5077 = CARTESIAN_POINT('',(0.,1.1));
+#5078 = VECTOR('',#5079,1.);
+#5079 = DIRECTION('',(1.,0.));
+#5080 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5081 = ORIENTED_EDGE('',*,*,#5082,.F.);
+#5082 = EDGE_CURVE('',#5083,#5060,#5085,.T.);
+#5083 = VERTEX_POINT('',#5084);
+#5084 = CARTESIAN_POINT('',(-3.6725,6.9,0.275));
+#5085 = SURFACE_CURVE('',#5086,(#5090,#5097),.PCURVE_S1.);
+#5086 = LINE('',#5087,#5088);
+#5087 = CARTESIAN_POINT('',(-3.6725,6.9,0.275));
+#5088 = VECTOR('',#5089,1.);
+#5089 = DIRECTION('',(0.,0.,1.));
+#5090 = PCURVE('',#4706,#5091);
+#5091 = DEFINITIONAL_REPRESENTATION('',(#5092),#5096);
+#5092 = LINE('',#5093,#5094);
+#5093 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#5094 = VECTOR('',#5095,1.);
+#5095 = DIRECTION('',(0.,-1.));
+#5096 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5097 = PCURVE('',#4843,#5098);
+#5098 = DEFINITIONAL_REPRESENTATION('',(#5099),#5103);
+#5099 = LINE('',#5100,#5101);
+#5100 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#5101 = VECTOR('',#5102,1.);
+#5102 = DIRECTION('',(0.,1.));
+#5103 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5104 = ORIENTED_EDGE('',*,*,#5105,.T.);
+#5105 = EDGE_CURVE('',#5083,#4663,#5106,.T.);
+#5106 = SURFACE_CURVE('',#5107,(#5111,#5118),.PCURVE_S1.);
+#5107 = LINE('',#5108,#5109);
+#5108 = CARTESIAN_POINT('',(-3.6725,6.9,0.275));
+#5109 = VECTOR('',#5110,1.);
+#5110 = DIRECTION('',(-1.,0.,0.));
+#5111 = PCURVE('',#4706,#5112);
+#5112 = DEFINITIONAL_REPRESENTATION('',(#5113),#5117);
+#5113 = LINE('',#5114,#5115);
+#5114 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#5115 = VECTOR('',#5116,1.);
+#5116 = DIRECTION('',(-1.,6.050792998522E-59));
+#5117 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5118 = PCURVE('',#4678,#5119);
+#5119 = DEFINITIONAL_REPRESENTATION('',(#5120),#5124);
+#5120 = LINE('',#5121,#5122);
+#5121 = CARTESIAN_POINT('',(0.388908729653,0.));
+#5122 = VECTOR('',#5123,1.);
+#5123 = DIRECTION('',(0.,-1.));
+#5124 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5125 = ADVANCED_FACE('',(#5126),#4594,.T.);
+#5126 = FACE_BOUND('',#5127,.T.);
+#5127 = EDGE_LOOP('',(#5128,#5129,#5130,#5153));
+#5128 = ORIENTED_EDGE('',*,*,#4964,.T.);
+#5129 = ORIENTED_EDGE('',*,*,#4578,.T.);
+#5130 = ORIENTED_EDGE('',*,*,#5131,.F.);
+#5131 = EDGE_CURVE('',#5132,#4579,#5134,.T.);
+#5132 = VERTEX_POINT('',#5133);
+#5133 = CARTESIAN_POINT('',(-3.6725,6.075,-3.5));
+#5134 = SURFACE_CURVE('',#5135,(#5139,#5146),.PCURVE_S1.);
+#5135 = LINE('',#5136,#5137);
+#5136 = CARTESIAN_POINT('',(-3.6725,6.075,-3.5));
+#5137 = VECTOR('',#5138,1.);
+#5138 = DIRECTION('',(-1.,0.,0.));
+#5139 = PCURVE('',#4594,#5140);
+#5140 = DEFINITIONAL_REPRESENTATION('',(#5141),#5145);
+#5141 = LINE('',#5142,#5143);
+#5142 = CARTESIAN_POINT('',(3.5,0.));
+#5143 = VECTOR('',#5144,1.);
+#5144 = DIRECTION('',(0.,-1.));
+#5145 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5146 = PCURVE('',#4622,#5147);
+#5147 = DEFINITIONAL_REPRESENTATION('',(#5148),#5152);
+#5148 = LINE('',#5149,#5150);
+#5149 = CARTESIAN_POINT('',(3.330669073875E-16,0.));
+#5150 = VECTOR('',#5151,1.);
+#5151 = DIRECTION('',(0.,-1.));
+#5152 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5153 = ORIENTED_EDGE('',*,*,#5154,.F.);
+#5154 = EDGE_CURVE('',#4965,#5132,#5155,.T.);
+#5155 = SURFACE_CURVE('',#5156,(#5160,#5167),.PCURVE_S1.);
+#5156 = LINE('',#5157,#5158);
+#5157 = CARTESIAN_POINT('',(-3.6725,6.075,0.));
+#5158 = VECTOR('',#5159,1.);
+#5159 = DIRECTION('',(0.,0.,-1.));
+#5160 = PCURVE('',#4594,#5161);
+#5161 = DEFINITIONAL_REPRESENTATION('',(#5162),#5166);
+#5162 = LINE('',#5163,#5164);
+#5163 = CARTESIAN_POINT('',(0.,0.));
+#5164 = VECTOR('',#5165,1.);
+#5165 = DIRECTION('',(1.,0.));
+#5166 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5167 = PCURVE('',#4843,#5168);
+#5168 = DEFINITIONAL_REPRESENTATION('',(#5169),#5173);
+#5169 = LINE('',#5170,#5171);
+#5170 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#5171 = VECTOR('',#5172,1.);
+#5172 = DIRECTION('',(0.,-1.));
+#5173 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5174 = ADVANCED_FACE('',(#5175),#4678,.T.);
+#5175 = FACE_BOUND('',#5176,.T.);
+#5176 = EDGE_LOOP('',(#5177,#5200,#5201,#5202));
+#5177 = ORIENTED_EDGE('',*,*,#5178,.T.);
+#5178 = EDGE_CURVE('',#5179,#4635,#5181,.T.);
+#5179 = VERTEX_POINT('',#5180);
+#5180 = CARTESIAN_POINT('',(-3.6725,6.625,0.));
+#5181 = SURFACE_CURVE('',#5182,(#5186,#5193),.PCURVE_S1.);
+#5182 = LINE('',#5183,#5184);
+#5183 = CARTESIAN_POINT('',(-3.6725,6.625,0.));
+#5184 = VECTOR('',#5185,1.);
+#5185 = DIRECTION('',(-1.,0.,0.));
+#5186 = PCURVE('',#4678,#5187);
+#5187 = DEFINITIONAL_REPRESENTATION('',(#5188),#5192);
+#5188 = LINE('',#5189,#5190);
+#5189 = CARTESIAN_POINT('',(-6.280369834735E-16,0.));
+#5190 = VECTOR('',#5191,1.);
+#5191 = DIRECTION('',(0.,-1.));
+#5192 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5193 = PCURVE('',#4650,#5194);
+#5194 = DEFINITIONAL_REPRESENTATION('',(#5195),#5199);
+#5195 = LINE('',#5196,#5197);
+#5196 = CARTESIAN_POINT('',(3.5,0.));
+#5197 = VECTOR('',#5198,1.);
+#5198 = DIRECTION('',(0.,-1.));
+#5199 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5200 = ORIENTED_EDGE('',*,*,#4662,.T.);
+#5201 = ORIENTED_EDGE('',*,*,#5105,.F.);
+#5202 = ORIENTED_EDGE('',*,*,#5203,.F.);
+#5203 = EDGE_CURVE('',#5179,#5083,#5204,.T.);
+#5204 = SURFACE_CURVE('',#5205,(#5209,#5216),.PCURVE_S1.);
+#5205 = LINE('',#5206,#5207);
+#5206 = CARTESIAN_POINT('',(-3.6725,6.625,0.));
+#5207 = VECTOR('',#5208,1.);
+#5208 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#5209 = PCURVE('',#4678,#5210);
+#5210 = DEFINITIONAL_REPRESENTATION('',(#5211),#5215);
+#5211 = LINE('',#5212,#5213);
+#5212 = CARTESIAN_POINT('',(0.,0.));
+#5213 = VECTOR('',#5214,1.);
+#5214 = DIRECTION('',(1.,0.));
+#5215 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5216 = PCURVE('',#4843,#5217);
+#5217 = DEFINITIONAL_REPRESENTATION('',(#5218),#5222);
+#5218 = LINE('',#5219,#5220);
+#5219 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#5220 = VECTOR('',#5221,1.);
+#5221 = DIRECTION('',(0.707106781187,0.707106781187));
+#5222 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5223 = ADVANCED_FACE('',(#5224),#4622,.T.);
+#5224 = FACE_BOUND('',#5225,.T.);
+#5225 = EDGE_LOOP('',(#5226,#5227,#5228,#5251));
+#5226 = ORIENTED_EDGE('',*,*,#5131,.T.);
+#5227 = ORIENTED_EDGE('',*,*,#4606,.T.);
+#5228 = ORIENTED_EDGE('',*,*,#5229,.F.);
+#5229 = EDGE_CURVE('',#5230,#4607,#5232,.T.);
+#5230 = VERTEX_POINT('',#5231);
+#5231 = CARTESIAN_POINT('',(-3.6725,6.625,-3.5));
+#5232 = SURFACE_CURVE('',#5233,(#5237,#5244),.PCURVE_S1.);
+#5233 = LINE('',#5234,#5235);
+#5234 = CARTESIAN_POINT('',(-3.6725,6.625,-3.5));
+#5235 = VECTOR('',#5236,1.);
+#5236 = DIRECTION('',(-1.,0.,0.));
+#5237 = PCURVE('',#4622,#5238);
+#5238 = DEFINITIONAL_REPRESENTATION('',(#5239),#5243);
+#5239 = LINE('',#5240,#5241);
+#5240 = CARTESIAN_POINT('',(0.55,0.));
+#5241 = VECTOR('',#5242,1.);
+#5242 = DIRECTION('',(0.,-1.));
+#5243 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5244 = PCURVE('',#4650,#5245);
+#5245 = DEFINITIONAL_REPRESENTATION('',(#5246),#5250);
+#5246 = LINE('',#5247,#5248);
+#5247 = CARTESIAN_POINT('',(0.,0.));
+#5248 = VECTOR('',#5249,1.);
+#5249 = DIRECTION('',(0.,-1.));
+#5250 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5251 = ORIENTED_EDGE('',*,*,#5252,.F.);
+#5252 = EDGE_CURVE('',#5132,#5230,#5253,.T.);
+#5253 = SURFACE_CURVE('',#5254,(#5258,#5265),.PCURVE_S1.);
+#5254 = LINE('',#5255,#5256);
+#5255 = CARTESIAN_POINT('',(-3.6725,6.075,-3.5));
+#5256 = VECTOR('',#5257,1.);
+#5257 = DIRECTION('',(0.,1.,0.));
+#5258 = PCURVE('',#4622,#5259);
+#5259 = DEFINITIONAL_REPRESENTATION('',(#5260),#5264);
+#5260 = LINE('',#5261,#5262);
+#5261 = CARTESIAN_POINT('',(0.,0.));
+#5262 = VECTOR('',#5263,1.);
+#5263 = DIRECTION('',(1.,0.));
+#5264 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5265 = PCURVE('',#4843,#5266);
+#5266 = DEFINITIONAL_REPRESENTATION('',(#5267),#5271);
+#5267 = LINE('',#5268,#5269);
+#5268 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#5269 = VECTOR('',#5270,1.);
+#5270 = DIRECTION('',(1.,-2.226071387182E-62));
+#5271 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5272 = ADVANCED_FACE('',(#5273),#4650,.T.);
+#5273 = FACE_BOUND('',#5274,.T.);
+#5274 = EDGE_LOOP('',(#5275,#5276,#5277,#5278));
+#5275 = ORIENTED_EDGE('',*,*,#5229,.T.);
+#5276 = ORIENTED_EDGE('',*,*,#4634,.T.);
+#5277 = ORIENTED_EDGE('',*,*,#5178,.F.);
+#5278 = ORIENTED_EDGE('',*,*,#5279,.F.);
+#5279 = EDGE_CURVE('',#5230,#5179,#5280,.T.);
+#5280 = SURFACE_CURVE('',#5281,(#5285,#5292),.PCURVE_S1.);
+#5281 = LINE('',#5282,#5283);
+#5282 = CARTESIAN_POINT('',(-3.6725,6.625,-3.5));
+#5283 = VECTOR('',#5284,1.);
+#5284 = DIRECTION('',(0.,0.,1.));
+#5285 = PCURVE('',#4650,#5286);
+#5286 = DEFINITIONAL_REPRESENTATION('',(#5287),#5291);
+#5287 = LINE('',#5288,#5289);
+#5288 = CARTESIAN_POINT('',(0.,0.));
+#5289 = VECTOR('',#5290,1.);
+#5290 = DIRECTION('',(1.,0.));
+#5291 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5292 = PCURVE('',#4843,#5293);
+#5293 = DEFINITIONAL_REPRESENTATION('',(#5294),#5298);
+#5294 = LINE('',#5295,#5296);
+#5295 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#5296 = VECTOR('',#5297,1.);
+#5297 = DIRECTION('',(0.,1.));
+#5298 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5299 = ADVANCED_FACE('',(#5300),#4765,.T.);
+#5300 = FACE_BOUND('',#5301,.T.);
+#5301 = EDGE_LOOP('',(#5302,#5303,#5324,#5325));
+#5302 = ORIENTED_EDGE('',*,*,#4747,.F.);
+#5303 = ORIENTED_EDGE('',*,*,#5304,.T.);
+#5304 = EDGE_CURVE('',#4748,#5014,#5305,.T.);
+#5305 = SURFACE_CURVE('',#5306,(#5310,#5317),.PCURVE_S1.);
+#5306 = LINE('',#5307,#5308);
+#5307 = CARTESIAN_POINT('',(-3.175,5.8,2.56));
+#5308 = VECTOR('',#5309,1.);
+#5309 = DIRECTION('',(0.,1.,0.));
+#5310 = PCURVE('',#4765,#5311);
+#5311 = DEFINITIONAL_REPRESENTATION('',(#5312),#5316);
+#5312 = LINE('',#5313,#5314);
+#5313 = CARTESIAN_POINT('',(-0.55,-0.38625));
+#5314 = VECTOR('',#5315,1.);
+#5315 = DIRECTION('',(1.,6.285707653525E-60));
+#5316 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5317 = PCURVE('',#4897,#5318);
+#5318 = DEFINITIONAL_REPRESENTATION('',(#5319),#5323);
+#5319 = LINE('',#5320,#5321);
+#5320 = CARTESIAN_POINT('',(0.275,0.));
+#5321 = VECTOR('',#5322,1.);
+#5322 = DIRECTION('',(0.,-1.));
+#5323 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5324 = ORIENTED_EDGE('',*,*,#5013,.F.);
+#5325 = ORIENTED_EDGE('',*,*,#4936,.T.);
+#5326 = ADVANCED_FACE('',(#5327),#4897,.T.);
+#5327 = FACE_BOUND('',#5328,.T.);
+#5328 = EDGE_LOOP('',(#5329,#5330,#5351,#5352));
+#5329 = ORIENTED_EDGE('',*,*,#4883,.F.);
+#5330 = ORIENTED_EDGE('',*,*,#5331,.T.);
+#5331 = EDGE_CURVE('',#4856,#5037,#5332,.T.);
+#5332 = SURFACE_CURVE('',#5333,(#5337,#5344),.PCURVE_S1.);
+#5333 = LINE('',#5334,#5335);
+#5334 = CARTESIAN_POINT('',(-3.175,5.8,2.285));
+#5335 = VECTOR('',#5336,1.);
+#5336 = DIRECTION('',(0.,1.,0.));
+#5337 = PCURVE('',#4897,#5338);
+#5338 = DEFINITIONAL_REPRESENTATION('',(#5339),#5343);
+#5339 = LINE('',#5340,#5341);
+#5340 = CARTESIAN_POINT('',(0.,0.));
+#5341 = VECTOR('',#5342,1.);
+#5342 = DIRECTION('',(0.,-1.));
+#5343 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5344 = PCURVE('',#4871,#5345);
+#5345 = DEFINITIONAL_REPRESENTATION('',(#5346),#5350);
+#5346 = LINE('',#5347,#5348);
+#5347 = CARTESIAN_POINT('',(0.4975,0.));
+#5348 = VECTOR('',#5349,1.);
+#5349 = DIRECTION('',(0.,1.));
+#5350 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5351 = ORIENTED_EDGE('',*,*,#5036,.T.);
+#5352 = ORIENTED_EDGE('',*,*,#5304,.F.);
+#5353 = ADVANCED_FACE('',(#5354),#4871,.F.);
+#5354 = FACE_BOUND('',#5355,.F.);
+#5355 = EDGE_LOOP('',(#5356,#5377,#5378,#5379));
+#5356 = ORIENTED_EDGE('',*,*,#5357,.F.);
+#5357 = EDGE_CURVE('',#4828,#5060,#5358,.T.);
+#5358 = SURFACE_CURVE('',#5359,(#5363,#5370),.PCURVE_S1.);
+#5359 = LINE('',#5360,#5361);
+#5360 = CARTESIAN_POINT('',(-3.6725,5.8,2.285));
+#5361 = VECTOR('',#5362,1.);
+#5362 = DIRECTION('',(0.,1.,0.));
+#5363 = PCURVE('',#4871,#5364);
+#5364 = DEFINITIONAL_REPRESENTATION('',(#5365),#5369);
+#5365 = LINE('',#5366,#5367);
+#5366 = CARTESIAN_POINT('',(0.,0.));
+#5367 = VECTOR('',#5368,1.);
+#5368 = DIRECTION('',(0.,1.));
+#5369 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5370 = PCURVE('',#4843,#5371);
+#5371 = DEFINITIONAL_REPRESENTATION('',(#5372),#5376);
+#5372 = LINE('',#5373,#5374);
+#5373 = CARTESIAN_POINT('',(-0.55,2.62605853382));
+#5374 = VECTOR('',#5375,1.);
+#5375 = DIRECTION('',(1.,-2.226071387182E-62));
+#5376 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5377 = ORIENTED_EDGE('',*,*,#4855,.T.);
+#5378 = ORIENTED_EDGE('',*,*,#5331,.T.);
+#5379 = ORIENTED_EDGE('',*,*,#5059,.F.);
+#5380 = ADVANCED_FACE('',(#5381),#4843,.T.);
+#5381 = FACE_BOUND('',#5382,.T.);
+#5382 = EDGE_LOOP('',(#5383,#5384,#5385,#5386,#5387,#5388,#5389,#5390));
+#5383 = ORIENTED_EDGE('',*,*,#5082,.T.);
+#5384 = ORIENTED_EDGE('',*,*,#5357,.F.);
+#5385 = ORIENTED_EDGE('',*,*,#4827,.T.);
+#5386 = ORIENTED_EDGE('',*,*,#4987,.T.);
+#5387 = ORIENTED_EDGE('',*,*,#5154,.T.);
+#5388 = ORIENTED_EDGE('',*,*,#5252,.T.);
+#5389 = ORIENTED_EDGE('',*,*,#5279,.T.);
+#5390 = ORIENTED_EDGE('',*,*,#5203,.T.);
+#5391 = MANIFOLD_SOLID_BREP('',#5392);
+#5392 = CLOSED_SHELL('',(#5393,#5625,#5790,#5840,#5889,#6007,#6056,#6105
+ ,#6154,#6181,#6208,#6235,#6262));
+#5393 = ADVANCED_FACE('',(#5394),#5408,.F.);
+#5394 = FACE_BOUND('',#5395,.F.);
+#5395 = EDGE_LOOP('',(#5396,#5431,#5459,#5487,#5515,#5543,#5571,#5599));
+#5396 = ORIENTED_EDGE('',*,*,#5397,.T.);
+#5397 = EDGE_CURVE('',#5398,#5400,#5402,.T.);
+#5398 = VERTEX_POINT('',#5399);
+#5399 = CARTESIAN_POINT('',(3.9475,6.9,2.4225));
+#5400 = VERTEX_POINT('',#5401);
+#5401 = CARTESIAN_POINT('',(3.9475,6.9,0.275));
+#5402 = SURFACE_CURVE('',#5403,(#5407,#5419),.PCURVE_S1.);
+#5403 = LINE('',#5404,#5405);
+#5404 = CARTESIAN_POINT('',(3.9475,6.9,2.56));
+#5405 = VECTOR('',#5406,1.);
+#5406 = DIRECTION('',(0.,0.,-1.));
+#5407 = PCURVE('',#5408,#5413);
+#5408 = PLANE('',#5409);
+#5409 = AXIS2_PLACEMENT_3D('',#5410,#5411,#5412);
+#5410 = CARTESIAN_POINT('',(3.9475,6.35,-0.34105853382));
+#5411 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#5412 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#5413 = DEFINITIONAL_REPRESENTATION('',(#5414),#5418);
+#5414 = LINE('',#5415,#5416);
+#5415 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#5416 = VECTOR('',#5417,1.);
+#5417 = DIRECTION('',(0.,-1.));
+#5418 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5419 = PCURVE('',#5420,#5425);
+#5420 = PLANE('',#5421);
+#5421 = AXIS2_PLACEMENT_3D('',#5422,#5423,#5424);
+#5422 = CARTESIAN_POINT('',(3.724778209321,6.9,1.581028209321));
+#5423 = DIRECTION('',(3.17453643318E-29,1.,2.111838454822E-30));
+#5424 = DIRECTION('',(1.,-3.17453643318E-29,0.));
+#5425 = DEFINITIONAL_REPRESENTATION('',(#5426),#5430);
+#5426 = LINE('',#5427,#5428);
+#5427 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#5428 = VECTOR('',#5429,1.);
+#5429 = DIRECTION('',(0.,1.));
+#5430 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5431 = ORIENTED_EDGE('',*,*,#5432,.T.);
+#5432 = EDGE_CURVE('',#5400,#5433,#5435,.T.);
+#5433 = VERTEX_POINT('',#5434);
+#5434 = CARTESIAN_POINT('',(3.9475,6.625,0.));
+#5435 = SURFACE_CURVE('',#5436,(#5440,#5447),.PCURVE_S1.);
+#5436 = LINE('',#5437,#5438);
+#5437 = CARTESIAN_POINT('',(3.9475,6.9,0.275));
+#5438 = VECTOR('',#5439,1.);
+#5439 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#5440 = PCURVE('',#5408,#5441);
+#5441 = DEFINITIONAL_REPRESENTATION('',(#5442),#5446);
+#5442 = LINE('',#5443,#5444);
+#5443 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#5444 = VECTOR('',#5445,1.);
+#5445 = DIRECTION('',(0.707106781187,-0.707106781187));
+#5446 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5447 = PCURVE('',#5448,#5453);
+#5448 = PLANE('',#5449);
+#5449 = AXIS2_PLACEMENT_3D('',#5450,#5451,#5452);
+#5450 = CARTESIAN_POINT('',(3.6725,6.9,0.275));
+#5451 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#5452 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#5453 = DEFINITIONAL_REPRESENTATION('',(#5454),#5458);
+#5454 = LINE('',#5455,#5456);
+#5455 = CARTESIAN_POINT('',(0.,-0.275));
+#5456 = VECTOR('',#5457,1.);
+#5457 = DIRECTION('',(1.,0.));
+#5458 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5459 = ORIENTED_EDGE('',*,*,#5460,.T.);
+#5460 = EDGE_CURVE('',#5433,#5461,#5463,.T.);
+#5461 = VERTEX_POINT('',#5462);
+#5462 = CARTESIAN_POINT('',(3.9475,6.625,-3.5));
+#5463 = SURFACE_CURVE('',#5464,(#5468,#5475),.PCURVE_S1.);
+#5464 = LINE('',#5465,#5466);
+#5465 = CARTESIAN_POINT('',(3.9475,6.625,0.));
+#5466 = VECTOR('',#5467,1.);
+#5467 = DIRECTION('',(0.,0.,-1.));
+#5468 = PCURVE('',#5408,#5469);
+#5469 = DEFINITIONAL_REPRESENTATION('',(#5470),#5474);
+#5470 = LINE('',#5471,#5472);
+#5471 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#5472 = VECTOR('',#5473,1.);
+#5473 = DIRECTION('',(0.,-1.));
+#5474 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5475 = PCURVE('',#5476,#5481);
+#5476 = PLANE('',#5477);
+#5477 = AXIS2_PLACEMENT_3D('',#5478,#5479,#5480);
+#5478 = CARTESIAN_POINT('',(3.6725,6.625,0.));
+#5479 = DIRECTION('',(0.,1.,0.));
+#5480 = DIRECTION('',(0.,0.,-1.));
+#5481 = DEFINITIONAL_REPRESENTATION('',(#5482),#5486);
+#5482 = LINE('',#5483,#5484);
+#5483 = CARTESIAN_POINT('',(0.,-0.275));
+#5484 = VECTOR('',#5485,1.);
+#5485 = DIRECTION('',(1.,0.));
+#5486 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5487 = ORIENTED_EDGE('',*,*,#5488,.T.);
+#5488 = EDGE_CURVE('',#5461,#5489,#5491,.T.);
+#5489 = VERTEX_POINT('',#5490);
+#5490 = CARTESIAN_POINT('',(3.9475,6.075,-3.5));
+#5491 = SURFACE_CURVE('',#5492,(#5496,#5503),.PCURVE_S1.);
+#5492 = LINE('',#5493,#5494);
+#5493 = CARTESIAN_POINT('',(3.9475,6.625,-3.5));
+#5494 = VECTOR('',#5495,1.);
+#5495 = DIRECTION('',(0.,-1.,0.));
+#5496 = PCURVE('',#5408,#5497);
+#5497 = DEFINITIONAL_REPRESENTATION('',(#5498),#5502);
+#5498 = LINE('',#5499,#5500);
+#5499 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#5500 = VECTOR('',#5501,1.);
+#5501 = DIRECTION('',(1.,2.226071387182E-62));
+#5502 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5503 = PCURVE('',#5504,#5509);
+#5504 = PLANE('',#5505);
+#5505 = AXIS2_PLACEMENT_3D('',#5506,#5507,#5508);
+#5506 = CARTESIAN_POINT('',(3.6725,6.625,-3.5));
+#5507 = DIRECTION('',(0.,0.,-1.));
+#5508 = DIRECTION('',(0.,-1.,0.));
+#5509 = DEFINITIONAL_REPRESENTATION('',(#5510),#5514);
+#5510 = LINE('',#5511,#5512);
+#5511 = CARTESIAN_POINT('',(0.,-0.275));
+#5512 = VECTOR('',#5513,1.);
+#5513 = DIRECTION('',(1.,0.));
+#5514 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5515 = ORIENTED_EDGE('',*,*,#5516,.T.);
+#5516 = EDGE_CURVE('',#5489,#5517,#5519,.T.);
+#5517 = VERTEX_POINT('',#5518);
+#5518 = CARTESIAN_POINT('',(3.9475,6.075,0.));
+#5519 = SURFACE_CURVE('',#5520,(#5524,#5531),.PCURVE_S1.);
+#5520 = LINE('',#5521,#5522);
+#5521 = CARTESIAN_POINT('',(3.9475,6.075,-3.5));
+#5522 = VECTOR('',#5523,1.);
+#5523 = DIRECTION('',(0.,0.,1.));
+#5524 = PCURVE('',#5408,#5525);
+#5525 = DEFINITIONAL_REPRESENTATION('',(#5526),#5530);
+#5526 = LINE('',#5527,#5528);
+#5527 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#5528 = VECTOR('',#5529,1.);
+#5529 = DIRECTION('',(0.,1.));
+#5530 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5531 = PCURVE('',#5532,#5537);
+#5532 = PLANE('',#5533);
+#5533 = AXIS2_PLACEMENT_3D('',#5534,#5535,#5536);
+#5534 = CARTESIAN_POINT('',(3.6725,6.075,-3.5));
+#5535 = DIRECTION('',(0.,-1.,0.));
+#5536 = DIRECTION('',(0.,0.,1.));
+#5537 = DEFINITIONAL_REPRESENTATION('',(#5538),#5542);
+#5538 = LINE('',#5539,#5540);
+#5539 = CARTESIAN_POINT('',(0.,-0.275));
+#5540 = VECTOR('',#5541,1.);
+#5541 = DIRECTION('',(1.,0.));
+#5542 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5543 = ORIENTED_EDGE('',*,*,#5544,.T.);
+#5544 = EDGE_CURVE('',#5517,#5545,#5547,.T.);
+#5545 = VERTEX_POINT('',#5546);
+#5546 = CARTESIAN_POINT('',(3.9475,5.8,0.275));
+#5547 = SURFACE_CURVE('',#5548,(#5552,#5559),.PCURVE_S1.);
+#5548 = LINE('',#5549,#5550);
+#5549 = CARTESIAN_POINT('',(3.9475,6.075,0.));
+#5550 = VECTOR('',#5551,1.);
+#5551 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#5552 = PCURVE('',#5408,#5553);
+#5553 = DEFINITIONAL_REPRESENTATION('',(#5554),#5558);
+#5554 = LINE('',#5555,#5556);
+#5555 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#5556 = VECTOR('',#5557,1.);
+#5557 = DIRECTION('',(0.707106781187,0.707106781187));
+#5558 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5559 = PCURVE('',#5560,#5565);
+#5560 = PLANE('',#5561);
+#5561 = AXIS2_PLACEMENT_3D('',#5562,#5563,#5564);
+#5562 = CARTESIAN_POINT('',(3.6725,6.075,0.));
+#5563 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#5564 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#5565 = DEFINITIONAL_REPRESENTATION('',(#5566),#5570);
+#5566 = LINE('',#5567,#5568);
+#5567 = CARTESIAN_POINT('',(0.,-0.275));
+#5568 = VECTOR('',#5569,1.);
+#5569 = DIRECTION('',(1.,0.));
+#5570 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5571 = ORIENTED_EDGE('',*,*,#5572,.T.);
+#5572 = EDGE_CURVE('',#5545,#5573,#5575,.T.);
+#5573 = VERTEX_POINT('',#5574);
+#5574 = CARTESIAN_POINT('',(3.9475,5.8,2.4225));
+#5575 = SURFACE_CURVE('',#5576,(#5580,#5587),.PCURVE_S1.);
+#5576 = LINE('',#5577,#5578);
+#5577 = CARTESIAN_POINT('',(3.9475,5.8,0.275));
+#5578 = VECTOR('',#5579,1.);
+#5579 = DIRECTION('',(0.,0.,1.));
+#5580 = PCURVE('',#5408,#5581);
+#5581 = DEFINITIONAL_REPRESENTATION('',(#5582),#5586);
+#5582 = LINE('',#5583,#5584);
+#5583 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#5584 = VECTOR('',#5585,1.);
+#5585 = DIRECTION('',(0.,1.));
+#5586 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5587 = PCURVE('',#5588,#5593);
+#5588 = PLANE('',#5589);
+#5589 = AXIS2_PLACEMENT_3D('',#5590,#5591,#5592);
+#5590 = CARTESIAN_POINT('',(3.724778209321,5.8,1.581028209321));
+#5591 = DIRECTION('',(1.308440111004E-29,-1.,1.156108129756E-30));
+#5592 = DIRECTION('',(-1.,-1.308440111004E-29,0.));
+#5593 = DEFINITIONAL_REPRESENTATION('',(#5594),#5598);
+#5594 = LINE('',#5595,#5596);
+#5595 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#5596 = VECTOR('',#5597,1.);
+#5597 = DIRECTION('',(0.,-1.));
+#5598 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5599 = ORIENTED_EDGE('',*,*,#5600,.T.);
+#5600 = EDGE_CURVE('',#5573,#5398,#5601,.T.);
+#5601 = SURFACE_CURVE('',#5602,(#5606,#5613),.PCURVE_S1.);
+#5602 = LINE('',#5603,#5604);
+#5603 = CARTESIAN_POINT('',(3.9475,5.8,2.4225));
+#5604 = VECTOR('',#5605,1.);
+#5605 = DIRECTION('',(0.,1.,0.));
+#5606 = PCURVE('',#5408,#5607);
+#5607 = DEFINITIONAL_REPRESENTATION('',(#5608),#5612);
+#5608 = LINE('',#5609,#5610);
+#5609 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#5610 = VECTOR('',#5611,1.);
+#5611 = DIRECTION('',(-1.,-2.226071387182E-62));
+#5612 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5613 = PCURVE('',#5614,#5619);
+#5614 = CYLINDRICAL_SURFACE('',#5615,0.1375);
+#5615 = AXIS2_PLACEMENT_3D('',#5616,#5617,#5618);
+#5616 = CARTESIAN_POINT('',(3.81,5.8,2.4225));
+#5617 = DIRECTION('',(0.,1.,0.));
+#5618 = DIRECTION('',(1.,0.,-9.8088568672E-33));
+#5619 = DEFINITIONAL_REPRESENTATION('',(#5620),#5624);
+#5620 = LINE('',#5621,#5622);
+#5621 = CARTESIAN_POINT('',(-0.,0.));
+#5622 = VECTOR('',#5623,1.);
+#5623 = DIRECTION('',(-0.,1.));
+#5624 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5625 = ADVANCED_FACE('',(#5626),#5420,.T.);
+#5626 = FACE_BOUND('',#5627,.T.);
+#5627 = EDGE_LOOP('',(#5628,#5658,#5684,#5685,#5708,#5736,#5764));
+#5628 = ORIENTED_EDGE('',*,*,#5629,.T.);
+#5629 = EDGE_CURVE('',#5630,#5632,#5634,.T.);
+#5630 = VERTEX_POINT('',#5631);
+#5631 = CARTESIAN_POINT('',(3.175,6.9,2.56));
+#5632 = VERTEX_POINT('',#5633);
+#5633 = CARTESIAN_POINT('',(3.81,6.9,2.56));
+#5634 = SURFACE_CURVE('',#5635,(#5639,#5646),.PCURVE_S1.);
+#5635 = LINE('',#5636,#5637);
+#5636 = CARTESIAN_POINT('',(3.6725,6.9,2.56));
+#5637 = VECTOR('',#5638,1.);
+#5638 = DIRECTION('',(1.,0.,0.));
+#5639 = PCURVE('',#5420,#5640);
+#5640 = DEFINITIONAL_REPRESENTATION('',(#5641),#5645);
+#5641 = LINE('',#5642,#5643);
+#5642 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#5643 = VECTOR('',#5644,1.);
+#5644 = DIRECTION('',(1.,6.704108115824E-59));
+#5645 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5646 = PCURVE('',#5647,#5652);
+#5647 = PLANE('',#5648);
+#5648 = AXIS2_PLACEMENT_3D('',#5649,#5650,#5651);
+#5649 = CARTESIAN_POINT('',(3.56125,6.35,2.56));
+#5650 = DIRECTION('',(-1.657312278749E-30,-1.304555144269E-30,1.));
+#5651 = DIRECTION('',(1.,0.,1.657312278749E-30));
+#5652 = DEFINITIONAL_REPRESENTATION('',(#5653),#5657);
+#5653 = LINE('',#5654,#5655);
+#5654 = CARTESIAN_POINT('',(0.11125,0.55));
+#5655 = VECTOR('',#5656,1.);
+#5656 = DIRECTION('',(1.,-2.162055258902E-60));
+#5657 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5658 = ORIENTED_EDGE('',*,*,#5659,.F.);
+#5659 = EDGE_CURVE('',#5398,#5632,#5660,.T.);
+#5660 = SURFACE_CURVE('',#5661,(#5666,#5677),.PCURVE_S1.);
+#5661 = CIRCLE('',#5662,0.1375);
+#5662 = AXIS2_PLACEMENT_3D('',#5663,#5664,#5665);
+#5663 = CARTESIAN_POINT('',(3.81,6.9,2.4225));
+#5664 = DIRECTION('',(0.,-1.,0.));
+#5665 = DIRECTION('',(0.,0.,1.));
+#5666 = PCURVE('',#5420,#5667);
+#5667 = DEFINITIONAL_REPRESENTATION('',(#5668),#5676);
+#5668 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#5669,#5670,#5671,#5672,
+#5673,#5674,#5675),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2
+ ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786,
+6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE()
+GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,
+1.,0.5,1.)) REPRESENTATION_ITEM('') );
+#5669 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#5670 = CARTESIAN_POINT('',(-0.152935195362,-0.978971790679));
+#5671 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.772721790679));
+#5672 = CARTESIAN_POINT('',(8.522179067866E-02,-0.566471790679));
+#5673 = CARTESIAN_POINT('',(0.204300283699,-0.772721790679));
+#5674 = CARTESIAN_POINT('',(0.323378776719,-0.978971790679));
+#5675 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#5676 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5677 = PCURVE('',#5614,#5678);
+#5678 = DEFINITIONAL_REPRESENTATION('',(#5679),#5683);
+#5679 = LINE('',#5680,#5681);
+#5680 = CARTESIAN_POINT('',(4.712388980385,1.1));
+#5681 = VECTOR('',#5682,1.);
+#5682 = DIRECTION('',(-1.,0.));
+#5683 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5684 = ORIENTED_EDGE('',*,*,#5397,.T.);
+#5685 = ORIENTED_EDGE('',*,*,#5686,.F.);
+#5686 = EDGE_CURVE('',#5687,#5400,#5689,.T.);
+#5687 = VERTEX_POINT('',#5688);
+#5688 = CARTESIAN_POINT('',(3.6725,6.9,0.275));
+#5689 = SURFACE_CURVE('',#5690,(#5694,#5701),.PCURVE_S1.);
+#5690 = LINE('',#5691,#5692);
+#5691 = CARTESIAN_POINT('',(3.6725,6.9,0.275));
+#5692 = VECTOR('',#5693,1.);
+#5693 = DIRECTION('',(1.,0.,0.));
+#5694 = PCURVE('',#5420,#5695);
+#5695 = DEFINITIONAL_REPRESENTATION('',(#5696),#5700);
+#5696 = LINE('',#5697,#5698);
+#5697 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#5698 = VECTOR('',#5699,1.);
+#5699 = DIRECTION('',(1.,6.704108115824E-59));
+#5700 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5701 = PCURVE('',#5448,#5702);
+#5702 = DEFINITIONAL_REPRESENTATION('',(#5703),#5707);
+#5703 = LINE('',#5704,#5705);
+#5704 = CARTESIAN_POINT('',(4.710277376051E-16,0.));
+#5705 = VECTOR('',#5706,1.);
+#5706 = DIRECTION('',(0.,-1.));
+#5707 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5708 = ORIENTED_EDGE('',*,*,#5709,.F.);
+#5709 = EDGE_CURVE('',#5710,#5687,#5712,.T.);
+#5710 = VERTEX_POINT('',#5711);
+#5711 = CARTESIAN_POINT('',(3.6725,6.9,2.285));
+#5712 = SURFACE_CURVE('',#5713,(#5717,#5724),.PCURVE_S1.);
+#5713 = LINE('',#5714,#5715);
+#5714 = CARTESIAN_POINT('',(3.6725,6.9,2.56));
+#5715 = VECTOR('',#5716,1.);
+#5716 = DIRECTION('',(0.,0.,-1.));
+#5717 = PCURVE('',#5420,#5718);
+#5718 = DEFINITIONAL_REPRESENTATION('',(#5719),#5723);
+#5719 = LINE('',#5720,#5721);
+#5720 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#5721 = VECTOR('',#5722,1.);
+#5722 = DIRECTION('',(0.,1.));
+#5723 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5724 = PCURVE('',#5725,#5730);
+#5725 = PLANE('',#5726);
+#5726 = AXIS2_PLACEMENT_3D('',#5727,#5728,#5729);
+#5727 = CARTESIAN_POINT('',(3.6725,6.35,-0.34105853382));
+#5728 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#5729 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#5730 = DEFINITIONAL_REPRESENTATION('',(#5731),#5735);
+#5731 = LINE('',#5732,#5733);
+#5732 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#5733 = VECTOR('',#5734,1.);
+#5734 = DIRECTION('',(0.,-1.));
+#5735 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5736 = ORIENTED_EDGE('',*,*,#5737,.F.);
+#5737 = EDGE_CURVE('',#5738,#5710,#5740,.T.);
+#5738 = VERTEX_POINT('',#5739);
+#5739 = CARTESIAN_POINT('',(3.175,6.9,2.285));
+#5740 = SURFACE_CURVE('',#5741,(#5745,#5752),.PCURVE_S1.);
+#5741 = LINE('',#5742,#5743);
+#5742 = CARTESIAN_POINT('',(3.175,6.9,2.285));
+#5743 = VECTOR('',#5744,1.);
+#5744 = DIRECTION('',(1.,0.,0.));
+#5745 = PCURVE('',#5420,#5746);
+#5746 = DEFINITIONAL_REPRESENTATION('',(#5747),#5751);
+#5747 = LINE('',#5748,#5749);
+#5748 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#5749 = VECTOR('',#5750,1.);
+#5750 = DIRECTION('',(1.,6.704108115824E-59));
+#5751 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5752 = PCURVE('',#5753,#5758);
+#5753 = PLANE('',#5754);
+#5754 = AXIS2_PLACEMENT_3D('',#5755,#5756,#5757);
+#5755 = CARTESIAN_POINT('',(3.175,5.8,2.285));
+#5756 = DIRECTION('',(0.,0.,1.));
+#5757 = DIRECTION('',(1.,0.,0.));
+#5758 = DEFINITIONAL_REPRESENTATION('',(#5759),#5763);
+#5759 = LINE('',#5760,#5761);
+#5760 = CARTESIAN_POINT('',(0.,1.1));
+#5761 = VECTOR('',#5762,1.);
+#5762 = DIRECTION('',(1.,0.));
+#5763 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5764 = ORIENTED_EDGE('',*,*,#5765,.T.);
+#5765 = EDGE_CURVE('',#5738,#5630,#5766,.T.);
+#5766 = SURFACE_CURVE('',#5767,(#5771,#5778),.PCURVE_S1.);
+#5767 = LINE('',#5768,#5769);
+#5768 = CARTESIAN_POINT('',(3.175,6.9,2.285));
+#5769 = VECTOR('',#5770,1.);
+#5770 = DIRECTION('',(0.,0.,1.));
+#5771 = PCURVE('',#5420,#5772);
+#5772 = DEFINITIONAL_REPRESENTATION('',(#5773),#5777);
+#5773 = LINE('',#5774,#5775);
+#5774 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#5775 = VECTOR('',#5776,1.);
+#5776 = DIRECTION('',(0.,-1.));
+#5777 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5778 = PCURVE('',#5779,#5784);
+#5779 = PLANE('',#5780);
+#5780 = AXIS2_PLACEMENT_3D('',#5781,#5782,#5783);
+#5781 = CARTESIAN_POINT('',(3.175,5.8,2.285));
+#5782 = DIRECTION('',(1.,0.,0.));
+#5783 = DIRECTION('',(0.,0.,1.));
+#5784 = DEFINITIONAL_REPRESENTATION('',(#5785),#5789);
+#5785 = LINE('',#5786,#5787);
+#5786 = CARTESIAN_POINT('',(0.,-1.1));
+#5787 = VECTOR('',#5788,1.);
+#5788 = DIRECTION('',(1.,0.));
+#5789 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5790 = ADVANCED_FACE('',(#5791),#5614,.T.);
+#5791 = FACE_BOUND('',#5792,.F.);
+#5792 = EDGE_LOOP('',(#5793,#5817,#5838,#5839));
+#5793 = ORIENTED_EDGE('',*,*,#5794,.T.);
+#5794 = EDGE_CURVE('',#5573,#5795,#5797,.T.);
+#5795 = VERTEX_POINT('',#5796);
+#5796 = CARTESIAN_POINT('',(3.81,5.8,2.56));
+#5797 = SURFACE_CURVE('',#5798,(#5803,#5810),.PCURVE_S1.);
+#5798 = CIRCLE('',#5799,0.1375);
+#5799 = AXIS2_PLACEMENT_3D('',#5800,#5801,#5802);
+#5800 = CARTESIAN_POINT('',(3.81,5.8,2.4225));
+#5801 = DIRECTION('',(0.,-1.,0.));
+#5802 = DIRECTION('',(0.,0.,1.));
+#5803 = PCURVE('',#5614,#5804);
+#5804 = DEFINITIONAL_REPRESENTATION('',(#5805),#5809);
+#5805 = LINE('',#5806,#5807);
+#5806 = CARTESIAN_POINT('',(4.712388980385,-1.7763568394E-15));
+#5807 = VECTOR('',#5808,1.);
+#5808 = DIRECTION('',(-1.,0.));
+#5809 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5810 = PCURVE('',#5588,#5811);
+#5811 = DEFINITIONAL_REPRESENTATION('',(#5812),#5816);
+#5812 = CIRCLE('',#5813,0.1375);
+#5813 = AXIS2_PLACEMENT_2D('',#5814,#5815);
+#5814 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#5815 = DIRECTION('',(0.,-1.));
+#5816 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5817 = ORIENTED_EDGE('',*,*,#5818,.T.);
+#5818 = EDGE_CURVE('',#5795,#5632,#5819,.T.);
+#5819 = SURFACE_CURVE('',#5820,(#5824,#5831),.PCURVE_S1.);
+#5820 = LINE('',#5821,#5822);
+#5821 = CARTESIAN_POINT('',(3.81,5.8,2.56));
+#5822 = VECTOR('',#5823,1.);
+#5823 = DIRECTION('',(0.,1.,0.));
+#5824 = PCURVE('',#5614,#5825);
+#5825 = DEFINITIONAL_REPRESENTATION('',(#5826),#5830);
+#5826 = LINE('',#5827,#5828);
+#5827 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#5828 = VECTOR('',#5829,1.);
+#5829 = DIRECTION('',(-0.,1.));
+#5830 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5831 = PCURVE('',#5647,#5832);
+#5832 = DEFINITIONAL_REPRESENTATION('',(#5833),#5837);
+#5833 = LINE('',#5834,#5835);
+#5834 = CARTESIAN_POINT('',(0.24875,-0.55));
+#5835 = VECTOR('',#5836,1.);
+#5836 = DIRECTION('',(0.,1.));
+#5837 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5838 = ORIENTED_EDGE('',*,*,#5659,.F.);
+#5839 = ORIENTED_EDGE('',*,*,#5600,.F.);
+#5840 = ADVANCED_FACE('',(#5841),#5448,.T.);
+#5841 = FACE_BOUND('',#5842,.T.);
+#5842 = EDGE_LOOP('',(#5843,#5844,#5845,#5868));
+#5843 = ORIENTED_EDGE('',*,*,#5686,.T.);
+#5844 = ORIENTED_EDGE('',*,*,#5432,.T.);
+#5845 = ORIENTED_EDGE('',*,*,#5846,.F.);
+#5846 = EDGE_CURVE('',#5847,#5433,#5849,.T.);
+#5847 = VERTEX_POINT('',#5848);
+#5848 = CARTESIAN_POINT('',(3.6725,6.625,0.));
+#5849 = SURFACE_CURVE('',#5850,(#5854,#5861),.PCURVE_S1.);
+#5850 = LINE('',#5851,#5852);
+#5851 = CARTESIAN_POINT('',(3.6725,6.625,0.));
+#5852 = VECTOR('',#5853,1.);
+#5853 = DIRECTION('',(1.,0.,0.));
+#5854 = PCURVE('',#5448,#5855);
+#5855 = DEFINITIONAL_REPRESENTATION('',(#5856),#5860);
+#5856 = LINE('',#5857,#5858);
+#5857 = CARTESIAN_POINT('',(0.388908729653,0.));
+#5858 = VECTOR('',#5859,1.);
+#5859 = DIRECTION('',(0.,-1.));
+#5860 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5861 = PCURVE('',#5476,#5862);
+#5862 = DEFINITIONAL_REPRESENTATION('',(#5863),#5867);
+#5863 = LINE('',#5864,#5865);
+#5864 = CARTESIAN_POINT('',(0.,0.));
+#5865 = VECTOR('',#5866,1.);
+#5866 = DIRECTION('',(0.,-1.));
+#5867 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5868 = ORIENTED_EDGE('',*,*,#5869,.F.);
+#5869 = EDGE_CURVE('',#5687,#5847,#5870,.T.);
+#5870 = SURFACE_CURVE('',#5871,(#5875,#5882),.PCURVE_S1.);
+#5871 = LINE('',#5872,#5873);
+#5872 = CARTESIAN_POINT('',(3.6725,6.9,0.275));
+#5873 = VECTOR('',#5874,1.);
+#5874 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#5875 = PCURVE('',#5448,#5876);
+#5876 = DEFINITIONAL_REPRESENTATION('',(#5877),#5881);
+#5877 = LINE('',#5878,#5879);
+#5878 = CARTESIAN_POINT('',(0.,0.));
+#5879 = VECTOR('',#5880,1.);
+#5880 = DIRECTION('',(1.,0.));
+#5881 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5882 = PCURVE('',#5725,#5883);
+#5883 = DEFINITIONAL_REPRESENTATION('',(#5884),#5888);
+#5884 = LINE('',#5885,#5886);
+#5885 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#5886 = VECTOR('',#5887,1.);
+#5887 = DIRECTION('',(0.707106781187,-0.707106781187));
+#5888 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5889 = ADVANCED_FACE('',(#5890),#5588,.T.);
+#5890 = FACE_BOUND('',#5891,.T.);
+#5891 = EDGE_LOOP('',(#5892,#5893,#5894,#5917,#5940,#5963,#5986));
+#5892 = ORIENTED_EDGE('',*,*,#5572,.T.);
+#5893 = ORIENTED_EDGE('',*,*,#5794,.T.);
+#5894 = ORIENTED_EDGE('',*,*,#5895,.F.);
+#5895 = EDGE_CURVE('',#5896,#5795,#5898,.T.);
+#5896 = VERTEX_POINT('',#5897);
+#5897 = CARTESIAN_POINT('',(3.175,5.8,2.56));
+#5898 = SURFACE_CURVE('',#5899,(#5903,#5910),.PCURVE_S1.);
+#5899 = LINE('',#5900,#5901);
+#5900 = CARTESIAN_POINT('',(3.6725,5.8,2.56));
+#5901 = VECTOR('',#5902,1.);
+#5902 = DIRECTION('',(1.,0.,0.));
+#5903 = PCURVE('',#5588,#5904);
+#5904 = DEFINITIONAL_REPRESENTATION('',(#5905),#5909);
+#5905 = LINE('',#5906,#5907);
+#5906 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#5907 = VECTOR('',#5908,1.);
+#5908 = DIRECTION('',(-1.,1.51269824963E-59));
+#5909 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5910 = PCURVE('',#5647,#5911);
+#5911 = DEFINITIONAL_REPRESENTATION('',(#5912),#5916);
+#5912 = LINE('',#5913,#5914);
+#5913 = CARTESIAN_POINT('',(0.11125,-0.55));
+#5914 = VECTOR('',#5915,1.);
+#5915 = DIRECTION('',(1.,-2.162055258902E-60));
+#5916 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5917 = ORIENTED_EDGE('',*,*,#5918,.F.);
+#5918 = EDGE_CURVE('',#5919,#5896,#5921,.T.);
+#5919 = VERTEX_POINT('',#5920);
+#5920 = CARTESIAN_POINT('',(3.175,5.8,2.285));
+#5921 = SURFACE_CURVE('',#5922,(#5926,#5933),.PCURVE_S1.);
+#5922 = LINE('',#5923,#5924);
+#5923 = CARTESIAN_POINT('',(3.175,5.8,2.285));
+#5924 = VECTOR('',#5925,1.);
+#5925 = DIRECTION('',(0.,0.,1.));
+#5926 = PCURVE('',#5588,#5927);
+#5927 = DEFINITIONAL_REPRESENTATION('',(#5928),#5932);
+#5928 = LINE('',#5929,#5930);
+#5929 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#5930 = VECTOR('',#5931,1.);
+#5931 = DIRECTION('',(0.,-1.));
+#5932 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5933 = PCURVE('',#5779,#5934);
+#5934 = DEFINITIONAL_REPRESENTATION('',(#5935),#5939);
+#5935 = LINE('',#5936,#5937);
+#5936 = CARTESIAN_POINT('',(0.,0.));
+#5937 = VECTOR('',#5938,1.);
+#5938 = DIRECTION('',(1.,0.));
+#5939 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5940 = ORIENTED_EDGE('',*,*,#5941,.T.);
+#5941 = EDGE_CURVE('',#5919,#5942,#5944,.T.);
+#5942 = VERTEX_POINT('',#5943);
+#5943 = CARTESIAN_POINT('',(3.6725,5.8,2.285));
+#5944 = SURFACE_CURVE('',#5945,(#5949,#5956),.PCURVE_S1.);
+#5945 = LINE('',#5946,#5947);
+#5946 = CARTESIAN_POINT('',(3.175,5.8,2.285));
+#5947 = VECTOR('',#5948,1.);
+#5948 = DIRECTION('',(1.,0.,0.));
+#5949 = PCURVE('',#5588,#5950);
+#5950 = DEFINITIONAL_REPRESENTATION('',(#5951),#5955);
+#5951 = LINE('',#5952,#5953);
+#5952 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#5953 = VECTOR('',#5954,1.);
+#5954 = DIRECTION('',(-1.,1.51269824963E-59));
+#5955 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5956 = PCURVE('',#5753,#5957);
+#5957 = DEFINITIONAL_REPRESENTATION('',(#5958),#5962);
+#5958 = LINE('',#5959,#5960);
+#5959 = CARTESIAN_POINT('',(0.,0.));
+#5960 = VECTOR('',#5961,1.);
+#5961 = DIRECTION('',(1.,0.));
+#5962 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5963 = ORIENTED_EDGE('',*,*,#5964,.F.);
+#5964 = EDGE_CURVE('',#5965,#5942,#5967,.T.);
+#5965 = VERTEX_POINT('',#5966);
+#5966 = CARTESIAN_POINT('',(3.6725,5.8,0.275));
+#5967 = SURFACE_CURVE('',#5968,(#5972,#5979),.PCURVE_S1.);
+#5968 = LINE('',#5969,#5970);
+#5969 = CARTESIAN_POINT('',(3.6725,5.8,0.275));
+#5970 = VECTOR('',#5971,1.);
+#5971 = DIRECTION('',(0.,0.,1.));
+#5972 = PCURVE('',#5588,#5973);
+#5973 = DEFINITIONAL_REPRESENTATION('',(#5974),#5978);
+#5974 = LINE('',#5975,#5976);
+#5975 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#5976 = VECTOR('',#5977,1.);
+#5977 = DIRECTION('',(0.,-1.));
+#5978 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5979 = PCURVE('',#5725,#5980);
+#5980 = DEFINITIONAL_REPRESENTATION('',(#5981),#5985);
+#5981 = LINE('',#5982,#5983);
+#5982 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#5983 = VECTOR('',#5984,1.);
+#5984 = DIRECTION('',(0.,1.));
+#5985 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#5986 = ORIENTED_EDGE('',*,*,#5987,.T.);
+#5987 = EDGE_CURVE('',#5965,#5545,#5988,.T.);
+#5988 = SURFACE_CURVE('',#5989,(#5993,#6000),.PCURVE_S1.);
+#5989 = LINE('',#5990,#5991);
+#5990 = CARTESIAN_POINT('',(3.6725,5.8,0.275));
+#5991 = VECTOR('',#5992,1.);
+#5992 = DIRECTION('',(1.,0.,0.));
+#5993 = PCURVE('',#5588,#5994);
+#5994 = DEFINITIONAL_REPRESENTATION('',(#5995),#5999);
+#5995 = LINE('',#5996,#5997);
+#5996 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#5997 = VECTOR('',#5998,1.);
+#5998 = DIRECTION('',(-1.,1.51269824963E-59));
+#5999 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6000 = PCURVE('',#5560,#6001);
+#6001 = DEFINITIONAL_REPRESENTATION('',(#6002),#6006);
+#6002 = LINE('',#6003,#6004);
+#6003 = CARTESIAN_POINT('',(0.388908729653,0.));
+#6004 = VECTOR('',#6005,1.);
+#6005 = DIRECTION('',(0.,-1.));
+#6006 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6007 = ADVANCED_FACE('',(#6008),#5476,.T.);
+#6008 = FACE_BOUND('',#6009,.T.);
+#6009 = EDGE_LOOP('',(#6010,#6011,#6012,#6035));
+#6010 = ORIENTED_EDGE('',*,*,#5846,.T.);
+#6011 = ORIENTED_EDGE('',*,*,#5460,.T.);
+#6012 = ORIENTED_EDGE('',*,*,#6013,.F.);
+#6013 = EDGE_CURVE('',#6014,#5461,#6016,.T.);
+#6014 = VERTEX_POINT('',#6015);
+#6015 = CARTESIAN_POINT('',(3.6725,6.625,-3.5));
+#6016 = SURFACE_CURVE('',#6017,(#6021,#6028),.PCURVE_S1.);
+#6017 = LINE('',#6018,#6019);
+#6018 = CARTESIAN_POINT('',(3.6725,6.625,-3.5));
+#6019 = VECTOR('',#6020,1.);
+#6020 = DIRECTION('',(1.,0.,0.));
+#6021 = PCURVE('',#5476,#6022);
+#6022 = DEFINITIONAL_REPRESENTATION('',(#6023),#6027);
+#6023 = LINE('',#6024,#6025);
+#6024 = CARTESIAN_POINT('',(3.5,0.));
+#6025 = VECTOR('',#6026,1.);
+#6026 = DIRECTION('',(0.,-1.));
+#6027 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6028 = PCURVE('',#5504,#6029);
+#6029 = DEFINITIONAL_REPRESENTATION('',(#6030),#6034);
+#6030 = LINE('',#6031,#6032);
+#6031 = CARTESIAN_POINT('',(7.771561172376E-16,0.));
+#6032 = VECTOR('',#6033,1.);
+#6033 = DIRECTION('',(0.,-1.));
+#6034 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6035 = ORIENTED_EDGE('',*,*,#6036,.F.);
+#6036 = EDGE_CURVE('',#5847,#6014,#6037,.T.);
+#6037 = SURFACE_CURVE('',#6038,(#6042,#6049),.PCURVE_S1.);
+#6038 = LINE('',#6039,#6040);
+#6039 = CARTESIAN_POINT('',(3.6725,6.625,0.));
+#6040 = VECTOR('',#6041,1.);
+#6041 = DIRECTION('',(0.,0.,-1.));
+#6042 = PCURVE('',#5476,#6043);
+#6043 = DEFINITIONAL_REPRESENTATION('',(#6044),#6048);
+#6044 = LINE('',#6045,#6046);
+#6045 = CARTESIAN_POINT('',(0.,0.));
+#6046 = VECTOR('',#6047,1.);
+#6047 = DIRECTION('',(1.,0.));
+#6048 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6049 = PCURVE('',#5725,#6050);
+#6050 = DEFINITIONAL_REPRESENTATION('',(#6051),#6055);
+#6051 = LINE('',#6052,#6053);
+#6052 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#6053 = VECTOR('',#6054,1.);
+#6054 = DIRECTION('',(0.,-1.));
+#6055 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6056 = ADVANCED_FACE('',(#6057),#5560,.T.);
+#6057 = FACE_BOUND('',#6058,.T.);
+#6058 = EDGE_LOOP('',(#6059,#6082,#6083,#6084));
+#6059 = ORIENTED_EDGE('',*,*,#6060,.T.);
+#6060 = EDGE_CURVE('',#6061,#5517,#6063,.T.);
+#6061 = VERTEX_POINT('',#6062);
+#6062 = CARTESIAN_POINT('',(3.6725,6.075,0.));
+#6063 = SURFACE_CURVE('',#6064,(#6068,#6075),.PCURVE_S1.);
+#6064 = LINE('',#6065,#6066);
+#6065 = CARTESIAN_POINT('',(3.6725,6.075,0.));
+#6066 = VECTOR('',#6067,1.);
+#6067 = DIRECTION('',(1.,0.,0.));
+#6068 = PCURVE('',#5560,#6069);
+#6069 = DEFINITIONAL_REPRESENTATION('',(#6070),#6074);
+#6070 = LINE('',#6071,#6072);
+#6071 = CARTESIAN_POINT('',(-1.177569344013E-16,0.));
+#6072 = VECTOR('',#6073,1.);
+#6073 = DIRECTION('',(0.,-1.));
+#6074 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6075 = PCURVE('',#5532,#6076);
+#6076 = DEFINITIONAL_REPRESENTATION('',(#6077),#6081);
+#6077 = LINE('',#6078,#6079);
+#6078 = CARTESIAN_POINT('',(3.5,0.));
+#6079 = VECTOR('',#6080,1.);
+#6080 = DIRECTION('',(0.,-1.));
+#6081 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6082 = ORIENTED_EDGE('',*,*,#5544,.T.);
+#6083 = ORIENTED_EDGE('',*,*,#5987,.F.);
+#6084 = ORIENTED_EDGE('',*,*,#6085,.F.);
+#6085 = EDGE_CURVE('',#6061,#5965,#6086,.T.);
+#6086 = SURFACE_CURVE('',#6087,(#6091,#6098),.PCURVE_S1.);
+#6087 = LINE('',#6088,#6089);
+#6088 = CARTESIAN_POINT('',(3.6725,6.075,0.));
+#6089 = VECTOR('',#6090,1.);
+#6090 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#6091 = PCURVE('',#5560,#6092);
+#6092 = DEFINITIONAL_REPRESENTATION('',(#6093),#6097);
+#6093 = LINE('',#6094,#6095);
+#6094 = CARTESIAN_POINT('',(0.,0.));
+#6095 = VECTOR('',#6096,1.);
+#6096 = DIRECTION('',(1.,0.));
+#6097 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6098 = PCURVE('',#5725,#6099);
+#6099 = DEFINITIONAL_REPRESENTATION('',(#6100),#6104);
+#6100 = LINE('',#6101,#6102);
+#6101 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#6102 = VECTOR('',#6103,1.);
+#6103 = DIRECTION('',(0.707106781187,0.707106781187));
+#6104 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6105 = ADVANCED_FACE('',(#6106),#5504,.T.);
+#6106 = FACE_BOUND('',#6107,.T.);
+#6107 = EDGE_LOOP('',(#6108,#6109,#6110,#6133));
+#6108 = ORIENTED_EDGE('',*,*,#6013,.T.);
+#6109 = ORIENTED_EDGE('',*,*,#5488,.T.);
+#6110 = ORIENTED_EDGE('',*,*,#6111,.F.);
+#6111 = EDGE_CURVE('',#6112,#5489,#6114,.T.);
+#6112 = VERTEX_POINT('',#6113);
+#6113 = CARTESIAN_POINT('',(3.6725,6.075,-3.5));
+#6114 = SURFACE_CURVE('',#6115,(#6119,#6126),.PCURVE_S1.);
+#6115 = LINE('',#6116,#6117);
+#6116 = CARTESIAN_POINT('',(3.6725,6.075,-3.5));
+#6117 = VECTOR('',#6118,1.);
+#6118 = DIRECTION('',(1.,0.,0.));
+#6119 = PCURVE('',#5504,#6120);
+#6120 = DEFINITIONAL_REPRESENTATION('',(#6121),#6125);
+#6121 = LINE('',#6122,#6123);
+#6122 = CARTESIAN_POINT('',(0.55,0.));
+#6123 = VECTOR('',#6124,1.);
+#6124 = DIRECTION('',(0.,-1.));
+#6125 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6126 = PCURVE('',#5532,#6127);
+#6127 = DEFINITIONAL_REPRESENTATION('',(#6128),#6132);
+#6128 = LINE('',#6129,#6130);
+#6129 = CARTESIAN_POINT('',(0.,0.));
+#6130 = VECTOR('',#6131,1.);
+#6131 = DIRECTION('',(0.,-1.));
+#6132 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6133 = ORIENTED_EDGE('',*,*,#6134,.F.);
+#6134 = EDGE_CURVE('',#6014,#6112,#6135,.T.);
+#6135 = SURFACE_CURVE('',#6136,(#6140,#6147),.PCURVE_S1.);
+#6136 = LINE('',#6137,#6138);
+#6137 = CARTESIAN_POINT('',(3.6725,6.625,-3.5));
+#6138 = VECTOR('',#6139,1.);
+#6139 = DIRECTION('',(0.,-1.,0.));
+#6140 = PCURVE('',#5504,#6141);
+#6141 = DEFINITIONAL_REPRESENTATION('',(#6142),#6146);
+#6142 = LINE('',#6143,#6144);
+#6143 = CARTESIAN_POINT('',(0.,-0.));
+#6144 = VECTOR('',#6145,1.);
+#6145 = DIRECTION('',(1.,0.));
+#6146 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6147 = PCURVE('',#5725,#6148);
+#6148 = DEFINITIONAL_REPRESENTATION('',(#6149),#6153);
+#6149 = LINE('',#6150,#6151);
+#6150 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#6151 = VECTOR('',#6152,1.);
+#6152 = DIRECTION('',(1.,2.226071387182E-62));
+#6153 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6154 = ADVANCED_FACE('',(#6155),#5532,.T.);
+#6155 = FACE_BOUND('',#6156,.T.);
+#6156 = EDGE_LOOP('',(#6157,#6158,#6159,#6160));
+#6157 = ORIENTED_EDGE('',*,*,#6111,.T.);
+#6158 = ORIENTED_EDGE('',*,*,#5516,.T.);
+#6159 = ORIENTED_EDGE('',*,*,#6060,.F.);
+#6160 = ORIENTED_EDGE('',*,*,#6161,.F.);
+#6161 = EDGE_CURVE('',#6112,#6061,#6162,.T.);
+#6162 = SURFACE_CURVE('',#6163,(#6167,#6174),.PCURVE_S1.);
+#6163 = LINE('',#6164,#6165);
+#6164 = CARTESIAN_POINT('',(3.6725,6.075,-3.5));
+#6165 = VECTOR('',#6166,1.);
+#6166 = DIRECTION('',(0.,0.,1.));
+#6167 = PCURVE('',#5532,#6168);
+#6168 = DEFINITIONAL_REPRESENTATION('',(#6169),#6173);
+#6169 = LINE('',#6170,#6171);
+#6170 = CARTESIAN_POINT('',(0.,0.));
+#6171 = VECTOR('',#6172,1.);
+#6172 = DIRECTION('',(1.,0.));
+#6173 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6174 = PCURVE('',#5725,#6175);
+#6175 = DEFINITIONAL_REPRESENTATION('',(#6176),#6180);
+#6176 = LINE('',#6177,#6178);
+#6177 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#6178 = VECTOR('',#6179,1.);
+#6179 = DIRECTION('',(0.,1.));
+#6180 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6181 = ADVANCED_FACE('',(#6182),#5647,.T.);
+#6182 = FACE_BOUND('',#6183,.T.);
+#6183 = EDGE_LOOP('',(#6184,#6185,#6186,#6187));
+#6184 = ORIENTED_EDGE('',*,*,#5895,.T.);
+#6185 = ORIENTED_EDGE('',*,*,#5818,.T.);
+#6186 = ORIENTED_EDGE('',*,*,#5629,.F.);
+#6187 = ORIENTED_EDGE('',*,*,#6188,.F.);
+#6188 = EDGE_CURVE('',#5896,#5630,#6189,.T.);
+#6189 = SURFACE_CURVE('',#6190,(#6194,#6201),.PCURVE_S1.);
+#6190 = LINE('',#6191,#6192);
+#6191 = CARTESIAN_POINT('',(3.175,5.8,2.56));
+#6192 = VECTOR('',#6193,1.);
+#6193 = DIRECTION('',(0.,1.,0.));
+#6194 = PCURVE('',#5647,#6195);
+#6195 = DEFINITIONAL_REPRESENTATION('',(#6196),#6200);
+#6196 = LINE('',#6197,#6198);
+#6197 = CARTESIAN_POINT('',(-0.38625,-0.55));
+#6198 = VECTOR('',#6199,1.);
+#6199 = DIRECTION('',(0.,1.));
+#6200 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6201 = PCURVE('',#5779,#6202);
+#6202 = DEFINITIONAL_REPRESENTATION('',(#6203),#6207);
+#6203 = LINE('',#6204,#6205);
+#6204 = CARTESIAN_POINT('',(0.275,0.));
+#6205 = VECTOR('',#6206,1.);
+#6206 = DIRECTION('',(0.,-1.));
+#6207 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6208 = ADVANCED_FACE('',(#6209),#5779,.F.);
+#6209 = FACE_BOUND('',#6210,.F.);
+#6210 = EDGE_LOOP('',(#6211,#6212,#6233,#6234));
+#6211 = ORIENTED_EDGE('',*,*,#5918,.F.);
+#6212 = ORIENTED_EDGE('',*,*,#6213,.T.);
+#6213 = EDGE_CURVE('',#5919,#5738,#6214,.T.);
+#6214 = SURFACE_CURVE('',#6215,(#6219,#6226),.PCURVE_S1.);
+#6215 = LINE('',#6216,#6217);
+#6216 = CARTESIAN_POINT('',(3.175,5.8,2.285));
+#6217 = VECTOR('',#6218,1.);
+#6218 = DIRECTION('',(0.,1.,0.));
+#6219 = PCURVE('',#5779,#6220);
+#6220 = DEFINITIONAL_REPRESENTATION('',(#6221),#6225);
+#6221 = LINE('',#6222,#6223);
+#6222 = CARTESIAN_POINT('',(0.,0.));
+#6223 = VECTOR('',#6224,1.);
+#6224 = DIRECTION('',(0.,-1.));
+#6225 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6226 = PCURVE('',#5753,#6227);
+#6227 = DEFINITIONAL_REPRESENTATION('',(#6228),#6232);
+#6228 = LINE('',#6229,#6230);
+#6229 = CARTESIAN_POINT('',(0.,0.));
+#6230 = VECTOR('',#6231,1.);
+#6231 = DIRECTION('',(0.,1.));
+#6232 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6233 = ORIENTED_EDGE('',*,*,#5765,.T.);
+#6234 = ORIENTED_EDGE('',*,*,#6188,.F.);
+#6235 = ADVANCED_FACE('',(#6236),#5753,.F.);
+#6236 = FACE_BOUND('',#6237,.F.);
+#6237 = EDGE_LOOP('',(#6238,#6239,#6240,#6261));
+#6238 = ORIENTED_EDGE('',*,*,#6213,.F.);
+#6239 = ORIENTED_EDGE('',*,*,#5941,.T.);
+#6240 = ORIENTED_EDGE('',*,*,#6241,.T.);
+#6241 = EDGE_CURVE('',#5942,#5710,#6242,.T.);
+#6242 = SURFACE_CURVE('',#6243,(#6247,#6254),.PCURVE_S1.);
+#6243 = LINE('',#6244,#6245);
+#6244 = CARTESIAN_POINT('',(3.6725,5.8,2.285));
+#6245 = VECTOR('',#6246,1.);
+#6246 = DIRECTION('',(0.,1.,0.));
+#6247 = PCURVE('',#5753,#6248);
+#6248 = DEFINITIONAL_REPRESENTATION('',(#6249),#6253);
+#6249 = LINE('',#6250,#6251);
+#6250 = CARTESIAN_POINT('',(0.4975,0.));
+#6251 = VECTOR('',#6252,1.);
+#6252 = DIRECTION('',(0.,1.));
+#6253 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6254 = PCURVE('',#5725,#6255);
+#6255 = DEFINITIONAL_REPRESENTATION('',(#6256),#6260);
+#6256 = LINE('',#6257,#6258);
+#6257 = CARTESIAN_POINT('',(0.55,2.62605853382));
+#6258 = VECTOR('',#6259,1.);
+#6259 = DIRECTION('',(-1.,-2.226071387182E-62));
+#6260 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6261 = ORIENTED_EDGE('',*,*,#5737,.F.);
+#6262 = ADVANCED_FACE('',(#6263),#5725,.T.);
+#6263 = FACE_BOUND('',#6264,.T.);
+#6264 = EDGE_LOOP('',(#6265,#6266,#6267,#6268,#6269,#6270,#6271,#6272));
+#6265 = ORIENTED_EDGE('',*,*,#5964,.T.);
+#6266 = ORIENTED_EDGE('',*,*,#6241,.T.);
+#6267 = ORIENTED_EDGE('',*,*,#5709,.T.);
+#6268 = ORIENTED_EDGE('',*,*,#5869,.T.);
+#6269 = ORIENTED_EDGE('',*,*,#6036,.T.);
+#6270 = ORIENTED_EDGE('',*,*,#6134,.T.);
+#6271 = ORIENTED_EDGE('',*,*,#6161,.T.);
+#6272 = ORIENTED_EDGE('',*,*,#6085,.T.);
+#6273 = MANIFOLD_SOLID_BREP('',#6274);
+#6274 = CLOSED_SHELL('',(#6275,#6507,#6672,#6722,#6771,#6889,#6938,#6987
+ ,#7036,#7063,#7090,#7117,#7144));
+#6275 = ADVANCED_FACE('',(#6276),#6290,.F.);
+#6276 = FACE_BOUND('',#6277,.F.);
+#6277 = EDGE_LOOP('',(#6278,#6313,#6341,#6369,#6397,#6425,#6453,#6481));
+#6278 = ORIENTED_EDGE('',*,*,#6279,.T.);
+#6279 = EDGE_CURVE('',#6280,#6282,#6284,.T.);
+#6280 = VERTEX_POINT('',#6281);
+#6281 = CARTESIAN_POINT('',(-3.9475,3.26,2.4225));
+#6282 = VERTEX_POINT('',#6283);
+#6283 = CARTESIAN_POINT('',(-3.9475,3.26,0.275));
+#6284 = SURFACE_CURVE('',#6285,(#6289,#6301),.PCURVE_S1.);
+#6285 = LINE('',#6286,#6287);
+#6286 = CARTESIAN_POINT('',(-3.9475,3.26,2.56));
+#6287 = VECTOR('',#6288,1.);
+#6288 = DIRECTION('',(0.,0.,-1.));
+#6289 = PCURVE('',#6290,#6295);
+#6290 = PLANE('',#6291);
+#6291 = AXIS2_PLACEMENT_3D('',#6292,#6293,#6294);
+#6292 = CARTESIAN_POINT('',(-3.9475,3.81,-0.34105853382));
+#6293 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#6294 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#6295 = DEFINITIONAL_REPRESENTATION('',(#6296),#6300);
+#6296 = LINE('',#6297,#6298);
+#6297 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#6298 = VECTOR('',#6299,1.);
+#6299 = DIRECTION('',(0.,-1.));
+#6300 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6301 = PCURVE('',#6302,#6307);
+#6302 = PLANE('',#6303);
+#6303 = AXIS2_PLACEMENT_3D('',#6304,#6305,#6306);
+#6304 = CARTESIAN_POINT('',(-3.724778209321,3.26,1.581028209321));
+#6305 = DIRECTION('',(1.58726821659E-29,-1.,-1.055919227411E-30));
+#6306 = DIRECTION('',(-1.,-1.58726821659E-29,0.));
+#6307 = DEFINITIONAL_REPRESENTATION('',(#6308),#6312);
+#6308 = LINE('',#6309,#6310);
+#6309 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#6310 = VECTOR('',#6311,1.);
+#6311 = DIRECTION('',(0.,1.));
+#6312 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6313 = ORIENTED_EDGE('',*,*,#6314,.T.);
+#6314 = EDGE_CURVE('',#6282,#6315,#6317,.T.);
+#6315 = VERTEX_POINT('',#6316);
+#6316 = CARTESIAN_POINT('',(-3.9475,3.535,0.));
+#6317 = SURFACE_CURVE('',#6318,(#6322,#6329),.PCURVE_S1.);
+#6318 = LINE('',#6319,#6320);
+#6319 = CARTESIAN_POINT('',(-3.9475,3.26,0.275));
+#6320 = VECTOR('',#6321,1.);
+#6321 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#6322 = PCURVE('',#6290,#6323);
+#6323 = DEFINITIONAL_REPRESENTATION('',(#6324),#6328);
+#6324 = LINE('',#6325,#6326);
+#6325 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#6326 = VECTOR('',#6327,1.);
+#6327 = DIRECTION('',(0.707106781187,-0.707106781187));
+#6328 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6329 = PCURVE('',#6330,#6335);
+#6330 = PLANE('',#6331);
+#6331 = AXIS2_PLACEMENT_3D('',#6332,#6333,#6334);
+#6332 = CARTESIAN_POINT('',(-3.6725,3.26,0.275));
+#6333 = DIRECTION('',(-0.,-0.707106781187,-0.707106781187));
+#6334 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#6335 = DEFINITIONAL_REPRESENTATION('',(#6336),#6340);
+#6336 = LINE('',#6337,#6338);
+#6337 = CARTESIAN_POINT('',(0.,-0.275));
+#6338 = VECTOR('',#6339,1.);
+#6339 = DIRECTION('',(1.,0.));
+#6340 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6341 = ORIENTED_EDGE('',*,*,#6342,.T.);
+#6342 = EDGE_CURVE('',#6315,#6343,#6345,.T.);
+#6343 = VERTEX_POINT('',#6344);
+#6344 = CARTESIAN_POINT('',(-3.9475,3.535,-3.5));
+#6345 = SURFACE_CURVE('',#6346,(#6350,#6357),.PCURVE_S1.);
+#6346 = LINE('',#6347,#6348);
+#6347 = CARTESIAN_POINT('',(-3.9475,3.535,0.));
+#6348 = VECTOR('',#6349,1.);
+#6349 = DIRECTION('',(0.,0.,-1.));
+#6350 = PCURVE('',#6290,#6351);
+#6351 = DEFINITIONAL_REPRESENTATION('',(#6352),#6356);
+#6352 = LINE('',#6353,#6354);
+#6353 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#6354 = VECTOR('',#6355,1.);
+#6355 = DIRECTION('',(0.,-1.));
+#6356 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6357 = PCURVE('',#6358,#6363);
+#6358 = PLANE('',#6359);
+#6359 = AXIS2_PLACEMENT_3D('',#6360,#6361,#6362);
+#6360 = CARTESIAN_POINT('',(-3.6725,3.535,0.));
+#6361 = DIRECTION('',(-0.,-1.,-0.));
+#6362 = DIRECTION('',(0.,0.,-1.));
+#6363 = DEFINITIONAL_REPRESENTATION('',(#6364),#6368);
+#6364 = LINE('',#6365,#6366);
+#6365 = CARTESIAN_POINT('',(0.,-0.275));
+#6366 = VECTOR('',#6367,1.);
+#6367 = DIRECTION('',(1.,0.));
+#6368 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6369 = ORIENTED_EDGE('',*,*,#6370,.T.);
+#6370 = EDGE_CURVE('',#6343,#6371,#6373,.T.);
+#6371 = VERTEX_POINT('',#6372);
+#6372 = CARTESIAN_POINT('',(-3.9475,4.085,-3.5));
+#6373 = SURFACE_CURVE('',#6374,(#6378,#6385),.PCURVE_S1.);
+#6374 = LINE('',#6375,#6376);
+#6375 = CARTESIAN_POINT('',(-3.9475,3.535,-3.5));
+#6376 = VECTOR('',#6377,1.);
+#6377 = DIRECTION('',(0.,1.,0.));
+#6378 = PCURVE('',#6290,#6379);
+#6379 = DEFINITIONAL_REPRESENTATION('',(#6380),#6384);
+#6380 = LINE('',#6381,#6382);
+#6381 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#6382 = VECTOR('',#6383,1.);
+#6383 = DIRECTION('',(1.,-2.226071387182E-62));
+#6384 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6385 = PCURVE('',#6386,#6391);
+#6386 = PLANE('',#6387);
+#6387 = AXIS2_PLACEMENT_3D('',#6388,#6389,#6390);
+#6388 = CARTESIAN_POINT('',(-3.6725,3.535,-3.5));
+#6389 = DIRECTION('',(0.,0.,-1.));
+#6390 = DIRECTION('',(0.,1.,0.));
+#6391 = DEFINITIONAL_REPRESENTATION('',(#6392),#6396);
+#6392 = LINE('',#6393,#6394);
+#6393 = CARTESIAN_POINT('',(0.,-0.275));
+#6394 = VECTOR('',#6395,1.);
+#6395 = DIRECTION('',(1.,0.));
+#6396 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6397 = ORIENTED_EDGE('',*,*,#6398,.T.);
+#6398 = EDGE_CURVE('',#6371,#6399,#6401,.T.);
+#6399 = VERTEX_POINT('',#6400);
+#6400 = CARTESIAN_POINT('',(-3.9475,4.085,0.));
+#6401 = SURFACE_CURVE('',#6402,(#6406,#6413),.PCURVE_S1.);
+#6402 = LINE('',#6403,#6404);
+#6403 = CARTESIAN_POINT('',(-3.9475,4.085,-3.5));
+#6404 = VECTOR('',#6405,1.);
+#6405 = DIRECTION('',(0.,0.,1.));
+#6406 = PCURVE('',#6290,#6407);
+#6407 = DEFINITIONAL_REPRESENTATION('',(#6408),#6412);
+#6408 = LINE('',#6409,#6410);
+#6409 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#6410 = VECTOR('',#6411,1.);
+#6411 = DIRECTION('',(0.,1.));
+#6412 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6413 = PCURVE('',#6414,#6419);
+#6414 = PLANE('',#6415);
+#6415 = AXIS2_PLACEMENT_3D('',#6416,#6417,#6418);
+#6416 = CARTESIAN_POINT('',(-3.6725,4.085,-3.5));
+#6417 = DIRECTION('',(0.,1.,0.));
+#6418 = DIRECTION('',(0.,0.,1.));
+#6419 = DEFINITIONAL_REPRESENTATION('',(#6420),#6424);
+#6420 = LINE('',#6421,#6422);
+#6421 = CARTESIAN_POINT('',(0.,-0.275));
+#6422 = VECTOR('',#6423,1.);
+#6423 = DIRECTION('',(1.,0.));
+#6424 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6425 = ORIENTED_EDGE('',*,*,#6426,.T.);
+#6426 = EDGE_CURVE('',#6399,#6427,#6429,.T.);
+#6427 = VERTEX_POINT('',#6428);
+#6428 = CARTESIAN_POINT('',(-3.9475,4.36,0.275));
+#6429 = SURFACE_CURVE('',#6430,(#6434,#6441),.PCURVE_S1.);
+#6430 = LINE('',#6431,#6432);
+#6431 = CARTESIAN_POINT('',(-3.9475,4.085,0.));
+#6432 = VECTOR('',#6433,1.);
+#6433 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#6434 = PCURVE('',#6290,#6435);
+#6435 = DEFINITIONAL_REPRESENTATION('',(#6436),#6440);
+#6436 = LINE('',#6437,#6438);
+#6437 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#6438 = VECTOR('',#6439,1.);
+#6439 = DIRECTION('',(0.707106781187,0.707106781187));
+#6440 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6441 = PCURVE('',#6442,#6447);
+#6442 = PLANE('',#6443);
+#6443 = AXIS2_PLACEMENT_3D('',#6444,#6445,#6446);
+#6444 = CARTESIAN_POINT('',(-3.6725,4.085,0.));
+#6445 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#6446 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#6447 = DEFINITIONAL_REPRESENTATION('',(#6448),#6452);
+#6448 = LINE('',#6449,#6450);
+#6449 = CARTESIAN_POINT('',(0.,-0.275));
+#6450 = VECTOR('',#6451,1.);
+#6451 = DIRECTION('',(1.,0.));
+#6452 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6453 = ORIENTED_EDGE('',*,*,#6454,.T.);
+#6454 = EDGE_CURVE('',#6427,#6455,#6457,.T.);
+#6455 = VERTEX_POINT('',#6456);
+#6456 = CARTESIAN_POINT('',(-3.9475,4.36,2.4225));
+#6457 = SURFACE_CURVE('',#6458,(#6462,#6469),.PCURVE_S1.);
+#6458 = LINE('',#6459,#6460);
+#6459 = CARTESIAN_POINT('',(-3.9475,4.36,0.275));
+#6460 = VECTOR('',#6461,1.);
+#6461 = DIRECTION('',(0.,0.,1.));
+#6462 = PCURVE('',#6290,#6463);
+#6463 = DEFINITIONAL_REPRESENTATION('',(#6464),#6468);
+#6464 = LINE('',#6465,#6466);
+#6465 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#6466 = VECTOR('',#6467,1.);
+#6467 = DIRECTION('',(0.,1.));
+#6468 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6469 = PCURVE('',#6470,#6475);
+#6470 = PLANE('',#6471);
+#6471 = AXIS2_PLACEMENT_3D('',#6472,#6473,#6474);
+#6472 = CARTESIAN_POINT('',(-3.724778209321,4.36,1.581028209321));
+#6473 = DIRECTION('',(2.616880222009E-29,1.,-2.312216259511E-30));
+#6474 = DIRECTION('',(1.,-2.616880222009E-29,0.));
+#6475 = DEFINITIONAL_REPRESENTATION('',(#6476),#6480);
+#6476 = LINE('',#6477,#6478);
+#6477 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#6478 = VECTOR('',#6479,1.);
+#6479 = DIRECTION('',(0.,-1.));
+#6480 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6481 = ORIENTED_EDGE('',*,*,#6482,.T.);
+#6482 = EDGE_CURVE('',#6455,#6280,#6483,.T.);
+#6483 = SURFACE_CURVE('',#6484,(#6488,#6495),.PCURVE_S1.);
+#6484 = LINE('',#6485,#6486);
+#6485 = CARTESIAN_POINT('',(-3.9475,4.36,2.4225));
+#6486 = VECTOR('',#6487,1.);
+#6487 = DIRECTION('',(0.,-1.,0.));
+#6488 = PCURVE('',#6290,#6489);
+#6489 = DEFINITIONAL_REPRESENTATION('',(#6490),#6494);
+#6490 = LINE('',#6491,#6492);
+#6491 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#6492 = VECTOR('',#6493,1.);
+#6493 = DIRECTION('',(-1.,2.226071387182E-62));
+#6494 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6495 = PCURVE('',#6496,#6501);
+#6496 = CYLINDRICAL_SURFACE('',#6497,0.1375);
+#6497 = AXIS2_PLACEMENT_3D('',#6498,#6499,#6500);
+#6498 = CARTESIAN_POINT('',(-3.81,4.36,2.4225));
+#6499 = DIRECTION('',(0.,-1.,0.));
+#6500 = DIRECTION('',(-1.,-0.,-9.8088568672E-33));
+#6501 = DEFINITIONAL_REPRESENTATION('',(#6502),#6506);
+#6502 = LINE('',#6503,#6504);
+#6503 = CARTESIAN_POINT('',(-0.,0.));
+#6504 = VECTOR('',#6505,1.);
+#6505 = DIRECTION('',(-0.,1.));
+#6506 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6507 = ADVANCED_FACE('',(#6508),#6302,.T.);
+#6508 = FACE_BOUND('',#6509,.T.);
+#6509 = EDGE_LOOP('',(#6510,#6540,#6566,#6567,#6590,#6618,#6646));
+#6510 = ORIENTED_EDGE('',*,*,#6511,.T.);
+#6511 = EDGE_CURVE('',#6512,#6514,#6516,.T.);
+#6512 = VERTEX_POINT('',#6513);
+#6513 = CARTESIAN_POINT('',(-3.175,3.26,2.56));
+#6514 = VERTEX_POINT('',#6515);
+#6515 = CARTESIAN_POINT('',(-3.81,3.26,2.56));
+#6516 = SURFACE_CURVE('',#6517,(#6521,#6528),.PCURVE_S1.);
+#6517 = LINE('',#6518,#6519);
+#6518 = CARTESIAN_POINT('',(-3.6725,3.26,2.56));
+#6519 = VECTOR('',#6520,1.);
+#6520 = DIRECTION('',(-1.,0.,0.));
+#6521 = PCURVE('',#6302,#6522);
+#6522 = DEFINITIONAL_REPRESENTATION('',(#6523),#6527);
+#6523 = LINE('',#6524,#6525);
+#6524 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#6525 = VECTOR('',#6526,1.);
+#6526 = DIRECTION('',(1.,1.676027028956E-59));
+#6527 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6528 = PCURVE('',#6529,#6534);
+#6529 = PLANE('',#6530);
+#6530 = AXIS2_PLACEMENT_3D('',#6531,#6532,#6533);
+#6531 = CARTESIAN_POINT('',(-3.56125,3.81,2.56));
+#6532 = DIRECTION('',(1.601195610168E-30,3.925633828627E-30,1.));
+#6533 = DIRECTION('',(0.,1.,-3.925633828627E-30));
+#6534 = DEFINITIONAL_REPRESENTATION('',(#6535),#6539);
+#6535 = LINE('',#6536,#6537);
+#6536 = CARTESIAN_POINT('',(-0.55,0.11125));
+#6537 = VECTOR('',#6538,1.);
+#6538 = DIRECTION('',(0.,1.));
+#6539 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6540 = ORIENTED_EDGE('',*,*,#6541,.F.);
+#6541 = EDGE_CURVE('',#6280,#6514,#6542,.T.);
+#6542 = SURFACE_CURVE('',#6543,(#6548,#6559),.PCURVE_S1.);
+#6543 = CIRCLE('',#6544,0.1375);
+#6544 = AXIS2_PLACEMENT_3D('',#6545,#6546,#6547);
+#6545 = CARTESIAN_POINT('',(-3.81,3.26,2.4225));
+#6546 = DIRECTION('',(-0.,1.,0.));
+#6547 = DIRECTION('',(0.,0.,-1.));
+#6548 = PCURVE('',#6302,#6549);
+#6549 = DEFINITIONAL_REPRESENTATION('',(#6550),#6558);
+#6550 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#6551,#6552,#6553,#6554,
+#6555,#6556,#6557),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2
+ ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786,
+6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE()
+GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,
+1.,0.5,1.)) REPRESENTATION_ITEM('') );
+#6551 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#6552 = CARTESIAN_POINT('',(0.323378776719,-0.703971790679));
+#6553 = CARTESIAN_POINT('',(0.204300283699,-0.910221790679));
+#6554 = CARTESIAN_POINT('',(8.522179067866E-02,-1.116471790679));
+#6555 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.910221790679));
+#6556 = CARTESIAN_POINT('',(-0.152935195362,-0.703971790679));
+#6557 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#6558 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6559 = PCURVE('',#6496,#6560);
+#6560 = DEFINITIONAL_REPRESENTATION('',(#6561),#6565);
+#6561 = LINE('',#6562,#6563);
+#6562 = CARTESIAN_POINT('',(1.570796326795,1.1));
+#6563 = VECTOR('',#6564,1.);
+#6564 = DIRECTION('',(-1.,0.));
+#6565 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6566 = ORIENTED_EDGE('',*,*,#6279,.T.);
+#6567 = ORIENTED_EDGE('',*,*,#6568,.F.);
+#6568 = EDGE_CURVE('',#6569,#6282,#6571,.T.);
+#6569 = VERTEX_POINT('',#6570);
+#6570 = CARTESIAN_POINT('',(-3.6725,3.26,0.275));
+#6571 = SURFACE_CURVE('',#6572,(#6576,#6583),.PCURVE_S1.);
+#6572 = LINE('',#6573,#6574);
+#6573 = CARTESIAN_POINT('',(-3.6725,3.26,0.275));
+#6574 = VECTOR('',#6575,1.);
+#6575 = DIRECTION('',(-1.,0.,0.));
+#6576 = PCURVE('',#6302,#6577);
+#6577 = DEFINITIONAL_REPRESENTATION('',(#6578),#6582);
+#6578 = LINE('',#6579,#6580);
+#6579 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#6580 = VECTOR('',#6581,1.);
+#6581 = DIRECTION('',(1.,1.676027028956E-59));
+#6582 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6583 = PCURVE('',#6330,#6584);
+#6584 = DEFINITIONAL_REPRESENTATION('',(#6585),#6589);
+#6585 = LINE('',#6586,#6587);
+#6586 = CARTESIAN_POINT('',(0.,0.));
+#6587 = VECTOR('',#6588,1.);
+#6588 = DIRECTION('',(0.,-1.));
+#6589 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6590 = ORIENTED_EDGE('',*,*,#6591,.F.);
+#6591 = EDGE_CURVE('',#6592,#6569,#6594,.T.);
+#6592 = VERTEX_POINT('',#6593);
+#6593 = CARTESIAN_POINT('',(-3.6725,3.26,2.285));
+#6594 = SURFACE_CURVE('',#6595,(#6599,#6606),.PCURVE_S1.);
+#6595 = LINE('',#6596,#6597);
+#6596 = CARTESIAN_POINT('',(-3.6725,3.26,2.56));
+#6597 = VECTOR('',#6598,1.);
+#6598 = DIRECTION('',(0.,0.,-1.));
+#6599 = PCURVE('',#6302,#6600);
+#6600 = DEFINITIONAL_REPRESENTATION('',(#6601),#6605);
+#6601 = LINE('',#6602,#6603);
+#6602 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#6603 = VECTOR('',#6604,1.);
+#6604 = DIRECTION('',(0.,1.));
+#6605 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6606 = PCURVE('',#6607,#6612);
+#6607 = PLANE('',#6608);
+#6608 = AXIS2_PLACEMENT_3D('',#6609,#6610,#6611);
+#6609 = CARTESIAN_POINT('',(-3.6725,3.81,-0.34105853382));
+#6610 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#6611 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#6612 = DEFINITIONAL_REPRESENTATION('',(#6613),#6617);
+#6613 = LINE('',#6614,#6615);
+#6614 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#6615 = VECTOR('',#6616,1.);
+#6616 = DIRECTION('',(0.,-1.));
+#6617 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6618 = ORIENTED_EDGE('',*,*,#6619,.T.);
+#6619 = EDGE_CURVE('',#6592,#6620,#6622,.T.);
+#6620 = VERTEX_POINT('',#6621);
+#6621 = CARTESIAN_POINT('',(-3.175,3.26,2.285));
+#6622 = SURFACE_CURVE('',#6623,(#6627,#6634),.PCURVE_S1.);
+#6623 = LINE('',#6624,#6625);
+#6624 = CARTESIAN_POINT('',(-3.6725,3.26,2.285));
+#6625 = VECTOR('',#6626,1.);
+#6626 = DIRECTION('',(1.,0.,0.));
+#6627 = PCURVE('',#6302,#6628);
+#6628 = DEFINITIONAL_REPRESENTATION('',(#6629),#6633);
+#6629 = LINE('',#6630,#6631);
+#6630 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.703971790679));
+#6631 = VECTOR('',#6632,1.);
+#6632 = DIRECTION('',(-1.,-1.676027028956E-59));
+#6633 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6634 = PCURVE('',#6635,#6640);
+#6635 = PLANE('',#6636);
+#6636 = AXIS2_PLACEMENT_3D('',#6637,#6638,#6639);
+#6637 = CARTESIAN_POINT('',(-3.6725,3.26,2.285));
+#6638 = DIRECTION('',(0.,0.,1.));
+#6639 = DIRECTION('',(1.,0.,0.));
+#6640 = DEFINITIONAL_REPRESENTATION('',(#6641),#6645);
+#6641 = LINE('',#6642,#6643);
+#6642 = CARTESIAN_POINT('',(0.,0.));
+#6643 = VECTOR('',#6644,1.);
+#6644 = DIRECTION('',(1.,0.));
+#6645 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6646 = ORIENTED_EDGE('',*,*,#6647,.T.);
+#6647 = EDGE_CURVE('',#6620,#6512,#6648,.T.);
+#6648 = SURFACE_CURVE('',#6649,(#6653,#6660),.PCURVE_S1.);
+#6649 = LINE('',#6650,#6651);
+#6650 = CARTESIAN_POINT('',(-3.175,3.26,2.285));
+#6651 = VECTOR('',#6652,1.);
+#6652 = DIRECTION('',(0.,0.,1.));
+#6653 = PCURVE('',#6302,#6654);
+#6654 = DEFINITIONAL_REPRESENTATION('',(#6655),#6659);
+#6655 = LINE('',#6656,#6657);
+#6656 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#6657 = VECTOR('',#6658,1.);
+#6658 = DIRECTION('',(0.,-1.));
+#6659 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6660 = PCURVE('',#6661,#6666);
+#6661 = PLANE('',#6662);
+#6662 = AXIS2_PLACEMENT_3D('',#6663,#6664,#6665);
+#6663 = CARTESIAN_POINT('',(-3.175,3.26,2.285));
+#6664 = DIRECTION('',(1.,0.,0.));
+#6665 = DIRECTION('',(0.,0.,1.));
+#6666 = DEFINITIONAL_REPRESENTATION('',(#6667),#6671);
+#6667 = LINE('',#6668,#6669);
+#6668 = CARTESIAN_POINT('',(0.,0.));
+#6669 = VECTOR('',#6670,1.);
+#6670 = DIRECTION('',(1.,0.));
+#6671 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6672 = ADVANCED_FACE('',(#6673),#6496,.T.);
+#6673 = FACE_BOUND('',#6674,.F.);
+#6674 = EDGE_LOOP('',(#6675,#6699,#6720,#6721));
+#6675 = ORIENTED_EDGE('',*,*,#6676,.T.);
+#6676 = EDGE_CURVE('',#6455,#6677,#6679,.T.);
+#6677 = VERTEX_POINT('',#6678);
+#6678 = CARTESIAN_POINT('',(-3.81,4.36,2.56));
+#6679 = SURFACE_CURVE('',#6680,(#6685,#6692),.PCURVE_S1.);
+#6680 = CIRCLE('',#6681,0.1375);
+#6681 = AXIS2_PLACEMENT_3D('',#6682,#6683,#6684);
+#6682 = CARTESIAN_POINT('',(-3.81,4.36,2.4225));
+#6683 = DIRECTION('',(-0.,1.,0.));
+#6684 = DIRECTION('',(0.,0.,-1.));
+#6685 = PCURVE('',#6496,#6686);
+#6686 = DEFINITIONAL_REPRESENTATION('',(#6687),#6691);
+#6687 = LINE('',#6688,#6689);
+#6688 = CARTESIAN_POINT('',(1.570796326795,3.552713678801E-15));
+#6689 = VECTOR('',#6690,1.);
+#6690 = DIRECTION('',(-1.,0.));
+#6691 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6692 = PCURVE('',#6470,#6693);
+#6693 = DEFINITIONAL_REPRESENTATION('',(#6694),#6698);
+#6694 = CIRCLE('',#6695,0.1375);
+#6695 = AXIS2_PLACEMENT_2D('',#6696,#6697);
+#6696 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#6697 = DIRECTION('',(0.,1.));
+#6698 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6699 = ORIENTED_EDGE('',*,*,#6700,.T.);
+#6700 = EDGE_CURVE('',#6677,#6514,#6701,.T.);
+#6701 = SURFACE_CURVE('',#6702,(#6706,#6713),.PCURVE_S1.);
+#6702 = LINE('',#6703,#6704);
+#6703 = CARTESIAN_POINT('',(-3.81,4.36,2.56));
+#6704 = VECTOR('',#6705,1.);
+#6705 = DIRECTION('',(0.,-1.,0.));
+#6706 = PCURVE('',#6496,#6707);
+#6707 = DEFINITIONAL_REPRESENTATION('',(#6708),#6712);
+#6708 = LINE('',#6709,#6710);
+#6709 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#6710 = VECTOR('',#6711,1.);
+#6711 = DIRECTION('',(-0.,1.));
+#6712 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6713 = PCURVE('',#6529,#6714);
+#6714 = DEFINITIONAL_REPRESENTATION('',(#6715),#6719);
+#6715 = LINE('',#6716,#6717);
+#6716 = CARTESIAN_POINT('',(0.55,0.24875));
+#6717 = VECTOR('',#6718,1.);
+#6718 = DIRECTION('',(-1.,-6.285707653525E-60));
+#6719 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6720 = ORIENTED_EDGE('',*,*,#6541,.F.);
+#6721 = ORIENTED_EDGE('',*,*,#6482,.F.);
+#6722 = ADVANCED_FACE('',(#6723),#6330,.T.);
+#6723 = FACE_BOUND('',#6724,.T.);
+#6724 = EDGE_LOOP('',(#6725,#6726,#6727,#6750));
+#6725 = ORIENTED_EDGE('',*,*,#6568,.T.);
+#6726 = ORIENTED_EDGE('',*,*,#6314,.T.);
+#6727 = ORIENTED_EDGE('',*,*,#6728,.F.);
+#6728 = EDGE_CURVE('',#6729,#6315,#6731,.T.);
+#6729 = VERTEX_POINT('',#6730);
+#6730 = CARTESIAN_POINT('',(-3.6725,3.535,0.));
+#6731 = SURFACE_CURVE('',#6732,(#6736,#6743),.PCURVE_S1.);
+#6732 = LINE('',#6733,#6734);
+#6733 = CARTESIAN_POINT('',(-3.6725,3.535,0.));
+#6734 = VECTOR('',#6735,1.);
+#6735 = DIRECTION('',(-1.,0.,0.));
+#6736 = PCURVE('',#6330,#6737);
+#6737 = DEFINITIONAL_REPRESENTATION('',(#6738),#6742);
+#6738 = LINE('',#6739,#6740);
+#6739 = CARTESIAN_POINT('',(0.388908729653,0.));
+#6740 = VECTOR('',#6741,1.);
+#6741 = DIRECTION('',(0.,-1.));
+#6742 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6743 = PCURVE('',#6358,#6744);
+#6744 = DEFINITIONAL_REPRESENTATION('',(#6745),#6749);
+#6745 = LINE('',#6746,#6747);
+#6746 = CARTESIAN_POINT('',(0.,0.));
+#6747 = VECTOR('',#6748,1.);
+#6748 = DIRECTION('',(0.,-1.));
+#6749 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6750 = ORIENTED_EDGE('',*,*,#6751,.F.);
+#6751 = EDGE_CURVE('',#6569,#6729,#6752,.T.);
+#6752 = SURFACE_CURVE('',#6753,(#6757,#6764),.PCURVE_S1.);
+#6753 = LINE('',#6754,#6755);
+#6754 = CARTESIAN_POINT('',(-3.6725,3.26,0.275));
+#6755 = VECTOR('',#6756,1.);
+#6756 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#6757 = PCURVE('',#6330,#6758);
+#6758 = DEFINITIONAL_REPRESENTATION('',(#6759),#6763);
+#6759 = LINE('',#6760,#6761);
+#6760 = CARTESIAN_POINT('',(0.,0.));
+#6761 = VECTOR('',#6762,1.);
+#6762 = DIRECTION('',(1.,0.));
+#6763 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6764 = PCURVE('',#6607,#6765);
+#6765 = DEFINITIONAL_REPRESENTATION('',(#6766),#6770);
+#6766 = LINE('',#6767,#6768);
+#6767 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#6768 = VECTOR('',#6769,1.);
+#6769 = DIRECTION('',(0.707106781187,-0.707106781187));
+#6770 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6771 = ADVANCED_FACE('',(#6772),#6470,.T.);
+#6772 = FACE_BOUND('',#6773,.T.);
+#6773 = EDGE_LOOP('',(#6774,#6775,#6776,#6799,#6822,#6845,#6868));
+#6774 = ORIENTED_EDGE('',*,*,#6454,.T.);
+#6775 = ORIENTED_EDGE('',*,*,#6676,.T.);
+#6776 = ORIENTED_EDGE('',*,*,#6777,.T.);
+#6777 = EDGE_CURVE('',#6677,#6778,#6780,.T.);
+#6778 = VERTEX_POINT('',#6779);
+#6779 = CARTESIAN_POINT('',(-3.175,4.36,2.56));
+#6780 = SURFACE_CURVE('',#6781,(#6785,#6792),.PCURVE_S1.);
+#6781 = LINE('',#6782,#6783);
+#6782 = CARTESIAN_POINT('',(-3.6725,4.36,2.56));
+#6783 = VECTOR('',#6784,1.);
+#6784 = DIRECTION('',(1.,0.,0.));
+#6785 = PCURVE('',#6470,#6786);
+#6786 = DEFINITIONAL_REPRESENTATION('',(#6787),#6791);
+#6787 = LINE('',#6788,#6789);
+#6788 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#6789 = VECTOR('',#6790,1.);
+#6790 = DIRECTION('',(1.,-6.050792998522E-59));
+#6791 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6792 = PCURVE('',#6529,#6793);
+#6793 = DEFINITIONAL_REPRESENTATION('',(#6794),#6798);
+#6794 = LINE('',#6795,#6796);
+#6795 = CARTESIAN_POINT('',(0.55,0.11125));
+#6796 = VECTOR('',#6797,1.);
+#6797 = DIRECTION('',(0.,-1.));
+#6798 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6799 = ORIENTED_EDGE('',*,*,#6800,.F.);
+#6800 = EDGE_CURVE('',#6801,#6778,#6803,.T.);
+#6801 = VERTEX_POINT('',#6802);
+#6802 = CARTESIAN_POINT('',(-3.175,4.36,2.285));
+#6803 = SURFACE_CURVE('',#6804,(#6808,#6815),.PCURVE_S1.);
+#6804 = LINE('',#6805,#6806);
+#6805 = CARTESIAN_POINT('',(-3.175,4.36,2.285));
+#6806 = VECTOR('',#6807,1.);
+#6807 = DIRECTION('',(0.,0.,1.));
+#6808 = PCURVE('',#6470,#6809);
+#6809 = DEFINITIONAL_REPRESENTATION('',(#6810),#6814);
+#6810 = LINE('',#6811,#6812);
+#6811 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#6812 = VECTOR('',#6813,1.);
+#6813 = DIRECTION('',(0.,-1.));
+#6814 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6815 = PCURVE('',#6661,#6816);
+#6816 = DEFINITIONAL_REPRESENTATION('',(#6817),#6821);
+#6817 = LINE('',#6818,#6819);
+#6818 = CARTESIAN_POINT('',(0.,-1.1));
+#6819 = VECTOR('',#6820,1.);
+#6820 = DIRECTION('',(1.,0.));
+#6821 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6822 = ORIENTED_EDGE('',*,*,#6823,.F.);
+#6823 = EDGE_CURVE('',#6824,#6801,#6826,.T.);
+#6824 = VERTEX_POINT('',#6825);
+#6825 = CARTESIAN_POINT('',(-3.6725,4.36,2.285));
+#6826 = SURFACE_CURVE('',#6827,(#6831,#6838),.PCURVE_S1.);
+#6827 = LINE('',#6828,#6829);
+#6828 = CARTESIAN_POINT('',(-3.6725,4.36,2.285));
+#6829 = VECTOR('',#6830,1.);
+#6830 = DIRECTION('',(1.,0.,0.));
+#6831 = PCURVE('',#6470,#6832);
+#6832 = DEFINITIONAL_REPRESENTATION('',(#6833),#6837);
+#6833 = LINE('',#6834,#6835);
+#6834 = CARTESIAN_POINT('',(5.227820932134E-02,-0.703971790679));
+#6835 = VECTOR('',#6836,1.);
+#6836 = DIRECTION('',(1.,-6.050792998522E-59));
+#6837 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6838 = PCURVE('',#6635,#6839);
+#6839 = DEFINITIONAL_REPRESENTATION('',(#6840),#6844);
+#6840 = LINE('',#6841,#6842);
+#6841 = CARTESIAN_POINT('',(0.,1.1));
+#6842 = VECTOR('',#6843,1.);
+#6843 = DIRECTION('',(1.,0.));
+#6844 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6845 = ORIENTED_EDGE('',*,*,#6846,.F.);
+#6846 = EDGE_CURVE('',#6847,#6824,#6849,.T.);
+#6847 = VERTEX_POINT('',#6848);
+#6848 = CARTESIAN_POINT('',(-3.6725,4.36,0.275));
+#6849 = SURFACE_CURVE('',#6850,(#6854,#6861),.PCURVE_S1.);
+#6850 = LINE('',#6851,#6852);
+#6851 = CARTESIAN_POINT('',(-3.6725,4.36,0.275));
+#6852 = VECTOR('',#6853,1.);
+#6853 = DIRECTION('',(0.,0.,1.));
+#6854 = PCURVE('',#6470,#6855);
+#6855 = DEFINITIONAL_REPRESENTATION('',(#6856),#6860);
+#6856 = LINE('',#6857,#6858);
+#6857 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#6858 = VECTOR('',#6859,1.);
+#6859 = DIRECTION('',(0.,-1.));
+#6860 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6861 = PCURVE('',#6607,#6862);
+#6862 = DEFINITIONAL_REPRESENTATION('',(#6863),#6867);
+#6863 = LINE('',#6864,#6865);
+#6864 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#6865 = VECTOR('',#6866,1.);
+#6866 = DIRECTION('',(0.,1.));
+#6867 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6868 = ORIENTED_EDGE('',*,*,#6869,.T.);
+#6869 = EDGE_CURVE('',#6847,#6427,#6870,.T.);
+#6870 = SURFACE_CURVE('',#6871,(#6875,#6882),.PCURVE_S1.);
+#6871 = LINE('',#6872,#6873);
+#6872 = CARTESIAN_POINT('',(-3.6725,4.36,0.275));
+#6873 = VECTOR('',#6874,1.);
+#6874 = DIRECTION('',(-1.,0.,0.));
+#6875 = PCURVE('',#6470,#6876);
+#6876 = DEFINITIONAL_REPRESENTATION('',(#6877),#6881);
+#6877 = LINE('',#6878,#6879);
+#6878 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#6879 = VECTOR('',#6880,1.);
+#6880 = DIRECTION('',(-1.,6.050792998522E-59));
+#6881 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6882 = PCURVE('',#6442,#6883);
+#6883 = DEFINITIONAL_REPRESENTATION('',(#6884),#6888);
+#6884 = LINE('',#6885,#6886);
+#6885 = CARTESIAN_POINT('',(0.388908729653,0.));
+#6886 = VECTOR('',#6887,1.);
+#6887 = DIRECTION('',(0.,-1.));
+#6888 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6889 = ADVANCED_FACE('',(#6890),#6358,.T.);
+#6890 = FACE_BOUND('',#6891,.T.);
+#6891 = EDGE_LOOP('',(#6892,#6893,#6894,#6917));
+#6892 = ORIENTED_EDGE('',*,*,#6728,.T.);
+#6893 = ORIENTED_EDGE('',*,*,#6342,.T.);
+#6894 = ORIENTED_EDGE('',*,*,#6895,.F.);
+#6895 = EDGE_CURVE('',#6896,#6343,#6898,.T.);
+#6896 = VERTEX_POINT('',#6897);
+#6897 = CARTESIAN_POINT('',(-3.6725,3.535,-3.5));
+#6898 = SURFACE_CURVE('',#6899,(#6903,#6910),.PCURVE_S1.);
+#6899 = LINE('',#6900,#6901);
+#6900 = CARTESIAN_POINT('',(-3.6725,3.535,-3.5));
+#6901 = VECTOR('',#6902,1.);
+#6902 = DIRECTION('',(-1.,0.,0.));
+#6903 = PCURVE('',#6358,#6904);
+#6904 = DEFINITIONAL_REPRESENTATION('',(#6905),#6909);
+#6905 = LINE('',#6906,#6907);
+#6906 = CARTESIAN_POINT('',(3.5,0.));
+#6907 = VECTOR('',#6908,1.);
+#6908 = DIRECTION('',(0.,-1.));
+#6909 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6910 = PCURVE('',#6386,#6911);
+#6911 = DEFINITIONAL_REPRESENTATION('',(#6912),#6916);
+#6912 = LINE('',#6913,#6914);
+#6913 = CARTESIAN_POINT('',(3.330669073875E-16,0.));
+#6914 = VECTOR('',#6915,1.);
+#6915 = DIRECTION('',(0.,-1.));
+#6916 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6917 = ORIENTED_EDGE('',*,*,#6918,.F.);
+#6918 = EDGE_CURVE('',#6729,#6896,#6919,.T.);
+#6919 = SURFACE_CURVE('',#6920,(#6924,#6931),.PCURVE_S1.);
+#6920 = LINE('',#6921,#6922);
+#6921 = CARTESIAN_POINT('',(-3.6725,3.535,0.));
+#6922 = VECTOR('',#6923,1.);
+#6923 = DIRECTION('',(0.,0.,-1.));
+#6924 = PCURVE('',#6358,#6925);
+#6925 = DEFINITIONAL_REPRESENTATION('',(#6926),#6930);
+#6926 = LINE('',#6927,#6928);
+#6927 = CARTESIAN_POINT('',(0.,0.));
+#6928 = VECTOR('',#6929,1.);
+#6929 = DIRECTION('',(1.,0.));
+#6930 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6931 = PCURVE('',#6607,#6932);
+#6932 = DEFINITIONAL_REPRESENTATION('',(#6933),#6937);
+#6933 = LINE('',#6934,#6935);
+#6934 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#6935 = VECTOR('',#6936,1.);
+#6936 = DIRECTION('',(0.,-1.));
+#6937 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6938 = ADVANCED_FACE('',(#6939),#6442,.T.);
+#6939 = FACE_BOUND('',#6940,.T.);
+#6940 = EDGE_LOOP('',(#6941,#6964,#6965,#6966));
+#6941 = ORIENTED_EDGE('',*,*,#6942,.T.);
+#6942 = EDGE_CURVE('',#6943,#6399,#6945,.T.);
+#6943 = VERTEX_POINT('',#6944);
+#6944 = CARTESIAN_POINT('',(-3.6725,4.085,0.));
+#6945 = SURFACE_CURVE('',#6946,(#6950,#6957),.PCURVE_S1.);
+#6946 = LINE('',#6947,#6948);
+#6947 = CARTESIAN_POINT('',(-3.6725,4.085,0.));
+#6948 = VECTOR('',#6949,1.);
+#6949 = DIRECTION('',(-1.,0.,0.));
+#6950 = PCURVE('',#6442,#6951);
+#6951 = DEFINITIONAL_REPRESENTATION('',(#6952),#6956);
+#6952 = LINE('',#6953,#6954);
+#6953 = CARTESIAN_POINT('',(-6.280369834735E-16,0.));
+#6954 = VECTOR('',#6955,1.);
+#6955 = DIRECTION('',(0.,-1.));
+#6956 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6957 = PCURVE('',#6414,#6958);
+#6958 = DEFINITIONAL_REPRESENTATION('',(#6959),#6963);
+#6959 = LINE('',#6960,#6961);
+#6960 = CARTESIAN_POINT('',(3.5,0.));
+#6961 = VECTOR('',#6962,1.);
+#6962 = DIRECTION('',(0.,-1.));
+#6963 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6964 = ORIENTED_EDGE('',*,*,#6426,.T.);
+#6965 = ORIENTED_EDGE('',*,*,#6869,.F.);
+#6966 = ORIENTED_EDGE('',*,*,#6967,.F.);
+#6967 = EDGE_CURVE('',#6943,#6847,#6968,.T.);
+#6968 = SURFACE_CURVE('',#6969,(#6973,#6980),.PCURVE_S1.);
+#6969 = LINE('',#6970,#6971);
+#6970 = CARTESIAN_POINT('',(-3.6725,4.085,0.));
+#6971 = VECTOR('',#6972,1.);
+#6972 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#6973 = PCURVE('',#6442,#6974);
+#6974 = DEFINITIONAL_REPRESENTATION('',(#6975),#6979);
+#6975 = LINE('',#6976,#6977);
+#6976 = CARTESIAN_POINT('',(0.,0.));
+#6977 = VECTOR('',#6978,1.);
+#6978 = DIRECTION('',(1.,0.));
+#6979 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6980 = PCURVE('',#6607,#6981);
+#6981 = DEFINITIONAL_REPRESENTATION('',(#6982),#6986);
+#6982 = LINE('',#6983,#6984);
+#6983 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#6984 = VECTOR('',#6985,1.);
+#6985 = DIRECTION('',(0.707106781187,0.707106781187));
+#6986 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#6987 = ADVANCED_FACE('',(#6988),#6386,.T.);
+#6988 = FACE_BOUND('',#6989,.T.);
+#6989 = EDGE_LOOP('',(#6990,#6991,#6992,#7015));
+#6990 = ORIENTED_EDGE('',*,*,#6895,.T.);
+#6991 = ORIENTED_EDGE('',*,*,#6370,.T.);
+#6992 = ORIENTED_EDGE('',*,*,#6993,.F.);
+#6993 = EDGE_CURVE('',#6994,#6371,#6996,.T.);
+#6994 = VERTEX_POINT('',#6995);
+#6995 = CARTESIAN_POINT('',(-3.6725,4.085,-3.5));
+#6996 = SURFACE_CURVE('',#6997,(#7001,#7008),.PCURVE_S1.);
+#6997 = LINE('',#6998,#6999);
+#6998 = CARTESIAN_POINT('',(-3.6725,4.085,-3.5));
+#6999 = VECTOR('',#7000,1.);
+#7000 = DIRECTION('',(-1.,0.,0.));
+#7001 = PCURVE('',#6386,#7002);
+#7002 = DEFINITIONAL_REPRESENTATION('',(#7003),#7007);
+#7003 = LINE('',#7004,#7005);
+#7004 = CARTESIAN_POINT('',(0.55,0.));
+#7005 = VECTOR('',#7006,1.);
+#7006 = DIRECTION('',(0.,-1.));
+#7007 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7008 = PCURVE('',#6414,#7009);
+#7009 = DEFINITIONAL_REPRESENTATION('',(#7010),#7014);
+#7010 = LINE('',#7011,#7012);
+#7011 = CARTESIAN_POINT('',(0.,0.));
+#7012 = VECTOR('',#7013,1.);
+#7013 = DIRECTION('',(0.,-1.));
+#7014 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7015 = ORIENTED_EDGE('',*,*,#7016,.F.);
+#7016 = EDGE_CURVE('',#6896,#6994,#7017,.T.);
+#7017 = SURFACE_CURVE('',#7018,(#7022,#7029),.PCURVE_S1.);
+#7018 = LINE('',#7019,#7020);
+#7019 = CARTESIAN_POINT('',(-3.6725,3.535,-3.5));
+#7020 = VECTOR('',#7021,1.);
+#7021 = DIRECTION('',(0.,1.,0.));
+#7022 = PCURVE('',#6386,#7023);
+#7023 = DEFINITIONAL_REPRESENTATION('',(#7024),#7028);
+#7024 = LINE('',#7025,#7026);
+#7025 = CARTESIAN_POINT('',(0.,0.));
+#7026 = VECTOR('',#7027,1.);
+#7027 = DIRECTION('',(1.,0.));
+#7028 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7029 = PCURVE('',#6607,#7030);
+#7030 = DEFINITIONAL_REPRESENTATION('',(#7031),#7035);
+#7031 = LINE('',#7032,#7033);
+#7032 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#7033 = VECTOR('',#7034,1.);
+#7034 = DIRECTION('',(1.,-2.226071387182E-62));
+#7035 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7036 = ADVANCED_FACE('',(#7037),#6414,.T.);
+#7037 = FACE_BOUND('',#7038,.T.);
+#7038 = EDGE_LOOP('',(#7039,#7040,#7041,#7042));
+#7039 = ORIENTED_EDGE('',*,*,#6993,.T.);
+#7040 = ORIENTED_EDGE('',*,*,#6398,.T.);
+#7041 = ORIENTED_EDGE('',*,*,#6942,.F.);
+#7042 = ORIENTED_EDGE('',*,*,#7043,.F.);
+#7043 = EDGE_CURVE('',#6994,#6943,#7044,.T.);
+#7044 = SURFACE_CURVE('',#7045,(#7049,#7056),.PCURVE_S1.);
+#7045 = LINE('',#7046,#7047);
+#7046 = CARTESIAN_POINT('',(-3.6725,4.085,-3.5));
+#7047 = VECTOR('',#7048,1.);
+#7048 = DIRECTION('',(0.,0.,1.));
+#7049 = PCURVE('',#6414,#7050);
+#7050 = DEFINITIONAL_REPRESENTATION('',(#7051),#7055);
+#7051 = LINE('',#7052,#7053);
+#7052 = CARTESIAN_POINT('',(0.,0.));
+#7053 = VECTOR('',#7054,1.);
+#7054 = DIRECTION('',(1.,0.));
+#7055 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7056 = PCURVE('',#6607,#7057);
+#7057 = DEFINITIONAL_REPRESENTATION('',(#7058),#7062);
+#7058 = LINE('',#7059,#7060);
+#7059 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#7060 = VECTOR('',#7061,1.);
+#7061 = DIRECTION('',(0.,1.));
+#7062 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7063 = ADVANCED_FACE('',(#7064),#6529,.T.);
+#7064 = FACE_BOUND('',#7065,.T.);
+#7065 = EDGE_LOOP('',(#7066,#7067,#7088,#7089));
+#7066 = ORIENTED_EDGE('',*,*,#6511,.F.);
+#7067 = ORIENTED_EDGE('',*,*,#7068,.T.);
+#7068 = EDGE_CURVE('',#6512,#6778,#7069,.T.);
+#7069 = SURFACE_CURVE('',#7070,(#7074,#7081),.PCURVE_S1.);
+#7070 = LINE('',#7071,#7072);
+#7071 = CARTESIAN_POINT('',(-3.175,3.26,2.56));
+#7072 = VECTOR('',#7073,1.);
+#7073 = DIRECTION('',(0.,1.,0.));
+#7074 = PCURVE('',#6529,#7075);
+#7075 = DEFINITIONAL_REPRESENTATION('',(#7076),#7080);
+#7076 = LINE('',#7077,#7078);
+#7077 = CARTESIAN_POINT('',(-0.55,-0.38625));
+#7078 = VECTOR('',#7079,1.);
+#7079 = DIRECTION('',(1.,6.285707653525E-60));
+#7080 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7081 = PCURVE('',#6661,#7082);
+#7082 = DEFINITIONAL_REPRESENTATION('',(#7083),#7087);
+#7083 = LINE('',#7084,#7085);
+#7084 = CARTESIAN_POINT('',(0.275,0.));
+#7085 = VECTOR('',#7086,1.);
+#7086 = DIRECTION('',(0.,-1.));
+#7087 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7088 = ORIENTED_EDGE('',*,*,#6777,.F.);
+#7089 = ORIENTED_EDGE('',*,*,#6700,.T.);
+#7090 = ADVANCED_FACE('',(#7091),#6661,.T.);
+#7091 = FACE_BOUND('',#7092,.T.);
+#7092 = EDGE_LOOP('',(#7093,#7094,#7115,#7116));
+#7093 = ORIENTED_EDGE('',*,*,#6647,.F.);
+#7094 = ORIENTED_EDGE('',*,*,#7095,.T.);
+#7095 = EDGE_CURVE('',#6620,#6801,#7096,.T.);
+#7096 = SURFACE_CURVE('',#7097,(#7101,#7108),.PCURVE_S1.);
+#7097 = LINE('',#7098,#7099);
+#7098 = CARTESIAN_POINT('',(-3.175,3.26,2.285));
+#7099 = VECTOR('',#7100,1.);
+#7100 = DIRECTION('',(0.,1.,0.));
+#7101 = PCURVE('',#6661,#7102);
+#7102 = DEFINITIONAL_REPRESENTATION('',(#7103),#7107);
+#7103 = LINE('',#7104,#7105);
+#7104 = CARTESIAN_POINT('',(0.,0.));
+#7105 = VECTOR('',#7106,1.);
+#7106 = DIRECTION('',(0.,-1.));
+#7107 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7108 = PCURVE('',#6635,#7109);
+#7109 = DEFINITIONAL_REPRESENTATION('',(#7110),#7114);
+#7110 = LINE('',#7111,#7112);
+#7111 = CARTESIAN_POINT('',(0.4975,0.));
+#7112 = VECTOR('',#7113,1.);
+#7113 = DIRECTION('',(0.,1.));
+#7114 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7115 = ORIENTED_EDGE('',*,*,#6800,.T.);
+#7116 = ORIENTED_EDGE('',*,*,#7068,.F.);
+#7117 = ADVANCED_FACE('',(#7118),#6635,.F.);
+#7118 = FACE_BOUND('',#7119,.F.);
+#7119 = EDGE_LOOP('',(#7120,#7141,#7142,#7143));
+#7120 = ORIENTED_EDGE('',*,*,#7121,.F.);
+#7121 = EDGE_CURVE('',#6592,#6824,#7122,.T.);
+#7122 = SURFACE_CURVE('',#7123,(#7127,#7134),.PCURVE_S1.);
+#7123 = LINE('',#7124,#7125);
+#7124 = CARTESIAN_POINT('',(-3.6725,3.26,2.285));
+#7125 = VECTOR('',#7126,1.);
+#7126 = DIRECTION('',(0.,1.,0.));
+#7127 = PCURVE('',#6635,#7128);
+#7128 = DEFINITIONAL_REPRESENTATION('',(#7129),#7133);
+#7129 = LINE('',#7130,#7131);
+#7130 = CARTESIAN_POINT('',(0.,0.));
+#7131 = VECTOR('',#7132,1.);
+#7132 = DIRECTION('',(0.,1.));
+#7133 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7134 = PCURVE('',#6607,#7135);
+#7135 = DEFINITIONAL_REPRESENTATION('',(#7136),#7140);
+#7136 = LINE('',#7137,#7138);
+#7137 = CARTESIAN_POINT('',(-0.55,2.62605853382));
+#7138 = VECTOR('',#7139,1.);
+#7139 = DIRECTION('',(1.,-2.226071387182E-62));
+#7140 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7141 = ORIENTED_EDGE('',*,*,#6619,.T.);
+#7142 = ORIENTED_EDGE('',*,*,#7095,.T.);
+#7143 = ORIENTED_EDGE('',*,*,#6823,.F.);
+#7144 = ADVANCED_FACE('',(#7145),#6607,.T.);
+#7145 = FACE_BOUND('',#7146,.T.);
+#7146 = EDGE_LOOP('',(#7147,#7148,#7149,#7150,#7151,#7152,#7153,#7154));
+#7147 = ORIENTED_EDGE('',*,*,#6846,.T.);
+#7148 = ORIENTED_EDGE('',*,*,#7121,.F.);
+#7149 = ORIENTED_EDGE('',*,*,#6591,.T.);
+#7150 = ORIENTED_EDGE('',*,*,#6751,.T.);
+#7151 = ORIENTED_EDGE('',*,*,#6918,.T.);
+#7152 = ORIENTED_EDGE('',*,*,#7016,.T.);
+#7153 = ORIENTED_EDGE('',*,*,#7043,.T.);
+#7154 = ORIENTED_EDGE('',*,*,#6967,.T.);
+#7155 = MANIFOLD_SOLID_BREP('',#7156);
+#7156 = CLOSED_SHELL('',(#7157,#7389,#7554,#7604,#7653,#7771,#7820,#7869
+ ,#7918,#7945,#7972,#7999,#8026));
+#7157 = ADVANCED_FACE('',(#7158),#7172,.F.);
+#7158 = FACE_BOUND('',#7159,.F.);
+#7159 = EDGE_LOOP('',(#7160,#7195,#7223,#7251,#7279,#7307,#7335,#7363));
+#7160 = ORIENTED_EDGE('',*,*,#7161,.T.);
+#7161 = EDGE_CURVE('',#7162,#7164,#7166,.T.);
+#7162 = VERTEX_POINT('',#7163);
+#7163 = CARTESIAN_POINT('',(3.9475,4.36,2.4225));
+#7164 = VERTEX_POINT('',#7165);
+#7165 = CARTESIAN_POINT('',(3.9475,4.36,0.275));
+#7166 = SURFACE_CURVE('',#7167,(#7171,#7183),.PCURVE_S1.);
+#7167 = LINE('',#7168,#7169);
+#7168 = CARTESIAN_POINT('',(3.9475,4.36,2.56));
+#7169 = VECTOR('',#7170,1.);
+#7170 = DIRECTION('',(0.,0.,-1.));
+#7171 = PCURVE('',#7172,#7177);
+#7172 = PLANE('',#7173);
+#7173 = AXIS2_PLACEMENT_3D('',#7174,#7175,#7176);
+#7174 = CARTESIAN_POINT('',(3.9475,3.81,-0.34105853382));
+#7175 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#7176 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#7177 = DEFINITIONAL_REPRESENTATION('',(#7178),#7182);
+#7178 = LINE('',#7179,#7180);
+#7179 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#7180 = VECTOR('',#7181,1.);
+#7181 = DIRECTION('',(0.,-1.));
+#7182 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7183 = PCURVE('',#7184,#7189);
+#7184 = PLANE('',#7185);
+#7185 = AXIS2_PLACEMENT_3D('',#7186,#7187,#7188);
+#7186 = CARTESIAN_POINT('',(3.724778209321,4.36,1.581028209321));
+#7187 = DIRECTION('',(3.17453643318E-29,1.,2.111838454822E-30));
+#7188 = DIRECTION('',(1.,-3.17453643318E-29,0.));
+#7189 = DEFINITIONAL_REPRESENTATION('',(#7190),#7194);
+#7190 = LINE('',#7191,#7192);
+#7191 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#7192 = VECTOR('',#7193,1.);
+#7193 = DIRECTION('',(0.,1.));
+#7194 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7195 = ORIENTED_EDGE('',*,*,#7196,.T.);
+#7196 = EDGE_CURVE('',#7164,#7197,#7199,.T.);
+#7197 = VERTEX_POINT('',#7198);
+#7198 = CARTESIAN_POINT('',(3.9475,4.085,0.));
+#7199 = SURFACE_CURVE('',#7200,(#7204,#7211),.PCURVE_S1.);
+#7200 = LINE('',#7201,#7202);
+#7201 = CARTESIAN_POINT('',(3.9475,4.36,0.275));
+#7202 = VECTOR('',#7203,1.);
+#7203 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#7204 = PCURVE('',#7172,#7205);
+#7205 = DEFINITIONAL_REPRESENTATION('',(#7206),#7210);
+#7206 = LINE('',#7207,#7208);
+#7207 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#7208 = VECTOR('',#7209,1.);
+#7209 = DIRECTION('',(0.707106781187,-0.707106781187));
+#7210 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7211 = PCURVE('',#7212,#7217);
+#7212 = PLANE('',#7213);
+#7213 = AXIS2_PLACEMENT_3D('',#7214,#7215,#7216);
+#7214 = CARTESIAN_POINT('',(3.6725,4.36,0.275));
+#7215 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#7216 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#7217 = DEFINITIONAL_REPRESENTATION('',(#7218),#7222);
+#7218 = LINE('',#7219,#7220);
+#7219 = CARTESIAN_POINT('',(0.,-0.275));
+#7220 = VECTOR('',#7221,1.);
+#7221 = DIRECTION('',(1.,0.));
+#7222 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7223 = ORIENTED_EDGE('',*,*,#7224,.T.);
+#7224 = EDGE_CURVE('',#7197,#7225,#7227,.T.);
+#7225 = VERTEX_POINT('',#7226);
+#7226 = CARTESIAN_POINT('',(3.9475,4.085,-3.5));
+#7227 = SURFACE_CURVE('',#7228,(#7232,#7239),.PCURVE_S1.);
+#7228 = LINE('',#7229,#7230);
+#7229 = CARTESIAN_POINT('',(3.9475,4.085,0.));
+#7230 = VECTOR('',#7231,1.);
+#7231 = DIRECTION('',(0.,0.,-1.));
+#7232 = PCURVE('',#7172,#7233);
+#7233 = DEFINITIONAL_REPRESENTATION('',(#7234),#7238);
+#7234 = LINE('',#7235,#7236);
+#7235 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#7236 = VECTOR('',#7237,1.);
+#7237 = DIRECTION('',(0.,-1.));
+#7238 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7239 = PCURVE('',#7240,#7245);
+#7240 = PLANE('',#7241);
+#7241 = AXIS2_PLACEMENT_3D('',#7242,#7243,#7244);
+#7242 = CARTESIAN_POINT('',(3.6725,4.085,0.));
+#7243 = DIRECTION('',(0.,1.,0.));
+#7244 = DIRECTION('',(0.,0.,-1.));
+#7245 = DEFINITIONAL_REPRESENTATION('',(#7246),#7250);
+#7246 = LINE('',#7247,#7248);
+#7247 = CARTESIAN_POINT('',(0.,-0.275));
+#7248 = VECTOR('',#7249,1.);
+#7249 = DIRECTION('',(1.,0.));
+#7250 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7251 = ORIENTED_EDGE('',*,*,#7252,.T.);
+#7252 = EDGE_CURVE('',#7225,#7253,#7255,.T.);
+#7253 = VERTEX_POINT('',#7254);
+#7254 = CARTESIAN_POINT('',(3.9475,3.535,-3.5));
+#7255 = SURFACE_CURVE('',#7256,(#7260,#7267),.PCURVE_S1.);
+#7256 = LINE('',#7257,#7258);
+#7257 = CARTESIAN_POINT('',(3.9475,4.085,-3.5));
+#7258 = VECTOR('',#7259,1.);
+#7259 = DIRECTION('',(0.,-1.,0.));
+#7260 = PCURVE('',#7172,#7261);
+#7261 = DEFINITIONAL_REPRESENTATION('',(#7262),#7266);
+#7262 = LINE('',#7263,#7264);
+#7263 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#7264 = VECTOR('',#7265,1.);
+#7265 = DIRECTION('',(1.,2.226071387182E-62));
+#7266 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7267 = PCURVE('',#7268,#7273);
+#7268 = PLANE('',#7269);
+#7269 = AXIS2_PLACEMENT_3D('',#7270,#7271,#7272);
+#7270 = CARTESIAN_POINT('',(3.6725,4.085,-3.5));
+#7271 = DIRECTION('',(0.,0.,-1.));
+#7272 = DIRECTION('',(0.,-1.,0.));
+#7273 = DEFINITIONAL_REPRESENTATION('',(#7274),#7278);
+#7274 = LINE('',#7275,#7276);
+#7275 = CARTESIAN_POINT('',(0.,-0.275));
+#7276 = VECTOR('',#7277,1.);
+#7277 = DIRECTION('',(1.,0.));
+#7278 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7279 = ORIENTED_EDGE('',*,*,#7280,.T.);
+#7280 = EDGE_CURVE('',#7253,#7281,#7283,.T.);
+#7281 = VERTEX_POINT('',#7282);
+#7282 = CARTESIAN_POINT('',(3.9475,3.535,0.));
+#7283 = SURFACE_CURVE('',#7284,(#7288,#7295),.PCURVE_S1.);
+#7284 = LINE('',#7285,#7286);
+#7285 = CARTESIAN_POINT('',(3.9475,3.535,-3.5));
+#7286 = VECTOR('',#7287,1.);
+#7287 = DIRECTION('',(0.,0.,1.));
+#7288 = PCURVE('',#7172,#7289);
+#7289 = DEFINITIONAL_REPRESENTATION('',(#7290),#7294);
+#7290 = LINE('',#7291,#7292);
+#7291 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#7292 = VECTOR('',#7293,1.);
+#7293 = DIRECTION('',(0.,1.));
+#7294 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7295 = PCURVE('',#7296,#7301);
+#7296 = PLANE('',#7297);
+#7297 = AXIS2_PLACEMENT_3D('',#7298,#7299,#7300);
+#7298 = CARTESIAN_POINT('',(3.6725,3.535,-3.5));
+#7299 = DIRECTION('',(0.,-1.,0.));
+#7300 = DIRECTION('',(0.,0.,1.));
+#7301 = DEFINITIONAL_REPRESENTATION('',(#7302),#7306);
+#7302 = LINE('',#7303,#7304);
+#7303 = CARTESIAN_POINT('',(0.,-0.275));
+#7304 = VECTOR('',#7305,1.);
+#7305 = DIRECTION('',(1.,0.));
+#7306 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7307 = ORIENTED_EDGE('',*,*,#7308,.T.);
+#7308 = EDGE_CURVE('',#7281,#7309,#7311,.T.);
+#7309 = VERTEX_POINT('',#7310);
+#7310 = CARTESIAN_POINT('',(3.9475,3.26,0.275));
+#7311 = SURFACE_CURVE('',#7312,(#7316,#7323),.PCURVE_S1.);
+#7312 = LINE('',#7313,#7314);
+#7313 = CARTESIAN_POINT('',(3.9475,3.535,0.));
+#7314 = VECTOR('',#7315,1.);
+#7315 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#7316 = PCURVE('',#7172,#7317);
+#7317 = DEFINITIONAL_REPRESENTATION('',(#7318),#7322);
+#7318 = LINE('',#7319,#7320);
+#7319 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#7320 = VECTOR('',#7321,1.);
+#7321 = DIRECTION('',(0.707106781187,0.707106781187));
+#7322 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7323 = PCURVE('',#7324,#7329);
+#7324 = PLANE('',#7325);
+#7325 = AXIS2_PLACEMENT_3D('',#7326,#7327,#7328);
+#7326 = CARTESIAN_POINT('',(3.6725,3.535,0.));
+#7327 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#7328 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#7329 = DEFINITIONAL_REPRESENTATION('',(#7330),#7334);
+#7330 = LINE('',#7331,#7332);
+#7331 = CARTESIAN_POINT('',(0.,-0.275));
+#7332 = VECTOR('',#7333,1.);
+#7333 = DIRECTION('',(1.,0.));
+#7334 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7335 = ORIENTED_EDGE('',*,*,#7336,.T.);
+#7336 = EDGE_CURVE('',#7309,#7337,#7339,.T.);
+#7337 = VERTEX_POINT('',#7338);
+#7338 = CARTESIAN_POINT('',(3.9475,3.26,2.4225));
+#7339 = SURFACE_CURVE('',#7340,(#7344,#7351),.PCURVE_S1.);
+#7340 = LINE('',#7341,#7342);
+#7341 = CARTESIAN_POINT('',(3.9475,3.26,0.275));
+#7342 = VECTOR('',#7343,1.);
+#7343 = DIRECTION('',(0.,0.,1.));
+#7344 = PCURVE('',#7172,#7345);
+#7345 = DEFINITIONAL_REPRESENTATION('',(#7346),#7350);
+#7346 = LINE('',#7347,#7348);
+#7347 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#7348 = VECTOR('',#7349,1.);
+#7349 = DIRECTION('',(0.,1.));
+#7350 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7351 = PCURVE('',#7352,#7357);
+#7352 = PLANE('',#7353);
+#7353 = AXIS2_PLACEMENT_3D('',#7354,#7355,#7356);
+#7354 = CARTESIAN_POINT('',(3.724778209321,3.26,1.581028209321));
+#7355 = DIRECTION('',(1.308440111004E-29,-1.,1.156108129756E-30));
+#7356 = DIRECTION('',(-1.,-1.308440111004E-29,0.));
+#7357 = DEFINITIONAL_REPRESENTATION('',(#7358),#7362);
+#7358 = LINE('',#7359,#7360);
+#7359 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#7360 = VECTOR('',#7361,1.);
+#7361 = DIRECTION('',(0.,-1.));
+#7362 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7363 = ORIENTED_EDGE('',*,*,#7364,.T.);
+#7364 = EDGE_CURVE('',#7337,#7162,#7365,.T.);
+#7365 = SURFACE_CURVE('',#7366,(#7370,#7377),.PCURVE_S1.);
+#7366 = LINE('',#7367,#7368);
+#7367 = CARTESIAN_POINT('',(3.9475,3.26,2.4225));
+#7368 = VECTOR('',#7369,1.);
+#7369 = DIRECTION('',(0.,1.,0.));
+#7370 = PCURVE('',#7172,#7371);
+#7371 = DEFINITIONAL_REPRESENTATION('',(#7372),#7376);
+#7372 = LINE('',#7373,#7374);
+#7373 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#7374 = VECTOR('',#7375,1.);
+#7375 = DIRECTION('',(-1.,-2.226071387182E-62));
+#7376 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7377 = PCURVE('',#7378,#7383);
+#7378 = CYLINDRICAL_SURFACE('',#7379,0.1375);
+#7379 = AXIS2_PLACEMENT_3D('',#7380,#7381,#7382);
+#7380 = CARTESIAN_POINT('',(3.81,3.26,2.4225));
+#7381 = DIRECTION('',(0.,1.,0.));
+#7382 = DIRECTION('',(1.,0.,-9.8088568672E-33));
+#7383 = DEFINITIONAL_REPRESENTATION('',(#7384),#7388);
+#7384 = LINE('',#7385,#7386);
+#7385 = CARTESIAN_POINT('',(-0.,0.));
+#7386 = VECTOR('',#7387,1.);
+#7387 = DIRECTION('',(-0.,1.));
+#7388 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7389 = ADVANCED_FACE('',(#7390),#7184,.T.);
+#7390 = FACE_BOUND('',#7391,.T.);
+#7391 = EDGE_LOOP('',(#7392,#7422,#7448,#7449,#7472,#7500,#7528));
+#7392 = ORIENTED_EDGE('',*,*,#7393,.T.);
+#7393 = EDGE_CURVE('',#7394,#7396,#7398,.T.);
+#7394 = VERTEX_POINT('',#7395);
+#7395 = CARTESIAN_POINT('',(3.175,4.36,2.56));
+#7396 = VERTEX_POINT('',#7397);
+#7397 = CARTESIAN_POINT('',(3.81,4.36,2.56));
+#7398 = SURFACE_CURVE('',#7399,(#7403,#7410),.PCURVE_S1.);
+#7399 = LINE('',#7400,#7401);
+#7400 = CARTESIAN_POINT('',(3.6725,4.36,2.56));
+#7401 = VECTOR('',#7402,1.);
+#7402 = DIRECTION('',(1.,0.,0.));
+#7403 = PCURVE('',#7184,#7404);
+#7404 = DEFINITIONAL_REPRESENTATION('',(#7405),#7409);
+#7405 = LINE('',#7406,#7407);
+#7406 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#7407 = VECTOR('',#7408,1.);
+#7408 = DIRECTION('',(1.,6.704108115824E-59));
+#7409 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7410 = PCURVE('',#7411,#7416);
+#7411 = PLANE('',#7412);
+#7412 = AXIS2_PLACEMENT_3D('',#7413,#7414,#7415);
+#7413 = CARTESIAN_POINT('',(3.56125,3.81,2.56));
+#7414 = DIRECTION('',(-1.657312278749E-30,-1.304555144269E-30,1.));
+#7415 = DIRECTION('',(1.,0.,1.657312278749E-30));
+#7416 = DEFINITIONAL_REPRESENTATION('',(#7417),#7421);
+#7417 = LINE('',#7418,#7419);
+#7418 = CARTESIAN_POINT('',(0.11125,0.55));
+#7419 = VECTOR('',#7420,1.);
+#7420 = DIRECTION('',(1.,-2.162055258902E-60));
+#7421 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7422 = ORIENTED_EDGE('',*,*,#7423,.F.);
+#7423 = EDGE_CURVE('',#7162,#7396,#7424,.T.);
+#7424 = SURFACE_CURVE('',#7425,(#7430,#7441),.PCURVE_S1.);
+#7425 = CIRCLE('',#7426,0.1375);
+#7426 = AXIS2_PLACEMENT_3D('',#7427,#7428,#7429);
+#7427 = CARTESIAN_POINT('',(3.81,4.36,2.4225));
+#7428 = DIRECTION('',(0.,-1.,0.));
+#7429 = DIRECTION('',(0.,0.,1.));
+#7430 = PCURVE('',#7184,#7431);
+#7431 = DEFINITIONAL_REPRESENTATION('',(#7432),#7440);
+#7432 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#7433,#7434,#7435,#7436,
+#7437,#7438,#7439),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2
+ ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786,
+6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE()
+GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,
+1.,0.5,1.)) REPRESENTATION_ITEM('') );
+#7433 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#7434 = CARTESIAN_POINT('',(-0.152935195362,-0.978971790679));
+#7435 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.772721790679));
+#7436 = CARTESIAN_POINT('',(8.522179067866E-02,-0.566471790679));
+#7437 = CARTESIAN_POINT('',(0.204300283699,-0.772721790679));
+#7438 = CARTESIAN_POINT('',(0.323378776719,-0.978971790679));
+#7439 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#7440 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7441 = PCURVE('',#7378,#7442);
+#7442 = DEFINITIONAL_REPRESENTATION('',(#7443),#7447);
+#7443 = LINE('',#7444,#7445);
+#7444 = CARTESIAN_POINT('',(4.712388980385,1.1));
+#7445 = VECTOR('',#7446,1.);
+#7446 = DIRECTION('',(-1.,0.));
+#7447 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7448 = ORIENTED_EDGE('',*,*,#7161,.T.);
+#7449 = ORIENTED_EDGE('',*,*,#7450,.F.);
+#7450 = EDGE_CURVE('',#7451,#7164,#7453,.T.);
+#7451 = VERTEX_POINT('',#7452);
+#7452 = CARTESIAN_POINT('',(3.6725,4.36,0.275));
+#7453 = SURFACE_CURVE('',#7454,(#7458,#7465),.PCURVE_S1.);
+#7454 = LINE('',#7455,#7456);
+#7455 = CARTESIAN_POINT('',(3.6725,4.36,0.275));
+#7456 = VECTOR('',#7457,1.);
+#7457 = DIRECTION('',(1.,0.,0.));
+#7458 = PCURVE('',#7184,#7459);
+#7459 = DEFINITIONAL_REPRESENTATION('',(#7460),#7464);
+#7460 = LINE('',#7461,#7462);
+#7461 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#7462 = VECTOR('',#7463,1.);
+#7463 = DIRECTION('',(1.,6.704108115824E-59));
+#7464 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7465 = PCURVE('',#7212,#7466);
+#7466 = DEFINITIONAL_REPRESENTATION('',(#7467),#7471);
+#7467 = LINE('',#7468,#7469);
+#7468 = CARTESIAN_POINT('',(4.710277376051E-16,0.));
+#7469 = VECTOR('',#7470,1.);
+#7470 = DIRECTION('',(0.,-1.));
+#7471 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7472 = ORIENTED_EDGE('',*,*,#7473,.F.);
+#7473 = EDGE_CURVE('',#7474,#7451,#7476,.T.);
+#7474 = VERTEX_POINT('',#7475);
+#7475 = CARTESIAN_POINT('',(3.6725,4.36,2.285));
+#7476 = SURFACE_CURVE('',#7477,(#7481,#7488),.PCURVE_S1.);
+#7477 = LINE('',#7478,#7479);
+#7478 = CARTESIAN_POINT('',(3.6725,4.36,2.56));
+#7479 = VECTOR('',#7480,1.);
+#7480 = DIRECTION('',(0.,0.,-1.));
+#7481 = PCURVE('',#7184,#7482);
+#7482 = DEFINITIONAL_REPRESENTATION('',(#7483),#7487);
+#7483 = LINE('',#7484,#7485);
+#7484 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#7485 = VECTOR('',#7486,1.);
+#7486 = DIRECTION('',(0.,1.));
+#7487 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7488 = PCURVE('',#7489,#7494);
+#7489 = PLANE('',#7490);
+#7490 = AXIS2_PLACEMENT_3D('',#7491,#7492,#7493);
+#7491 = CARTESIAN_POINT('',(3.6725,3.81,-0.34105853382));
+#7492 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#7493 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#7494 = DEFINITIONAL_REPRESENTATION('',(#7495),#7499);
+#7495 = LINE('',#7496,#7497);
+#7496 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#7497 = VECTOR('',#7498,1.);
+#7498 = DIRECTION('',(0.,-1.));
+#7499 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7500 = ORIENTED_EDGE('',*,*,#7501,.F.);
+#7501 = EDGE_CURVE('',#7502,#7474,#7504,.T.);
+#7502 = VERTEX_POINT('',#7503);
+#7503 = CARTESIAN_POINT('',(3.175,4.36,2.285));
+#7504 = SURFACE_CURVE('',#7505,(#7509,#7516),.PCURVE_S1.);
+#7505 = LINE('',#7506,#7507);
+#7506 = CARTESIAN_POINT('',(3.175,4.36,2.285));
+#7507 = VECTOR('',#7508,1.);
+#7508 = DIRECTION('',(1.,0.,0.));
+#7509 = PCURVE('',#7184,#7510);
+#7510 = DEFINITIONAL_REPRESENTATION('',(#7511),#7515);
+#7511 = LINE('',#7512,#7513);
+#7512 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#7513 = VECTOR('',#7514,1.);
+#7514 = DIRECTION('',(1.,6.704108115824E-59));
+#7515 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7516 = PCURVE('',#7517,#7522);
+#7517 = PLANE('',#7518);
+#7518 = AXIS2_PLACEMENT_3D('',#7519,#7520,#7521);
+#7519 = CARTESIAN_POINT('',(3.175,3.26,2.285));
+#7520 = DIRECTION('',(0.,0.,1.));
+#7521 = DIRECTION('',(1.,0.,0.));
+#7522 = DEFINITIONAL_REPRESENTATION('',(#7523),#7527);
+#7523 = LINE('',#7524,#7525);
+#7524 = CARTESIAN_POINT('',(0.,1.1));
+#7525 = VECTOR('',#7526,1.);
+#7526 = DIRECTION('',(1.,0.));
+#7527 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7528 = ORIENTED_EDGE('',*,*,#7529,.T.);
+#7529 = EDGE_CURVE('',#7502,#7394,#7530,.T.);
+#7530 = SURFACE_CURVE('',#7531,(#7535,#7542),.PCURVE_S1.);
+#7531 = LINE('',#7532,#7533);
+#7532 = CARTESIAN_POINT('',(3.175,4.36,2.285));
+#7533 = VECTOR('',#7534,1.);
+#7534 = DIRECTION('',(0.,0.,1.));
+#7535 = PCURVE('',#7184,#7536);
+#7536 = DEFINITIONAL_REPRESENTATION('',(#7537),#7541);
+#7537 = LINE('',#7538,#7539);
+#7538 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#7539 = VECTOR('',#7540,1.);
+#7540 = DIRECTION('',(0.,-1.));
+#7541 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7542 = PCURVE('',#7543,#7548);
+#7543 = PLANE('',#7544);
+#7544 = AXIS2_PLACEMENT_3D('',#7545,#7546,#7547);
+#7545 = CARTESIAN_POINT('',(3.175,3.26,2.285));
+#7546 = DIRECTION('',(1.,0.,0.));
+#7547 = DIRECTION('',(0.,0.,1.));
+#7548 = DEFINITIONAL_REPRESENTATION('',(#7549),#7553);
+#7549 = LINE('',#7550,#7551);
+#7550 = CARTESIAN_POINT('',(0.,-1.1));
+#7551 = VECTOR('',#7552,1.);
+#7552 = DIRECTION('',(1.,0.));
+#7553 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7554 = ADVANCED_FACE('',(#7555),#7378,.T.);
+#7555 = FACE_BOUND('',#7556,.F.);
+#7556 = EDGE_LOOP('',(#7557,#7581,#7602,#7603));
+#7557 = ORIENTED_EDGE('',*,*,#7558,.T.);
+#7558 = EDGE_CURVE('',#7337,#7559,#7561,.T.);
+#7559 = VERTEX_POINT('',#7560);
+#7560 = CARTESIAN_POINT('',(3.81,3.26,2.56));
+#7561 = SURFACE_CURVE('',#7562,(#7567,#7574),.PCURVE_S1.);
+#7562 = CIRCLE('',#7563,0.1375);
+#7563 = AXIS2_PLACEMENT_3D('',#7564,#7565,#7566);
+#7564 = CARTESIAN_POINT('',(3.81,3.26,2.4225));
+#7565 = DIRECTION('',(0.,-1.,0.));
+#7566 = DIRECTION('',(0.,0.,1.));
+#7567 = PCURVE('',#7378,#7568);
+#7568 = DEFINITIONAL_REPRESENTATION('',(#7569),#7573);
+#7569 = LINE('',#7570,#7571);
+#7570 = CARTESIAN_POINT('',(4.712388980385,-1.7763568394E-15));
+#7571 = VECTOR('',#7572,1.);
+#7572 = DIRECTION('',(-1.,0.));
+#7573 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7574 = PCURVE('',#7352,#7575);
+#7575 = DEFINITIONAL_REPRESENTATION('',(#7576),#7580);
+#7576 = CIRCLE('',#7577,0.1375);
+#7577 = AXIS2_PLACEMENT_2D('',#7578,#7579);
+#7578 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#7579 = DIRECTION('',(0.,-1.));
+#7580 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7581 = ORIENTED_EDGE('',*,*,#7582,.T.);
+#7582 = EDGE_CURVE('',#7559,#7396,#7583,.T.);
+#7583 = SURFACE_CURVE('',#7584,(#7588,#7595),.PCURVE_S1.);
+#7584 = LINE('',#7585,#7586);
+#7585 = CARTESIAN_POINT('',(3.81,3.26,2.56));
+#7586 = VECTOR('',#7587,1.);
+#7587 = DIRECTION('',(0.,1.,0.));
+#7588 = PCURVE('',#7378,#7589);
+#7589 = DEFINITIONAL_REPRESENTATION('',(#7590),#7594);
+#7590 = LINE('',#7591,#7592);
+#7591 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#7592 = VECTOR('',#7593,1.);
+#7593 = DIRECTION('',(-0.,1.));
+#7594 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7595 = PCURVE('',#7411,#7596);
+#7596 = DEFINITIONAL_REPRESENTATION('',(#7597),#7601);
+#7597 = LINE('',#7598,#7599);
+#7598 = CARTESIAN_POINT('',(0.24875,-0.55));
+#7599 = VECTOR('',#7600,1.);
+#7600 = DIRECTION('',(0.,1.));
+#7601 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7602 = ORIENTED_EDGE('',*,*,#7423,.F.);
+#7603 = ORIENTED_EDGE('',*,*,#7364,.F.);
+#7604 = ADVANCED_FACE('',(#7605),#7212,.T.);
+#7605 = FACE_BOUND('',#7606,.T.);
+#7606 = EDGE_LOOP('',(#7607,#7608,#7609,#7632));
+#7607 = ORIENTED_EDGE('',*,*,#7450,.T.);
+#7608 = ORIENTED_EDGE('',*,*,#7196,.T.);
+#7609 = ORIENTED_EDGE('',*,*,#7610,.F.);
+#7610 = EDGE_CURVE('',#7611,#7197,#7613,.T.);
+#7611 = VERTEX_POINT('',#7612);
+#7612 = CARTESIAN_POINT('',(3.6725,4.085,0.));
+#7613 = SURFACE_CURVE('',#7614,(#7618,#7625),.PCURVE_S1.);
+#7614 = LINE('',#7615,#7616);
+#7615 = CARTESIAN_POINT('',(3.6725,4.085,0.));
+#7616 = VECTOR('',#7617,1.);
+#7617 = DIRECTION('',(1.,0.,0.));
+#7618 = PCURVE('',#7212,#7619);
+#7619 = DEFINITIONAL_REPRESENTATION('',(#7620),#7624);
+#7620 = LINE('',#7621,#7622);
+#7621 = CARTESIAN_POINT('',(0.388908729653,0.));
+#7622 = VECTOR('',#7623,1.);
+#7623 = DIRECTION('',(0.,-1.));
+#7624 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7625 = PCURVE('',#7240,#7626);
+#7626 = DEFINITIONAL_REPRESENTATION('',(#7627),#7631);
+#7627 = LINE('',#7628,#7629);
+#7628 = CARTESIAN_POINT('',(0.,0.));
+#7629 = VECTOR('',#7630,1.);
+#7630 = DIRECTION('',(0.,-1.));
+#7631 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7632 = ORIENTED_EDGE('',*,*,#7633,.F.);
+#7633 = EDGE_CURVE('',#7451,#7611,#7634,.T.);
+#7634 = SURFACE_CURVE('',#7635,(#7639,#7646),.PCURVE_S1.);
+#7635 = LINE('',#7636,#7637);
+#7636 = CARTESIAN_POINT('',(3.6725,4.36,0.275));
+#7637 = VECTOR('',#7638,1.);
+#7638 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#7639 = PCURVE('',#7212,#7640);
+#7640 = DEFINITIONAL_REPRESENTATION('',(#7641),#7645);
+#7641 = LINE('',#7642,#7643);
+#7642 = CARTESIAN_POINT('',(0.,0.));
+#7643 = VECTOR('',#7644,1.);
+#7644 = DIRECTION('',(1.,0.));
+#7645 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7646 = PCURVE('',#7489,#7647);
+#7647 = DEFINITIONAL_REPRESENTATION('',(#7648),#7652);
+#7648 = LINE('',#7649,#7650);
+#7649 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#7650 = VECTOR('',#7651,1.);
+#7651 = DIRECTION('',(0.707106781187,-0.707106781187));
+#7652 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7653 = ADVANCED_FACE('',(#7654),#7352,.T.);
+#7654 = FACE_BOUND('',#7655,.T.);
+#7655 = EDGE_LOOP('',(#7656,#7657,#7658,#7681,#7704,#7727,#7750));
+#7656 = ORIENTED_EDGE('',*,*,#7336,.T.);
+#7657 = ORIENTED_EDGE('',*,*,#7558,.T.);
+#7658 = ORIENTED_EDGE('',*,*,#7659,.F.);
+#7659 = EDGE_CURVE('',#7660,#7559,#7662,.T.);
+#7660 = VERTEX_POINT('',#7661);
+#7661 = CARTESIAN_POINT('',(3.175,3.26,2.56));
+#7662 = SURFACE_CURVE('',#7663,(#7667,#7674),.PCURVE_S1.);
+#7663 = LINE('',#7664,#7665);
+#7664 = CARTESIAN_POINT('',(3.6725,3.26,2.56));
+#7665 = VECTOR('',#7666,1.);
+#7666 = DIRECTION('',(1.,0.,0.));
+#7667 = PCURVE('',#7352,#7668);
+#7668 = DEFINITIONAL_REPRESENTATION('',(#7669),#7673);
+#7669 = LINE('',#7670,#7671);
+#7670 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#7671 = VECTOR('',#7672,1.);
+#7672 = DIRECTION('',(-1.,1.51269824963E-59));
+#7673 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7674 = PCURVE('',#7411,#7675);
+#7675 = DEFINITIONAL_REPRESENTATION('',(#7676),#7680);
+#7676 = LINE('',#7677,#7678);
+#7677 = CARTESIAN_POINT('',(0.11125,-0.55));
+#7678 = VECTOR('',#7679,1.);
+#7679 = DIRECTION('',(1.,-2.162055258902E-60));
+#7680 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7681 = ORIENTED_EDGE('',*,*,#7682,.F.);
+#7682 = EDGE_CURVE('',#7683,#7660,#7685,.T.);
+#7683 = VERTEX_POINT('',#7684);
+#7684 = CARTESIAN_POINT('',(3.175,3.26,2.285));
+#7685 = SURFACE_CURVE('',#7686,(#7690,#7697),.PCURVE_S1.);
+#7686 = LINE('',#7687,#7688);
+#7687 = CARTESIAN_POINT('',(3.175,3.26,2.285));
+#7688 = VECTOR('',#7689,1.);
+#7689 = DIRECTION('',(0.,0.,1.));
+#7690 = PCURVE('',#7352,#7691);
+#7691 = DEFINITIONAL_REPRESENTATION('',(#7692),#7696);
+#7692 = LINE('',#7693,#7694);
+#7693 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#7694 = VECTOR('',#7695,1.);
+#7695 = DIRECTION('',(0.,-1.));
+#7696 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7697 = PCURVE('',#7543,#7698);
+#7698 = DEFINITIONAL_REPRESENTATION('',(#7699),#7703);
+#7699 = LINE('',#7700,#7701);
+#7700 = CARTESIAN_POINT('',(0.,0.));
+#7701 = VECTOR('',#7702,1.);
+#7702 = DIRECTION('',(1.,0.));
+#7703 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7704 = ORIENTED_EDGE('',*,*,#7705,.T.);
+#7705 = EDGE_CURVE('',#7683,#7706,#7708,.T.);
+#7706 = VERTEX_POINT('',#7707);
+#7707 = CARTESIAN_POINT('',(3.6725,3.26,2.285));
+#7708 = SURFACE_CURVE('',#7709,(#7713,#7720),.PCURVE_S1.);
+#7709 = LINE('',#7710,#7711);
+#7710 = CARTESIAN_POINT('',(3.175,3.26,2.285));
+#7711 = VECTOR('',#7712,1.);
+#7712 = DIRECTION('',(1.,0.,0.));
+#7713 = PCURVE('',#7352,#7714);
+#7714 = DEFINITIONAL_REPRESENTATION('',(#7715),#7719);
+#7715 = LINE('',#7716,#7717);
+#7716 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#7717 = VECTOR('',#7718,1.);
+#7718 = DIRECTION('',(-1.,1.51269824963E-59));
+#7719 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7720 = PCURVE('',#7517,#7721);
+#7721 = DEFINITIONAL_REPRESENTATION('',(#7722),#7726);
+#7722 = LINE('',#7723,#7724);
+#7723 = CARTESIAN_POINT('',(0.,0.));
+#7724 = VECTOR('',#7725,1.);
+#7725 = DIRECTION('',(1.,0.));
+#7726 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7727 = ORIENTED_EDGE('',*,*,#7728,.F.);
+#7728 = EDGE_CURVE('',#7729,#7706,#7731,.T.);
+#7729 = VERTEX_POINT('',#7730);
+#7730 = CARTESIAN_POINT('',(3.6725,3.26,0.275));
+#7731 = SURFACE_CURVE('',#7732,(#7736,#7743),.PCURVE_S1.);
+#7732 = LINE('',#7733,#7734);
+#7733 = CARTESIAN_POINT('',(3.6725,3.26,0.275));
+#7734 = VECTOR('',#7735,1.);
+#7735 = DIRECTION('',(0.,0.,1.));
+#7736 = PCURVE('',#7352,#7737);
+#7737 = DEFINITIONAL_REPRESENTATION('',(#7738),#7742);
+#7738 = LINE('',#7739,#7740);
+#7739 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#7740 = VECTOR('',#7741,1.);
+#7741 = DIRECTION('',(0.,-1.));
+#7742 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7743 = PCURVE('',#7489,#7744);
+#7744 = DEFINITIONAL_REPRESENTATION('',(#7745),#7749);
+#7745 = LINE('',#7746,#7747);
+#7746 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#7747 = VECTOR('',#7748,1.);
+#7748 = DIRECTION('',(0.,1.));
+#7749 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7750 = ORIENTED_EDGE('',*,*,#7751,.T.);
+#7751 = EDGE_CURVE('',#7729,#7309,#7752,.T.);
+#7752 = SURFACE_CURVE('',#7753,(#7757,#7764),.PCURVE_S1.);
+#7753 = LINE('',#7754,#7755);
+#7754 = CARTESIAN_POINT('',(3.6725,3.26,0.275));
+#7755 = VECTOR('',#7756,1.);
+#7756 = DIRECTION('',(1.,0.,0.));
+#7757 = PCURVE('',#7352,#7758);
+#7758 = DEFINITIONAL_REPRESENTATION('',(#7759),#7763);
+#7759 = LINE('',#7760,#7761);
+#7760 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#7761 = VECTOR('',#7762,1.);
+#7762 = DIRECTION('',(-1.,1.51269824963E-59));
+#7763 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7764 = PCURVE('',#7324,#7765);
+#7765 = DEFINITIONAL_REPRESENTATION('',(#7766),#7770);
+#7766 = LINE('',#7767,#7768);
+#7767 = CARTESIAN_POINT('',(0.388908729653,0.));
+#7768 = VECTOR('',#7769,1.);
+#7769 = DIRECTION('',(0.,-1.));
+#7770 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7771 = ADVANCED_FACE('',(#7772),#7240,.T.);
+#7772 = FACE_BOUND('',#7773,.T.);
+#7773 = EDGE_LOOP('',(#7774,#7775,#7776,#7799));
+#7774 = ORIENTED_EDGE('',*,*,#7610,.T.);
+#7775 = ORIENTED_EDGE('',*,*,#7224,.T.);
+#7776 = ORIENTED_EDGE('',*,*,#7777,.F.);
+#7777 = EDGE_CURVE('',#7778,#7225,#7780,.T.);
+#7778 = VERTEX_POINT('',#7779);
+#7779 = CARTESIAN_POINT('',(3.6725,4.085,-3.5));
+#7780 = SURFACE_CURVE('',#7781,(#7785,#7792),.PCURVE_S1.);
+#7781 = LINE('',#7782,#7783);
+#7782 = CARTESIAN_POINT('',(3.6725,4.085,-3.5));
+#7783 = VECTOR('',#7784,1.);
+#7784 = DIRECTION('',(1.,0.,0.));
+#7785 = PCURVE('',#7240,#7786);
+#7786 = DEFINITIONAL_REPRESENTATION('',(#7787),#7791);
+#7787 = LINE('',#7788,#7789);
+#7788 = CARTESIAN_POINT('',(3.5,0.));
+#7789 = VECTOR('',#7790,1.);
+#7790 = DIRECTION('',(0.,-1.));
+#7791 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7792 = PCURVE('',#7268,#7793);
+#7793 = DEFINITIONAL_REPRESENTATION('',(#7794),#7798);
+#7794 = LINE('',#7795,#7796);
+#7795 = CARTESIAN_POINT('',(7.771561172376E-16,0.));
+#7796 = VECTOR('',#7797,1.);
+#7797 = DIRECTION('',(0.,-1.));
+#7798 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7799 = ORIENTED_EDGE('',*,*,#7800,.F.);
+#7800 = EDGE_CURVE('',#7611,#7778,#7801,.T.);
+#7801 = SURFACE_CURVE('',#7802,(#7806,#7813),.PCURVE_S1.);
+#7802 = LINE('',#7803,#7804);
+#7803 = CARTESIAN_POINT('',(3.6725,4.085,0.));
+#7804 = VECTOR('',#7805,1.);
+#7805 = DIRECTION('',(0.,0.,-1.));
+#7806 = PCURVE('',#7240,#7807);
+#7807 = DEFINITIONAL_REPRESENTATION('',(#7808),#7812);
+#7808 = LINE('',#7809,#7810);
+#7809 = CARTESIAN_POINT('',(0.,0.));
+#7810 = VECTOR('',#7811,1.);
+#7811 = DIRECTION('',(1.,0.));
+#7812 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7813 = PCURVE('',#7489,#7814);
+#7814 = DEFINITIONAL_REPRESENTATION('',(#7815),#7819);
+#7815 = LINE('',#7816,#7817);
+#7816 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#7817 = VECTOR('',#7818,1.);
+#7818 = DIRECTION('',(0.,-1.));
+#7819 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7820 = ADVANCED_FACE('',(#7821),#7324,.T.);
+#7821 = FACE_BOUND('',#7822,.T.);
+#7822 = EDGE_LOOP('',(#7823,#7846,#7847,#7848));
+#7823 = ORIENTED_EDGE('',*,*,#7824,.T.);
+#7824 = EDGE_CURVE('',#7825,#7281,#7827,.T.);
+#7825 = VERTEX_POINT('',#7826);
+#7826 = CARTESIAN_POINT('',(3.6725,3.535,0.));
+#7827 = SURFACE_CURVE('',#7828,(#7832,#7839),.PCURVE_S1.);
+#7828 = LINE('',#7829,#7830);
+#7829 = CARTESIAN_POINT('',(3.6725,3.535,0.));
+#7830 = VECTOR('',#7831,1.);
+#7831 = DIRECTION('',(1.,0.,0.));
+#7832 = PCURVE('',#7324,#7833);
+#7833 = DEFINITIONAL_REPRESENTATION('',(#7834),#7838);
+#7834 = LINE('',#7835,#7836);
+#7835 = CARTESIAN_POINT('',(-1.177569344013E-16,0.));
+#7836 = VECTOR('',#7837,1.);
+#7837 = DIRECTION('',(0.,-1.));
+#7838 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7839 = PCURVE('',#7296,#7840);
+#7840 = DEFINITIONAL_REPRESENTATION('',(#7841),#7845);
+#7841 = LINE('',#7842,#7843);
+#7842 = CARTESIAN_POINT('',(3.5,0.));
+#7843 = VECTOR('',#7844,1.);
+#7844 = DIRECTION('',(0.,-1.));
+#7845 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7846 = ORIENTED_EDGE('',*,*,#7308,.T.);
+#7847 = ORIENTED_EDGE('',*,*,#7751,.F.);
+#7848 = ORIENTED_EDGE('',*,*,#7849,.F.);
+#7849 = EDGE_CURVE('',#7825,#7729,#7850,.T.);
+#7850 = SURFACE_CURVE('',#7851,(#7855,#7862),.PCURVE_S1.);
+#7851 = LINE('',#7852,#7853);
+#7852 = CARTESIAN_POINT('',(3.6725,3.535,0.));
+#7853 = VECTOR('',#7854,1.);
+#7854 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#7855 = PCURVE('',#7324,#7856);
+#7856 = DEFINITIONAL_REPRESENTATION('',(#7857),#7861);
+#7857 = LINE('',#7858,#7859);
+#7858 = CARTESIAN_POINT('',(0.,0.));
+#7859 = VECTOR('',#7860,1.);
+#7860 = DIRECTION('',(1.,0.));
+#7861 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7862 = PCURVE('',#7489,#7863);
+#7863 = DEFINITIONAL_REPRESENTATION('',(#7864),#7868);
+#7864 = LINE('',#7865,#7866);
+#7865 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#7866 = VECTOR('',#7867,1.);
+#7867 = DIRECTION('',(0.707106781187,0.707106781187));
+#7868 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7869 = ADVANCED_FACE('',(#7870),#7268,.T.);
+#7870 = FACE_BOUND('',#7871,.T.);
+#7871 = EDGE_LOOP('',(#7872,#7873,#7874,#7897));
+#7872 = ORIENTED_EDGE('',*,*,#7777,.T.);
+#7873 = ORIENTED_EDGE('',*,*,#7252,.T.);
+#7874 = ORIENTED_EDGE('',*,*,#7875,.F.);
+#7875 = EDGE_CURVE('',#7876,#7253,#7878,.T.);
+#7876 = VERTEX_POINT('',#7877);
+#7877 = CARTESIAN_POINT('',(3.6725,3.535,-3.5));
+#7878 = SURFACE_CURVE('',#7879,(#7883,#7890),.PCURVE_S1.);
+#7879 = LINE('',#7880,#7881);
+#7880 = CARTESIAN_POINT('',(3.6725,3.535,-3.5));
+#7881 = VECTOR('',#7882,1.);
+#7882 = DIRECTION('',(1.,0.,0.));
+#7883 = PCURVE('',#7268,#7884);
+#7884 = DEFINITIONAL_REPRESENTATION('',(#7885),#7889);
+#7885 = LINE('',#7886,#7887);
+#7886 = CARTESIAN_POINT('',(0.55,0.));
+#7887 = VECTOR('',#7888,1.);
+#7888 = DIRECTION('',(0.,-1.));
+#7889 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7890 = PCURVE('',#7296,#7891);
+#7891 = DEFINITIONAL_REPRESENTATION('',(#7892),#7896);
+#7892 = LINE('',#7893,#7894);
+#7893 = CARTESIAN_POINT('',(0.,0.));
+#7894 = VECTOR('',#7895,1.);
+#7895 = DIRECTION('',(0.,-1.));
+#7896 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7897 = ORIENTED_EDGE('',*,*,#7898,.F.);
+#7898 = EDGE_CURVE('',#7778,#7876,#7899,.T.);
+#7899 = SURFACE_CURVE('',#7900,(#7904,#7911),.PCURVE_S1.);
+#7900 = LINE('',#7901,#7902);
+#7901 = CARTESIAN_POINT('',(3.6725,4.085,-3.5));
+#7902 = VECTOR('',#7903,1.);
+#7903 = DIRECTION('',(0.,-1.,0.));
+#7904 = PCURVE('',#7268,#7905);
+#7905 = DEFINITIONAL_REPRESENTATION('',(#7906),#7910);
+#7906 = LINE('',#7907,#7908);
+#7907 = CARTESIAN_POINT('',(0.,-0.));
+#7908 = VECTOR('',#7909,1.);
+#7909 = DIRECTION('',(1.,0.));
+#7910 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7911 = PCURVE('',#7489,#7912);
+#7912 = DEFINITIONAL_REPRESENTATION('',(#7913),#7917);
+#7913 = LINE('',#7914,#7915);
+#7914 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#7915 = VECTOR('',#7916,1.);
+#7916 = DIRECTION('',(1.,2.226071387182E-62));
+#7917 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7918 = ADVANCED_FACE('',(#7919),#7296,.T.);
+#7919 = FACE_BOUND('',#7920,.T.);
+#7920 = EDGE_LOOP('',(#7921,#7922,#7923,#7924));
+#7921 = ORIENTED_EDGE('',*,*,#7875,.T.);
+#7922 = ORIENTED_EDGE('',*,*,#7280,.T.);
+#7923 = ORIENTED_EDGE('',*,*,#7824,.F.);
+#7924 = ORIENTED_EDGE('',*,*,#7925,.F.);
+#7925 = EDGE_CURVE('',#7876,#7825,#7926,.T.);
+#7926 = SURFACE_CURVE('',#7927,(#7931,#7938),.PCURVE_S1.);
+#7927 = LINE('',#7928,#7929);
+#7928 = CARTESIAN_POINT('',(3.6725,3.535,-3.5));
+#7929 = VECTOR('',#7930,1.);
+#7930 = DIRECTION('',(0.,0.,1.));
+#7931 = PCURVE('',#7296,#7932);
+#7932 = DEFINITIONAL_REPRESENTATION('',(#7933),#7937);
+#7933 = LINE('',#7934,#7935);
+#7934 = CARTESIAN_POINT('',(0.,0.));
+#7935 = VECTOR('',#7936,1.);
+#7936 = DIRECTION('',(1.,0.));
+#7937 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7938 = PCURVE('',#7489,#7939);
+#7939 = DEFINITIONAL_REPRESENTATION('',(#7940),#7944);
+#7940 = LINE('',#7941,#7942);
+#7941 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#7942 = VECTOR('',#7943,1.);
+#7943 = DIRECTION('',(0.,1.));
+#7944 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7945 = ADVANCED_FACE('',(#7946),#7411,.T.);
+#7946 = FACE_BOUND('',#7947,.T.);
+#7947 = EDGE_LOOP('',(#7948,#7949,#7950,#7951));
+#7948 = ORIENTED_EDGE('',*,*,#7659,.T.);
+#7949 = ORIENTED_EDGE('',*,*,#7582,.T.);
+#7950 = ORIENTED_EDGE('',*,*,#7393,.F.);
+#7951 = ORIENTED_EDGE('',*,*,#7952,.F.);
+#7952 = EDGE_CURVE('',#7660,#7394,#7953,.T.);
+#7953 = SURFACE_CURVE('',#7954,(#7958,#7965),.PCURVE_S1.);
+#7954 = LINE('',#7955,#7956);
+#7955 = CARTESIAN_POINT('',(3.175,3.26,2.56));
+#7956 = VECTOR('',#7957,1.);
+#7957 = DIRECTION('',(0.,1.,0.));
+#7958 = PCURVE('',#7411,#7959);
+#7959 = DEFINITIONAL_REPRESENTATION('',(#7960),#7964);
+#7960 = LINE('',#7961,#7962);
+#7961 = CARTESIAN_POINT('',(-0.38625,-0.55));
+#7962 = VECTOR('',#7963,1.);
+#7963 = DIRECTION('',(0.,1.));
+#7964 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7965 = PCURVE('',#7543,#7966);
+#7966 = DEFINITIONAL_REPRESENTATION('',(#7967),#7971);
+#7967 = LINE('',#7968,#7969);
+#7968 = CARTESIAN_POINT('',(0.275,0.));
+#7969 = VECTOR('',#7970,1.);
+#7970 = DIRECTION('',(0.,-1.));
+#7971 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7972 = ADVANCED_FACE('',(#7973),#7543,.F.);
+#7973 = FACE_BOUND('',#7974,.F.);
+#7974 = EDGE_LOOP('',(#7975,#7976,#7997,#7998));
+#7975 = ORIENTED_EDGE('',*,*,#7682,.F.);
+#7976 = ORIENTED_EDGE('',*,*,#7977,.T.);
+#7977 = EDGE_CURVE('',#7683,#7502,#7978,.T.);
+#7978 = SURFACE_CURVE('',#7979,(#7983,#7990),.PCURVE_S1.);
+#7979 = LINE('',#7980,#7981);
+#7980 = CARTESIAN_POINT('',(3.175,3.26,2.285));
+#7981 = VECTOR('',#7982,1.);
+#7982 = DIRECTION('',(0.,1.,0.));
+#7983 = PCURVE('',#7543,#7984);
+#7984 = DEFINITIONAL_REPRESENTATION('',(#7985),#7989);
+#7985 = LINE('',#7986,#7987);
+#7986 = CARTESIAN_POINT('',(0.,0.));
+#7987 = VECTOR('',#7988,1.);
+#7988 = DIRECTION('',(0.,-1.));
+#7989 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7990 = PCURVE('',#7517,#7991);
+#7991 = DEFINITIONAL_REPRESENTATION('',(#7992),#7996);
+#7992 = LINE('',#7993,#7994);
+#7993 = CARTESIAN_POINT('',(0.,0.));
+#7994 = VECTOR('',#7995,1.);
+#7995 = DIRECTION('',(0.,1.));
+#7996 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#7997 = ORIENTED_EDGE('',*,*,#7529,.T.);
+#7998 = ORIENTED_EDGE('',*,*,#7952,.F.);
+#7999 = ADVANCED_FACE('',(#8000),#7517,.F.);
+#8000 = FACE_BOUND('',#8001,.F.);
+#8001 = EDGE_LOOP('',(#8002,#8003,#8004,#8025));
+#8002 = ORIENTED_EDGE('',*,*,#7977,.F.);
+#8003 = ORIENTED_EDGE('',*,*,#7705,.T.);
+#8004 = ORIENTED_EDGE('',*,*,#8005,.T.);
+#8005 = EDGE_CURVE('',#7706,#7474,#8006,.T.);
+#8006 = SURFACE_CURVE('',#8007,(#8011,#8018),.PCURVE_S1.);
+#8007 = LINE('',#8008,#8009);
+#8008 = CARTESIAN_POINT('',(3.6725,3.26,2.285));
+#8009 = VECTOR('',#8010,1.);
+#8010 = DIRECTION('',(0.,1.,0.));
+#8011 = PCURVE('',#7517,#8012);
+#8012 = DEFINITIONAL_REPRESENTATION('',(#8013),#8017);
+#8013 = LINE('',#8014,#8015);
+#8014 = CARTESIAN_POINT('',(0.4975,0.));
+#8015 = VECTOR('',#8016,1.);
+#8016 = DIRECTION('',(0.,1.));
+#8017 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8018 = PCURVE('',#7489,#8019);
+#8019 = DEFINITIONAL_REPRESENTATION('',(#8020),#8024);
+#8020 = LINE('',#8021,#8022);
+#8021 = CARTESIAN_POINT('',(0.55,2.62605853382));
+#8022 = VECTOR('',#8023,1.);
+#8023 = DIRECTION('',(-1.,-2.226071387182E-62));
+#8024 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8025 = ORIENTED_EDGE('',*,*,#7501,.F.);
+#8026 = ADVANCED_FACE('',(#8027),#7489,.T.);
+#8027 = FACE_BOUND('',#8028,.T.);
+#8028 = EDGE_LOOP('',(#8029,#8030,#8031,#8032,#8033,#8034,#8035,#8036));
+#8029 = ORIENTED_EDGE('',*,*,#7728,.T.);
+#8030 = ORIENTED_EDGE('',*,*,#8005,.T.);
+#8031 = ORIENTED_EDGE('',*,*,#7473,.T.);
+#8032 = ORIENTED_EDGE('',*,*,#7633,.T.);
+#8033 = ORIENTED_EDGE('',*,*,#7800,.T.);
+#8034 = ORIENTED_EDGE('',*,*,#7898,.T.);
+#8035 = ORIENTED_EDGE('',*,*,#7925,.T.);
+#8036 = ORIENTED_EDGE('',*,*,#7849,.T.);
+#8037 = MANIFOLD_SOLID_BREP('',#8038);
+#8038 = CLOSED_SHELL('',(#8039,#8271,#8436,#8486,#8535,#8653,#8702,#8751
+ ,#8800,#8827,#8854,#8881,#8908));
+#8039 = ADVANCED_FACE('',(#8040),#8054,.F.);
+#8040 = FACE_BOUND('',#8041,.F.);
+#8041 = EDGE_LOOP('',(#8042,#8077,#8105,#8133,#8161,#8189,#8217,#8245));
+#8042 = ORIENTED_EDGE('',*,*,#8043,.T.);
+#8043 = EDGE_CURVE('',#8044,#8046,#8048,.T.);
+#8044 = VERTEX_POINT('',#8045);
+#8045 = CARTESIAN_POINT('',(-3.9475,0.72,2.4225));
+#8046 = VERTEX_POINT('',#8047);
+#8047 = CARTESIAN_POINT('',(-3.9475,0.72,0.275));
+#8048 = SURFACE_CURVE('',#8049,(#8053,#8065),.PCURVE_S1.);
+#8049 = LINE('',#8050,#8051);
+#8050 = CARTESIAN_POINT('',(-3.9475,0.72,2.56));
+#8051 = VECTOR('',#8052,1.);
+#8052 = DIRECTION('',(0.,0.,-1.));
+#8053 = PCURVE('',#8054,#8059);
+#8054 = PLANE('',#8055);
+#8055 = AXIS2_PLACEMENT_3D('',#8056,#8057,#8058);
+#8056 = CARTESIAN_POINT('',(-3.9475,1.27,-0.34105853382));
+#8057 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#8058 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#8059 = DEFINITIONAL_REPRESENTATION('',(#8060),#8064);
+#8060 = LINE('',#8061,#8062);
+#8061 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#8062 = VECTOR('',#8063,1.);
+#8063 = DIRECTION('',(0.,-1.));
+#8064 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8065 = PCURVE('',#8066,#8071);
+#8066 = PLANE('',#8067);
+#8067 = AXIS2_PLACEMENT_3D('',#8068,#8069,#8070);
+#8068 = CARTESIAN_POINT('',(-3.724778209321,0.72,1.581028209321));
+#8069 = DIRECTION('',(1.58726821659E-29,-1.,-1.055919227411E-30));
+#8070 = DIRECTION('',(-1.,-1.58726821659E-29,0.));
+#8071 = DEFINITIONAL_REPRESENTATION('',(#8072),#8076);
+#8072 = LINE('',#8073,#8074);
+#8073 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#8074 = VECTOR('',#8075,1.);
+#8075 = DIRECTION('',(0.,1.));
+#8076 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8077 = ORIENTED_EDGE('',*,*,#8078,.T.);
+#8078 = EDGE_CURVE('',#8046,#8079,#8081,.T.);
+#8079 = VERTEX_POINT('',#8080);
+#8080 = CARTESIAN_POINT('',(-3.9475,0.995,0.));
+#8081 = SURFACE_CURVE('',#8082,(#8086,#8093),.PCURVE_S1.);
+#8082 = LINE('',#8083,#8084);
+#8083 = CARTESIAN_POINT('',(-3.9475,0.72,0.275));
+#8084 = VECTOR('',#8085,1.);
+#8085 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#8086 = PCURVE('',#8054,#8087);
+#8087 = DEFINITIONAL_REPRESENTATION('',(#8088),#8092);
+#8088 = LINE('',#8089,#8090);
+#8089 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#8090 = VECTOR('',#8091,1.);
+#8091 = DIRECTION('',(0.707106781187,-0.707106781187));
+#8092 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8093 = PCURVE('',#8094,#8099);
+#8094 = PLANE('',#8095);
+#8095 = AXIS2_PLACEMENT_3D('',#8096,#8097,#8098);
+#8096 = CARTESIAN_POINT('',(-3.6725,0.72,0.275));
+#8097 = DIRECTION('',(-0.,-0.707106781187,-0.707106781187));
+#8098 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#8099 = DEFINITIONAL_REPRESENTATION('',(#8100),#8104);
+#8100 = LINE('',#8101,#8102);
+#8101 = CARTESIAN_POINT('',(0.,-0.275));
+#8102 = VECTOR('',#8103,1.);
+#8103 = DIRECTION('',(1.,0.));
+#8104 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8105 = ORIENTED_EDGE('',*,*,#8106,.T.);
+#8106 = EDGE_CURVE('',#8079,#8107,#8109,.T.);
+#8107 = VERTEX_POINT('',#8108);
+#8108 = CARTESIAN_POINT('',(-3.9475,0.995,-3.5));
+#8109 = SURFACE_CURVE('',#8110,(#8114,#8121),.PCURVE_S1.);
+#8110 = LINE('',#8111,#8112);
+#8111 = CARTESIAN_POINT('',(-3.9475,0.995,0.));
+#8112 = VECTOR('',#8113,1.);
+#8113 = DIRECTION('',(0.,0.,-1.));
+#8114 = PCURVE('',#8054,#8115);
+#8115 = DEFINITIONAL_REPRESENTATION('',(#8116),#8120);
+#8116 = LINE('',#8117,#8118);
+#8117 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#8118 = VECTOR('',#8119,1.);
+#8119 = DIRECTION('',(0.,-1.));
+#8120 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8121 = PCURVE('',#8122,#8127);
+#8122 = PLANE('',#8123);
+#8123 = AXIS2_PLACEMENT_3D('',#8124,#8125,#8126);
+#8124 = CARTESIAN_POINT('',(-3.6725,0.995,0.));
+#8125 = DIRECTION('',(-0.,-1.,-0.));
+#8126 = DIRECTION('',(0.,0.,-1.));
+#8127 = DEFINITIONAL_REPRESENTATION('',(#8128),#8132);
+#8128 = LINE('',#8129,#8130);
+#8129 = CARTESIAN_POINT('',(0.,-0.275));
+#8130 = VECTOR('',#8131,1.);
+#8131 = DIRECTION('',(1.,0.));
+#8132 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8133 = ORIENTED_EDGE('',*,*,#8134,.T.);
+#8134 = EDGE_CURVE('',#8107,#8135,#8137,.T.);
+#8135 = VERTEX_POINT('',#8136);
+#8136 = CARTESIAN_POINT('',(-3.9475,1.545,-3.5));
+#8137 = SURFACE_CURVE('',#8138,(#8142,#8149),.PCURVE_S1.);
+#8138 = LINE('',#8139,#8140);
+#8139 = CARTESIAN_POINT('',(-3.9475,0.995,-3.5));
+#8140 = VECTOR('',#8141,1.);
+#8141 = DIRECTION('',(0.,1.,0.));
+#8142 = PCURVE('',#8054,#8143);
+#8143 = DEFINITIONAL_REPRESENTATION('',(#8144),#8148);
+#8144 = LINE('',#8145,#8146);
+#8145 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#8146 = VECTOR('',#8147,1.);
+#8147 = DIRECTION('',(1.,-2.226071387182E-62));
+#8148 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8149 = PCURVE('',#8150,#8155);
+#8150 = PLANE('',#8151);
+#8151 = AXIS2_PLACEMENT_3D('',#8152,#8153,#8154);
+#8152 = CARTESIAN_POINT('',(-3.6725,0.995,-3.5));
+#8153 = DIRECTION('',(0.,0.,-1.));
+#8154 = DIRECTION('',(0.,1.,0.));
+#8155 = DEFINITIONAL_REPRESENTATION('',(#8156),#8160);
+#8156 = LINE('',#8157,#8158);
+#8157 = CARTESIAN_POINT('',(0.,-0.275));
+#8158 = VECTOR('',#8159,1.);
+#8159 = DIRECTION('',(1.,0.));
+#8160 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8161 = ORIENTED_EDGE('',*,*,#8162,.T.);
+#8162 = EDGE_CURVE('',#8135,#8163,#8165,.T.);
+#8163 = VERTEX_POINT('',#8164);
+#8164 = CARTESIAN_POINT('',(-3.9475,1.545,0.));
+#8165 = SURFACE_CURVE('',#8166,(#8170,#8177),.PCURVE_S1.);
+#8166 = LINE('',#8167,#8168);
+#8167 = CARTESIAN_POINT('',(-3.9475,1.545,-3.5));
+#8168 = VECTOR('',#8169,1.);
+#8169 = DIRECTION('',(0.,0.,1.));
+#8170 = PCURVE('',#8054,#8171);
+#8171 = DEFINITIONAL_REPRESENTATION('',(#8172),#8176);
+#8172 = LINE('',#8173,#8174);
+#8173 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#8174 = VECTOR('',#8175,1.);
+#8175 = DIRECTION('',(0.,1.));
+#8176 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8177 = PCURVE('',#8178,#8183);
+#8178 = PLANE('',#8179);
+#8179 = AXIS2_PLACEMENT_3D('',#8180,#8181,#8182);
+#8180 = CARTESIAN_POINT('',(-3.6725,1.545,-3.5));
+#8181 = DIRECTION('',(0.,1.,0.));
+#8182 = DIRECTION('',(0.,0.,1.));
+#8183 = DEFINITIONAL_REPRESENTATION('',(#8184),#8188);
+#8184 = LINE('',#8185,#8186);
+#8185 = CARTESIAN_POINT('',(0.,-0.275));
+#8186 = VECTOR('',#8187,1.);
+#8187 = DIRECTION('',(1.,0.));
+#8188 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8189 = ORIENTED_EDGE('',*,*,#8190,.T.);
+#8190 = EDGE_CURVE('',#8163,#8191,#8193,.T.);
+#8191 = VERTEX_POINT('',#8192);
+#8192 = CARTESIAN_POINT('',(-3.9475,1.82,0.275));
+#8193 = SURFACE_CURVE('',#8194,(#8198,#8205),.PCURVE_S1.);
+#8194 = LINE('',#8195,#8196);
+#8195 = CARTESIAN_POINT('',(-3.9475,1.545,0.));
+#8196 = VECTOR('',#8197,1.);
+#8197 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#8198 = PCURVE('',#8054,#8199);
+#8199 = DEFINITIONAL_REPRESENTATION('',(#8200),#8204);
+#8200 = LINE('',#8201,#8202);
+#8201 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#8202 = VECTOR('',#8203,1.);
+#8203 = DIRECTION('',(0.707106781187,0.707106781187));
+#8204 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8205 = PCURVE('',#8206,#8211);
+#8206 = PLANE('',#8207);
+#8207 = AXIS2_PLACEMENT_3D('',#8208,#8209,#8210);
+#8208 = CARTESIAN_POINT('',(-3.6725,1.545,0.));
+#8209 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#8210 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#8211 = DEFINITIONAL_REPRESENTATION('',(#8212),#8216);
+#8212 = LINE('',#8213,#8214);
+#8213 = CARTESIAN_POINT('',(0.,-0.275));
+#8214 = VECTOR('',#8215,1.);
+#8215 = DIRECTION('',(1.,0.));
+#8216 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8217 = ORIENTED_EDGE('',*,*,#8218,.T.);
+#8218 = EDGE_CURVE('',#8191,#8219,#8221,.T.);
+#8219 = VERTEX_POINT('',#8220);
+#8220 = CARTESIAN_POINT('',(-3.9475,1.82,2.4225));
+#8221 = SURFACE_CURVE('',#8222,(#8226,#8233),.PCURVE_S1.);
+#8222 = LINE('',#8223,#8224);
+#8223 = CARTESIAN_POINT('',(-3.9475,1.82,0.275));
+#8224 = VECTOR('',#8225,1.);
+#8225 = DIRECTION('',(0.,0.,1.));
+#8226 = PCURVE('',#8054,#8227);
+#8227 = DEFINITIONAL_REPRESENTATION('',(#8228),#8232);
+#8228 = LINE('',#8229,#8230);
+#8229 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#8230 = VECTOR('',#8231,1.);
+#8231 = DIRECTION('',(0.,1.));
+#8232 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8233 = PCURVE('',#8234,#8239);
+#8234 = PLANE('',#8235);
+#8235 = AXIS2_PLACEMENT_3D('',#8236,#8237,#8238);
+#8236 = CARTESIAN_POINT('',(-3.724778209321,1.82,1.581028209321));
+#8237 = DIRECTION('',(2.616880222009E-29,1.,-2.312216259511E-30));
+#8238 = DIRECTION('',(1.,-2.616880222009E-29,0.));
+#8239 = DEFINITIONAL_REPRESENTATION('',(#8240),#8244);
+#8240 = LINE('',#8241,#8242);
+#8241 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#8242 = VECTOR('',#8243,1.);
+#8243 = DIRECTION('',(0.,-1.));
+#8244 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8245 = ORIENTED_EDGE('',*,*,#8246,.T.);
+#8246 = EDGE_CURVE('',#8219,#8044,#8247,.T.);
+#8247 = SURFACE_CURVE('',#8248,(#8252,#8259),.PCURVE_S1.);
+#8248 = LINE('',#8249,#8250);
+#8249 = CARTESIAN_POINT('',(-3.9475,1.82,2.4225));
+#8250 = VECTOR('',#8251,1.);
+#8251 = DIRECTION('',(0.,-1.,0.));
+#8252 = PCURVE('',#8054,#8253);
+#8253 = DEFINITIONAL_REPRESENTATION('',(#8254),#8258);
+#8254 = LINE('',#8255,#8256);
+#8255 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#8256 = VECTOR('',#8257,1.);
+#8257 = DIRECTION('',(-1.,2.226071387182E-62));
+#8258 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8259 = PCURVE('',#8260,#8265);
+#8260 = CYLINDRICAL_SURFACE('',#8261,0.1375);
+#8261 = AXIS2_PLACEMENT_3D('',#8262,#8263,#8264);
+#8262 = CARTESIAN_POINT('',(-3.81,1.82,2.4225));
+#8263 = DIRECTION('',(0.,-1.,0.));
+#8264 = DIRECTION('',(-1.,-0.,-9.8088568672E-33));
+#8265 = DEFINITIONAL_REPRESENTATION('',(#8266),#8270);
+#8266 = LINE('',#8267,#8268);
+#8267 = CARTESIAN_POINT('',(-0.,0.));
+#8268 = VECTOR('',#8269,1.);
+#8269 = DIRECTION('',(-0.,1.));
+#8270 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8271 = ADVANCED_FACE('',(#8272),#8066,.T.);
+#8272 = FACE_BOUND('',#8273,.T.);
+#8273 = EDGE_LOOP('',(#8274,#8304,#8330,#8331,#8354,#8382,#8410));
+#8274 = ORIENTED_EDGE('',*,*,#8275,.T.);
+#8275 = EDGE_CURVE('',#8276,#8278,#8280,.T.);
+#8276 = VERTEX_POINT('',#8277);
+#8277 = CARTESIAN_POINT('',(-3.175,0.72,2.56));
+#8278 = VERTEX_POINT('',#8279);
+#8279 = CARTESIAN_POINT('',(-3.81,0.72,2.56));
+#8280 = SURFACE_CURVE('',#8281,(#8285,#8292),.PCURVE_S1.);
+#8281 = LINE('',#8282,#8283);
+#8282 = CARTESIAN_POINT('',(-3.6725,0.72,2.56));
+#8283 = VECTOR('',#8284,1.);
+#8284 = DIRECTION('',(-1.,0.,0.));
+#8285 = PCURVE('',#8066,#8286);
+#8286 = DEFINITIONAL_REPRESENTATION('',(#8287),#8291);
+#8287 = LINE('',#8288,#8289);
+#8288 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#8289 = VECTOR('',#8290,1.);
+#8290 = DIRECTION('',(1.,1.676027028956E-59));
+#8291 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8292 = PCURVE('',#8293,#8298);
+#8293 = PLANE('',#8294);
+#8294 = AXIS2_PLACEMENT_3D('',#8295,#8296,#8297);
+#8295 = CARTESIAN_POINT('',(-3.56125,1.27,2.56));
+#8296 = DIRECTION('',(1.601195610168E-30,3.925633828627E-30,1.));
+#8297 = DIRECTION('',(0.,1.,-3.925633828627E-30));
+#8298 = DEFINITIONAL_REPRESENTATION('',(#8299),#8303);
+#8299 = LINE('',#8300,#8301);
+#8300 = CARTESIAN_POINT('',(-0.55,0.11125));
+#8301 = VECTOR('',#8302,1.);
+#8302 = DIRECTION('',(0.,1.));
+#8303 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8304 = ORIENTED_EDGE('',*,*,#8305,.F.);
+#8305 = EDGE_CURVE('',#8044,#8278,#8306,.T.);
+#8306 = SURFACE_CURVE('',#8307,(#8312,#8323),.PCURVE_S1.);
+#8307 = CIRCLE('',#8308,0.1375);
+#8308 = AXIS2_PLACEMENT_3D('',#8309,#8310,#8311);
+#8309 = CARTESIAN_POINT('',(-3.81,0.72,2.4225));
+#8310 = DIRECTION('',(-0.,1.,0.));
+#8311 = DIRECTION('',(0.,0.,-1.));
+#8312 = PCURVE('',#8066,#8313);
+#8313 = DEFINITIONAL_REPRESENTATION('',(#8314),#8322);
+#8314 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#8315,#8316,#8317,#8318,
+#8319,#8320,#8321),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2
+ ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786,
+6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE()
+GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,
+1.,0.5,1.)) REPRESENTATION_ITEM('') );
+#8315 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#8316 = CARTESIAN_POINT('',(0.323378776719,-0.703971790679));
+#8317 = CARTESIAN_POINT('',(0.204300283699,-0.910221790679));
+#8318 = CARTESIAN_POINT('',(8.522179067866E-02,-1.116471790679));
+#8319 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.910221790679));
+#8320 = CARTESIAN_POINT('',(-0.152935195362,-0.703971790679));
+#8321 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#8322 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8323 = PCURVE('',#8260,#8324);
+#8324 = DEFINITIONAL_REPRESENTATION('',(#8325),#8329);
+#8325 = LINE('',#8326,#8327);
+#8326 = CARTESIAN_POINT('',(1.570796326795,1.1));
+#8327 = VECTOR('',#8328,1.);
+#8328 = DIRECTION('',(-1.,0.));
+#8329 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8330 = ORIENTED_EDGE('',*,*,#8043,.T.);
+#8331 = ORIENTED_EDGE('',*,*,#8332,.F.);
+#8332 = EDGE_CURVE('',#8333,#8046,#8335,.T.);
+#8333 = VERTEX_POINT('',#8334);
+#8334 = CARTESIAN_POINT('',(-3.6725,0.72,0.275));
+#8335 = SURFACE_CURVE('',#8336,(#8340,#8347),.PCURVE_S1.);
+#8336 = LINE('',#8337,#8338);
+#8337 = CARTESIAN_POINT('',(-3.6725,0.72,0.275));
+#8338 = VECTOR('',#8339,1.);
+#8339 = DIRECTION('',(-1.,0.,0.));
+#8340 = PCURVE('',#8066,#8341);
+#8341 = DEFINITIONAL_REPRESENTATION('',(#8342),#8346);
+#8342 = LINE('',#8343,#8344);
+#8343 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#8344 = VECTOR('',#8345,1.);
+#8345 = DIRECTION('',(1.,1.676027028956E-59));
+#8346 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8347 = PCURVE('',#8094,#8348);
+#8348 = DEFINITIONAL_REPRESENTATION('',(#8349),#8353);
+#8349 = LINE('',#8350,#8351);
+#8350 = CARTESIAN_POINT('',(0.,0.));
+#8351 = VECTOR('',#8352,1.);
+#8352 = DIRECTION('',(0.,-1.));
+#8353 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8354 = ORIENTED_EDGE('',*,*,#8355,.F.);
+#8355 = EDGE_CURVE('',#8356,#8333,#8358,.T.);
+#8356 = VERTEX_POINT('',#8357);
+#8357 = CARTESIAN_POINT('',(-3.6725,0.72,2.285));
+#8358 = SURFACE_CURVE('',#8359,(#8363,#8370),.PCURVE_S1.);
+#8359 = LINE('',#8360,#8361);
+#8360 = CARTESIAN_POINT('',(-3.6725,0.72,2.56));
+#8361 = VECTOR('',#8362,1.);
+#8362 = DIRECTION('',(0.,0.,-1.));
+#8363 = PCURVE('',#8066,#8364);
+#8364 = DEFINITIONAL_REPRESENTATION('',(#8365),#8369);
+#8365 = LINE('',#8366,#8367);
+#8366 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#8367 = VECTOR('',#8368,1.);
+#8368 = DIRECTION('',(0.,1.));
+#8369 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8370 = PCURVE('',#8371,#8376);
+#8371 = PLANE('',#8372);
+#8372 = AXIS2_PLACEMENT_3D('',#8373,#8374,#8375);
+#8373 = CARTESIAN_POINT('',(-3.6725,1.27,-0.34105853382));
+#8374 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#8375 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#8376 = DEFINITIONAL_REPRESENTATION('',(#8377),#8381);
+#8377 = LINE('',#8378,#8379);
+#8378 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#8379 = VECTOR('',#8380,1.);
+#8380 = DIRECTION('',(0.,-1.));
+#8381 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8382 = ORIENTED_EDGE('',*,*,#8383,.T.);
+#8383 = EDGE_CURVE('',#8356,#8384,#8386,.T.);
+#8384 = VERTEX_POINT('',#8385);
+#8385 = CARTESIAN_POINT('',(-3.175,0.72,2.285));
+#8386 = SURFACE_CURVE('',#8387,(#8391,#8398),.PCURVE_S1.);
+#8387 = LINE('',#8388,#8389);
+#8388 = CARTESIAN_POINT('',(-3.6725,0.72,2.285));
+#8389 = VECTOR('',#8390,1.);
+#8390 = DIRECTION('',(1.,0.,0.));
+#8391 = PCURVE('',#8066,#8392);
+#8392 = DEFINITIONAL_REPRESENTATION('',(#8393),#8397);
+#8393 = LINE('',#8394,#8395);
+#8394 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.703971790679));
+#8395 = VECTOR('',#8396,1.);
+#8396 = DIRECTION('',(-1.,-1.676027028956E-59));
+#8397 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8398 = PCURVE('',#8399,#8404);
+#8399 = PLANE('',#8400);
+#8400 = AXIS2_PLACEMENT_3D('',#8401,#8402,#8403);
+#8401 = CARTESIAN_POINT('',(-3.6725,0.72,2.285));
+#8402 = DIRECTION('',(0.,0.,1.));
+#8403 = DIRECTION('',(1.,0.,0.));
+#8404 = DEFINITIONAL_REPRESENTATION('',(#8405),#8409);
+#8405 = LINE('',#8406,#8407);
+#8406 = CARTESIAN_POINT('',(0.,0.));
+#8407 = VECTOR('',#8408,1.);
+#8408 = DIRECTION('',(1.,0.));
+#8409 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8410 = ORIENTED_EDGE('',*,*,#8411,.T.);
+#8411 = EDGE_CURVE('',#8384,#8276,#8412,.T.);
+#8412 = SURFACE_CURVE('',#8413,(#8417,#8424),.PCURVE_S1.);
+#8413 = LINE('',#8414,#8415);
+#8414 = CARTESIAN_POINT('',(-3.175,0.72,2.285));
+#8415 = VECTOR('',#8416,1.);
+#8416 = DIRECTION('',(0.,0.,1.));
+#8417 = PCURVE('',#8066,#8418);
+#8418 = DEFINITIONAL_REPRESENTATION('',(#8419),#8423);
+#8419 = LINE('',#8420,#8421);
+#8420 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#8421 = VECTOR('',#8422,1.);
+#8422 = DIRECTION('',(0.,-1.));
+#8423 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8424 = PCURVE('',#8425,#8430);
+#8425 = PLANE('',#8426);
+#8426 = AXIS2_PLACEMENT_3D('',#8427,#8428,#8429);
+#8427 = CARTESIAN_POINT('',(-3.175,0.72,2.285));
+#8428 = DIRECTION('',(1.,0.,0.));
+#8429 = DIRECTION('',(0.,0.,1.));
+#8430 = DEFINITIONAL_REPRESENTATION('',(#8431),#8435);
+#8431 = LINE('',#8432,#8433);
+#8432 = CARTESIAN_POINT('',(0.,0.));
+#8433 = VECTOR('',#8434,1.);
+#8434 = DIRECTION('',(1.,0.));
+#8435 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8436 = ADVANCED_FACE('',(#8437),#8260,.T.);
+#8437 = FACE_BOUND('',#8438,.F.);
+#8438 = EDGE_LOOP('',(#8439,#8463,#8484,#8485));
+#8439 = ORIENTED_EDGE('',*,*,#8440,.T.);
+#8440 = EDGE_CURVE('',#8219,#8441,#8443,.T.);
+#8441 = VERTEX_POINT('',#8442);
+#8442 = CARTESIAN_POINT('',(-3.81,1.82,2.56));
+#8443 = SURFACE_CURVE('',#8444,(#8449,#8456),.PCURVE_S1.);
+#8444 = CIRCLE('',#8445,0.1375);
+#8445 = AXIS2_PLACEMENT_3D('',#8446,#8447,#8448);
+#8446 = CARTESIAN_POINT('',(-3.81,1.82,2.4225));
+#8447 = DIRECTION('',(-0.,1.,0.));
+#8448 = DIRECTION('',(0.,0.,-1.));
+#8449 = PCURVE('',#8260,#8450);
+#8450 = DEFINITIONAL_REPRESENTATION('',(#8451),#8455);
+#8451 = LINE('',#8452,#8453);
+#8452 = CARTESIAN_POINT('',(1.570796326795,3.552713678801E-15));
+#8453 = VECTOR('',#8454,1.);
+#8454 = DIRECTION('',(-1.,0.));
+#8455 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8456 = PCURVE('',#8234,#8457);
+#8457 = DEFINITIONAL_REPRESENTATION('',(#8458),#8462);
+#8458 = CIRCLE('',#8459,0.1375);
+#8459 = AXIS2_PLACEMENT_2D('',#8460,#8461);
+#8460 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#8461 = DIRECTION('',(0.,1.));
+#8462 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8463 = ORIENTED_EDGE('',*,*,#8464,.T.);
+#8464 = EDGE_CURVE('',#8441,#8278,#8465,.T.);
+#8465 = SURFACE_CURVE('',#8466,(#8470,#8477),.PCURVE_S1.);
+#8466 = LINE('',#8467,#8468);
+#8467 = CARTESIAN_POINT('',(-3.81,1.82,2.56));
+#8468 = VECTOR('',#8469,1.);
+#8469 = DIRECTION('',(0.,-1.,0.));
+#8470 = PCURVE('',#8260,#8471);
+#8471 = DEFINITIONAL_REPRESENTATION('',(#8472),#8476);
+#8472 = LINE('',#8473,#8474);
+#8473 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#8474 = VECTOR('',#8475,1.);
+#8475 = DIRECTION('',(-0.,1.));
+#8476 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8477 = PCURVE('',#8293,#8478);
+#8478 = DEFINITIONAL_REPRESENTATION('',(#8479),#8483);
+#8479 = LINE('',#8480,#8481);
+#8480 = CARTESIAN_POINT('',(0.55,0.24875));
+#8481 = VECTOR('',#8482,1.);
+#8482 = DIRECTION('',(-1.,-6.285707653525E-60));
+#8483 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8484 = ORIENTED_EDGE('',*,*,#8305,.F.);
+#8485 = ORIENTED_EDGE('',*,*,#8246,.F.);
+#8486 = ADVANCED_FACE('',(#8487),#8094,.T.);
+#8487 = FACE_BOUND('',#8488,.T.);
+#8488 = EDGE_LOOP('',(#8489,#8490,#8491,#8514));
+#8489 = ORIENTED_EDGE('',*,*,#8332,.T.);
+#8490 = ORIENTED_EDGE('',*,*,#8078,.T.);
+#8491 = ORIENTED_EDGE('',*,*,#8492,.F.);
+#8492 = EDGE_CURVE('',#8493,#8079,#8495,.T.);
+#8493 = VERTEX_POINT('',#8494);
+#8494 = CARTESIAN_POINT('',(-3.6725,0.995,0.));
+#8495 = SURFACE_CURVE('',#8496,(#8500,#8507),.PCURVE_S1.);
+#8496 = LINE('',#8497,#8498);
+#8497 = CARTESIAN_POINT('',(-3.6725,0.995,0.));
+#8498 = VECTOR('',#8499,1.);
+#8499 = DIRECTION('',(-1.,0.,0.));
+#8500 = PCURVE('',#8094,#8501);
+#8501 = DEFINITIONAL_REPRESENTATION('',(#8502),#8506);
+#8502 = LINE('',#8503,#8504);
+#8503 = CARTESIAN_POINT('',(0.388908729653,0.));
+#8504 = VECTOR('',#8505,1.);
+#8505 = DIRECTION('',(0.,-1.));
+#8506 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8507 = PCURVE('',#8122,#8508);
+#8508 = DEFINITIONAL_REPRESENTATION('',(#8509),#8513);
+#8509 = LINE('',#8510,#8511);
+#8510 = CARTESIAN_POINT('',(0.,0.));
+#8511 = VECTOR('',#8512,1.);
+#8512 = DIRECTION('',(0.,-1.));
+#8513 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8514 = ORIENTED_EDGE('',*,*,#8515,.F.);
+#8515 = EDGE_CURVE('',#8333,#8493,#8516,.T.);
+#8516 = SURFACE_CURVE('',#8517,(#8521,#8528),.PCURVE_S1.);
+#8517 = LINE('',#8518,#8519);
+#8518 = CARTESIAN_POINT('',(-3.6725,0.72,0.275));
+#8519 = VECTOR('',#8520,1.);
+#8520 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#8521 = PCURVE('',#8094,#8522);
+#8522 = DEFINITIONAL_REPRESENTATION('',(#8523),#8527);
+#8523 = LINE('',#8524,#8525);
+#8524 = CARTESIAN_POINT('',(0.,0.));
+#8525 = VECTOR('',#8526,1.);
+#8526 = DIRECTION('',(1.,0.));
+#8527 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8528 = PCURVE('',#8371,#8529);
+#8529 = DEFINITIONAL_REPRESENTATION('',(#8530),#8534);
+#8530 = LINE('',#8531,#8532);
+#8531 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#8532 = VECTOR('',#8533,1.);
+#8533 = DIRECTION('',(0.707106781187,-0.707106781187));
+#8534 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8535 = ADVANCED_FACE('',(#8536),#8234,.T.);
+#8536 = FACE_BOUND('',#8537,.T.);
+#8537 = EDGE_LOOP('',(#8538,#8539,#8540,#8563,#8586,#8609,#8632));
+#8538 = ORIENTED_EDGE('',*,*,#8218,.T.);
+#8539 = ORIENTED_EDGE('',*,*,#8440,.T.);
+#8540 = ORIENTED_EDGE('',*,*,#8541,.T.);
+#8541 = EDGE_CURVE('',#8441,#8542,#8544,.T.);
+#8542 = VERTEX_POINT('',#8543);
+#8543 = CARTESIAN_POINT('',(-3.175,1.82,2.56));
+#8544 = SURFACE_CURVE('',#8545,(#8549,#8556),.PCURVE_S1.);
+#8545 = LINE('',#8546,#8547);
+#8546 = CARTESIAN_POINT('',(-3.6725,1.82,2.56));
+#8547 = VECTOR('',#8548,1.);
+#8548 = DIRECTION('',(1.,0.,0.));
+#8549 = PCURVE('',#8234,#8550);
+#8550 = DEFINITIONAL_REPRESENTATION('',(#8551),#8555);
+#8551 = LINE('',#8552,#8553);
+#8552 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#8553 = VECTOR('',#8554,1.);
+#8554 = DIRECTION('',(1.,-6.050792998522E-59));
+#8555 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8556 = PCURVE('',#8293,#8557);
+#8557 = DEFINITIONAL_REPRESENTATION('',(#8558),#8562);
+#8558 = LINE('',#8559,#8560);
+#8559 = CARTESIAN_POINT('',(0.55,0.11125));
+#8560 = VECTOR('',#8561,1.);
+#8561 = DIRECTION('',(0.,-1.));
+#8562 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8563 = ORIENTED_EDGE('',*,*,#8564,.F.);
+#8564 = EDGE_CURVE('',#8565,#8542,#8567,.T.);
+#8565 = VERTEX_POINT('',#8566);
+#8566 = CARTESIAN_POINT('',(-3.175,1.82,2.285));
+#8567 = SURFACE_CURVE('',#8568,(#8572,#8579),.PCURVE_S1.);
+#8568 = LINE('',#8569,#8570);
+#8569 = CARTESIAN_POINT('',(-3.175,1.82,2.285));
+#8570 = VECTOR('',#8571,1.);
+#8571 = DIRECTION('',(0.,0.,1.));
+#8572 = PCURVE('',#8234,#8573);
+#8573 = DEFINITIONAL_REPRESENTATION('',(#8574),#8578);
+#8574 = LINE('',#8575,#8576);
+#8575 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#8576 = VECTOR('',#8577,1.);
+#8577 = DIRECTION('',(0.,-1.));
+#8578 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8579 = PCURVE('',#8425,#8580);
+#8580 = DEFINITIONAL_REPRESENTATION('',(#8581),#8585);
+#8581 = LINE('',#8582,#8583);
+#8582 = CARTESIAN_POINT('',(0.,-1.1));
+#8583 = VECTOR('',#8584,1.);
+#8584 = DIRECTION('',(1.,0.));
+#8585 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8586 = ORIENTED_EDGE('',*,*,#8587,.F.);
+#8587 = EDGE_CURVE('',#8588,#8565,#8590,.T.);
+#8588 = VERTEX_POINT('',#8589);
+#8589 = CARTESIAN_POINT('',(-3.6725,1.82,2.285));
+#8590 = SURFACE_CURVE('',#8591,(#8595,#8602),.PCURVE_S1.);
+#8591 = LINE('',#8592,#8593);
+#8592 = CARTESIAN_POINT('',(-3.6725,1.82,2.285));
+#8593 = VECTOR('',#8594,1.);
+#8594 = DIRECTION('',(1.,0.,0.));
+#8595 = PCURVE('',#8234,#8596);
+#8596 = DEFINITIONAL_REPRESENTATION('',(#8597),#8601);
+#8597 = LINE('',#8598,#8599);
+#8598 = CARTESIAN_POINT('',(5.227820932134E-02,-0.703971790679));
+#8599 = VECTOR('',#8600,1.);
+#8600 = DIRECTION('',(1.,-6.050792998522E-59));
+#8601 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8602 = PCURVE('',#8399,#8603);
+#8603 = DEFINITIONAL_REPRESENTATION('',(#8604),#8608);
+#8604 = LINE('',#8605,#8606);
+#8605 = CARTESIAN_POINT('',(0.,1.1));
+#8606 = VECTOR('',#8607,1.);
+#8607 = DIRECTION('',(1.,0.));
+#8608 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8609 = ORIENTED_EDGE('',*,*,#8610,.F.);
+#8610 = EDGE_CURVE('',#8611,#8588,#8613,.T.);
+#8611 = VERTEX_POINT('',#8612);
+#8612 = CARTESIAN_POINT('',(-3.6725,1.82,0.275));
+#8613 = SURFACE_CURVE('',#8614,(#8618,#8625),.PCURVE_S1.);
+#8614 = LINE('',#8615,#8616);
+#8615 = CARTESIAN_POINT('',(-3.6725,1.82,0.275));
+#8616 = VECTOR('',#8617,1.);
+#8617 = DIRECTION('',(0.,0.,1.));
+#8618 = PCURVE('',#8234,#8619);
+#8619 = DEFINITIONAL_REPRESENTATION('',(#8620),#8624);
+#8620 = LINE('',#8621,#8622);
+#8621 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#8622 = VECTOR('',#8623,1.);
+#8623 = DIRECTION('',(0.,-1.));
+#8624 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8625 = PCURVE('',#8371,#8626);
+#8626 = DEFINITIONAL_REPRESENTATION('',(#8627),#8631);
+#8627 = LINE('',#8628,#8629);
+#8628 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#8629 = VECTOR('',#8630,1.);
+#8630 = DIRECTION('',(0.,1.));
+#8631 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8632 = ORIENTED_EDGE('',*,*,#8633,.T.);
+#8633 = EDGE_CURVE('',#8611,#8191,#8634,.T.);
+#8634 = SURFACE_CURVE('',#8635,(#8639,#8646),.PCURVE_S1.);
+#8635 = LINE('',#8636,#8637);
+#8636 = CARTESIAN_POINT('',(-3.6725,1.82,0.275));
+#8637 = VECTOR('',#8638,1.);
+#8638 = DIRECTION('',(-1.,0.,0.));
+#8639 = PCURVE('',#8234,#8640);
+#8640 = DEFINITIONAL_REPRESENTATION('',(#8641),#8645);
+#8641 = LINE('',#8642,#8643);
+#8642 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#8643 = VECTOR('',#8644,1.);
+#8644 = DIRECTION('',(-1.,6.050792998522E-59));
+#8645 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8646 = PCURVE('',#8206,#8647);
+#8647 = DEFINITIONAL_REPRESENTATION('',(#8648),#8652);
+#8648 = LINE('',#8649,#8650);
+#8649 = CARTESIAN_POINT('',(0.388908729653,0.));
+#8650 = VECTOR('',#8651,1.);
+#8651 = DIRECTION('',(0.,-1.));
+#8652 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8653 = ADVANCED_FACE('',(#8654),#8122,.T.);
+#8654 = FACE_BOUND('',#8655,.T.);
+#8655 = EDGE_LOOP('',(#8656,#8657,#8658,#8681));
+#8656 = ORIENTED_EDGE('',*,*,#8492,.T.);
+#8657 = ORIENTED_EDGE('',*,*,#8106,.T.);
+#8658 = ORIENTED_EDGE('',*,*,#8659,.F.);
+#8659 = EDGE_CURVE('',#8660,#8107,#8662,.T.);
+#8660 = VERTEX_POINT('',#8661);
+#8661 = CARTESIAN_POINT('',(-3.6725,0.995,-3.5));
+#8662 = SURFACE_CURVE('',#8663,(#8667,#8674),.PCURVE_S1.);
+#8663 = LINE('',#8664,#8665);
+#8664 = CARTESIAN_POINT('',(-3.6725,0.995,-3.5));
+#8665 = VECTOR('',#8666,1.);
+#8666 = DIRECTION('',(-1.,0.,0.));
+#8667 = PCURVE('',#8122,#8668);
+#8668 = DEFINITIONAL_REPRESENTATION('',(#8669),#8673);
+#8669 = LINE('',#8670,#8671);
+#8670 = CARTESIAN_POINT('',(3.5,0.));
+#8671 = VECTOR('',#8672,1.);
+#8672 = DIRECTION('',(0.,-1.));
+#8673 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8674 = PCURVE('',#8150,#8675);
+#8675 = DEFINITIONAL_REPRESENTATION('',(#8676),#8680);
+#8676 = LINE('',#8677,#8678);
+#8677 = CARTESIAN_POINT('',(3.330669073875E-16,0.));
+#8678 = VECTOR('',#8679,1.);
+#8679 = DIRECTION('',(0.,-1.));
+#8680 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8681 = ORIENTED_EDGE('',*,*,#8682,.F.);
+#8682 = EDGE_CURVE('',#8493,#8660,#8683,.T.);
+#8683 = SURFACE_CURVE('',#8684,(#8688,#8695),.PCURVE_S1.);
+#8684 = LINE('',#8685,#8686);
+#8685 = CARTESIAN_POINT('',(-3.6725,0.995,0.));
+#8686 = VECTOR('',#8687,1.);
+#8687 = DIRECTION('',(0.,0.,-1.));
+#8688 = PCURVE('',#8122,#8689);
+#8689 = DEFINITIONAL_REPRESENTATION('',(#8690),#8694);
+#8690 = LINE('',#8691,#8692);
+#8691 = CARTESIAN_POINT('',(0.,0.));
+#8692 = VECTOR('',#8693,1.);
+#8693 = DIRECTION('',(1.,0.));
+#8694 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8695 = PCURVE('',#8371,#8696);
+#8696 = DEFINITIONAL_REPRESENTATION('',(#8697),#8701);
+#8697 = LINE('',#8698,#8699);
+#8698 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#8699 = VECTOR('',#8700,1.);
+#8700 = DIRECTION('',(0.,-1.));
+#8701 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8702 = ADVANCED_FACE('',(#8703),#8206,.T.);
+#8703 = FACE_BOUND('',#8704,.T.);
+#8704 = EDGE_LOOP('',(#8705,#8728,#8729,#8730));
+#8705 = ORIENTED_EDGE('',*,*,#8706,.T.);
+#8706 = EDGE_CURVE('',#8707,#8163,#8709,.T.);
+#8707 = VERTEX_POINT('',#8708);
+#8708 = CARTESIAN_POINT('',(-3.6725,1.545,0.));
+#8709 = SURFACE_CURVE('',#8710,(#8714,#8721),.PCURVE_S1.);
+#8710 = LINE('',#8711,#8712);
+#8711 = CARTESIAN_POINT('',(-3.6725,1.545,0.));
+#8712 = VECTOR('',#8713,1.);
+#8713 = DIRECTION('',(-1.,0.,0.));
+#8714 = PCURVE('',#8206,#8715);
+#8715 = DEFINITIONAL_REPRESENTATION('',(#8716),#8720);
+#8716 = LINE('',#8717,#8718);
+#8717 = CARTESIAN_POINT('',(-6.280369834735E-16,0.));
+#8718 = VECTOR('',#8719,1.);
+#8719 = DIRECTION('',(0.,-1.));
+#8720 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8721 = PCURVE('',#8178,#8722);
+#8722 = DEFINITIONAL_REPRESENTATION('',(#8723),#8727);
+#8723 = LINE('',#8724,#8725);
+#8724 = CARTESIAN_POINT('',(3.5,0.));
+#8725 = VECTOR('',#8726,1.);
+#8726 = DIRECTION('',(0.,-1.));
+#8727 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8728 = ORIENTED_EDGE('',*,*,#8190,.T.);
+#8729 = ORIENTED_EDGE('',*,*,#8633,.F.);
+#8730 = ORIENTED_EDGE('',*,*,#8731,.F.);
+#8731 = EDGE_CURVE('',#8707,#8611,#8732,.T.);
+#8732 = SURFACE_CURVE('',#8733,(#8737,#8744),.PCURVE_S1.);
+#8733 = LINE('',#8734,#8735);
+#8734 = CARTESIAN_POINT('',(-3.6725,1.545,0.));
+#8735 = VECTOR('',#8736,1.);
+#8736 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#8737 = PCURVE('',#8206,#8738);
+#8738 = DEFINITIONAL_REPRESENTATION('',(#8739),#8743);
+#8739 = LINE('',#8740,#8741);
+#8740 = CARTESIAN_POINT('',(0.,0.));
+#8741 = VECTOR('',#8742,1.);
+#8742 = DIRECTION('',(1.,0.));
+#8743 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8744 = PCURVE('',#8371,#8745);
+#8745 = DEFINITIONAL_REPRESENTATION('',(#8746),#8750);
+#8746 = LINE('',#8747,#8748);
+#8747 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#8748 = VECTOR('',#8749,1.);
+#8749 = DIRECTION('',(0.707106781187,0.707106781187));
+#8750 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8751 = ADVANCED_FACE('',(#8752),#8150,.T.);
+#8752 = FACE_BOUND('',#8753,.T.);
+#8753 = EDGE_LOOP('',(#8754,#8755,#8756,#8779));
+#8754 = ORIENTED_EDGE('',*,*,#8659,.T.);
+#8755 = ORIENTED_EDGE('',*,*,#8134,.T.);
+#8756 = ORIENTED_EDGE('',*,*,#8757,.F.);
+#8757 = EDGE_CURVE('',#8758,#8135,#8760,.T.);
+#8758 = VERTEX_POINT('',#8759);
+#8759 = CARTESIAN_POINT('',(-3.6725,1.545,-3.5));
+#8760 = SURFACE_CURVE('',#8761,(#8765,#8772),.PCURVE_S1.);
+#8761 = LINE('',#8762,#8763);
+#8762 = CARTESIAN_POINT('',(-3.6725,1.545,-3.5));
+#8763 = VECTOR('',#8764,1.);
+#8764 = DIRECTION('',(-1.,0.,0.));
+#8765 = PCURVE('',#8150,#8766);
+#8766 = DEFINITIONAL_REPRESENTATION('',(#8767),#8771);
+#8767 = LINE('',#8768,#8769);
+#8768 = CARTESIAN_POINT('',(0.55,0.));
+#8769 = VECTOR('',#8770,1.);
+#8770 = DIRECTION('',(0.,-1.));
+#8771 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8772 = PCURVE('',#8178,#8773);
+#8773 = DEFINITIONAL_REPRESENTATION('',(#8774),#8778);
+#8774 = LINE('',#8775,#8776);
+#8775 = CARTESIAN_POINT('',(0.,0.));
+#8776 = VECTOR('',#8777,1.);
+#8777 = DIRECTION('',(0.,-1.));
+#8778 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8779 = ORIENTED_EDGE('',*,*,#8780,.F.);
+#8780 = EDGE_CURVE('',#8660,#8758,#8781,.T.);
+#8781 = SURFACE_CURVE('',#8782,(#8786,#8793),.PCURVE_S1.);
+#8782 = LINE('',#8783,#8784);
+#8783 = CARTESIAN_POINT('',(-3.6725,0.995,-3.5));
+#8784 = VECTOR('',#8785,1.);
+#8785 = DIRECTION('',(0.,1.,0.));
+#8786 = PCURVE('',#8150,#8787);
+#8787 = DEFINITIONAL_REPRESENTATION('',(#8788),#8792);
+#8788 = LINE('',#8789,#8790);
+#8789 = CARTESIAN_POINT('',(0.,0.));
+#8790 = VECTOR('',#8791,1.);
+#8791 = DIRECTION('',(1.,0.));
+#8792 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8793 = PCURVE('',#8371,#8794);
+#8794 = DEFINITIONAL_REPRESENTATION('',(#8795),#8799);
+#8795 = LINE('',#8796,#8797);
+#8796 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#8797 = VECTOR('',#8798,1.);
+#8798 = DIRECTION('',(1.,-2.226071387182E-62));
+#8799 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8800 = ADVANCED_FACE('',(#8801),#8178,.T.);
+#8801 = FACE_BOUND('',#8802,.T.);
+#8802 = EDGE_LOOP('',(#8803,#8804,#8805,#8806));
+#8803 = ORIENTED_EDGE('',*,*,#8757,.T.);
+#8804 = ORIENTED_EDGE('',*,*,#8162,.T.);
+#8805 = ORIENTED_EDGE('',*,*,#8706,.F.);
+#8806 = ORIENTED_EDGE('',*,*,#8807,.F.);
+#8807 = EDGE_CURVE('',#8758,#8707,#8808,.T.);
+#8808 = SURFACE_CURVE('',#8809,(#8813,#8820),.PCURVE_S1.);
+#8809 = LINE('',#8810,#8811);
+#8810 = CARTESIAN_POINT('',(-3.6725,1.545,-3.5));
+#8811 = VECTOR('',#8812,1.);
+#8812 = DIRECTION('',(0.,0.,1.));
+#8813 = PCURVE('',#8178,#8814);
+#8814 = DEFINITIONAL_REPRESENTATION('',(#8815),#8819);
+#8815 = LINE('',#8816,#8817);
+#8816 = CARTESIAN_POINT('',(0.,0.));
+#8817 = VECTOR('',#8818,1.);
+#8818 = DIRECTION('',(1.,0.));
+#8819 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8820 = PCURVE('',#8371,#8821);
+#8821 = DEFINITIONAL_REPRESENTATION('',(#8822),#8826);
+#8822 = LINE('',#8823,#8824);
+#8823 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#8824 = VECTOR('',#8825,1.);
+#8825 = DIRECTION('',(0.,1.));
+#8826 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8827 = ADVANCED_FACE('',(#8828),#8293,.T.);
+#8828 = FACE_BOUND('',#8829,.T.);
+#8829 = EDGE_LOOP('',(#8830,#8831,#8852,#8853));
+#8830 = ORIENTED_EDGE('',*,*,#8275,.F.);
+#8831 = ORIENTED_EDGE('',*,*,#8832,.T.);
+#8832 = EDGE_CURVE('',#8276,#8542,#8833,.T.);
+#8833 = SURFACE_CURVE('',#8834,(#8838,#8845),.PCURVE_S1.);
+#8834 = LINE('',#8835,#8836);
+#8835 = CARTESIAN_POINT('',(-3.175,0.72,2.56));
+#8836 = VECTOR('',#8837,1.);
+#8837 = DIRECTION('',(0.,1.,0.));
+#8838 = PCURVE('',#8293,#8839);
+#8839 = DEFINITIONAL_REPRESENTATION('',(#8840),#8844);
+#8840 = LINE('',#8841,#8842);
+#8841 = CARTESIAN_POINT('',(-0.55,-0.38625));
+#8842 = VECTOR('',#8843,1.);
+#8843 = DIRECTION('',(1.,6.285707653525E-60));
+#8844 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8845 = PCURVE('',#8425,#8846);
+#8846 = DEFINITIONAL_REPRESENTATION('',(#8847),#8851);
+#8847 = LINE('',#8848,#8849);
+#8848 = CARTESIAN_POINT('',(0.275,0.));
+#8849 = VECTOR('',#8850,1.);
+#8850 = DIRECTION('',(0.,-1.));
+#8851 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8852 = ORIENTED_EDGE('',*,*,#8541,.F.);
+#8853 = ORIENTED_EDGE('',*,*,#8464,.T.);
+#8854 = ADVANCED_FACE('',(#8855),#8425,.T.);
+#8855 = FACE_BOUND('',#8856,.T.);
+#8856 = EDGE_LOOP('',(#8857,#8858,#8879,#8880));
+#8857 = ORIENTED_EDGE('',*,*,#8411,.F.);
+#8858 = ORIENTED_EDGE('',*,*,#8859,.T.);
+#8859 = EDGE_CURVE('',#8384,#8565,#8860,.T.);
+#8860 = SURFACE_CURVE('',#8861,(#8865,#8872),.PCURVE_S1.);
+#8861 = LINE('',#8862,#8863);
+#8862 = CARTESIAN_POINT('',(-3.175,0.72,2.285));
+#8863 = VECTOR('',#8864,1.);
+#8864 = DIRECTION('',(0.,1.,0.));
+#8865 = PCURVE('',#8425,#8866);
+#8866 = DEFINITIONAL_REPRESENTATION('',(#8867),#8871);
+#8867 = LINE('',#8868,#8869);
+#8868 = CARTESIAN_POINT('',(0.,0.));
+#8869 = VECTOR('',#8870,1.);
+#8870 = DIRECTION('',(0.,-1.));
+#8871 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8872 = PCURVE('',#8399,#8873);
+#8873 = DEFINITIONAL_REPRESENTATION('',(#8874),#8878);
+#8874 = LINE('',#8875,#8876);
+#8875 = CARTESIAN_POINT('',(0.4975,0.));
+#8876 = VECTOR('',#8877,1.);
+#8877 = DIRECTION('',(0.,1.));
+#8878 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8879 = ORIENTED_EDGE('',*,*,#8564,.T.);
+#8880 = ORIENTED_EDGE('',*,*,#8832,.F.);
+#8881 = ADVANCED_FACE('',(#8882),#8399,.F.);
+#8882 = FACE_BOUND('',#8883,.F.);
+#8883 = EDGE_LOOP('',(#8884,#8905,#8906,#8907));
+#8884 = ORIENTED_EDGE('',*,*,#8885,.F.);
+#8885 = EDGE_CURVE('',#8356,#8588,#8886,.T.);
+#8886 = SURFACE_CURVE('',#8887,(#8891,#8898),.PCURVE_S1.);
+#8887 = LINE('',#8888,#8889);
+#8888 = CARTESIAN_POINT('',(-3.6725,0.72,2.285));
+#8889 = VECTOR('',#8890,1.);
+#8890 = DIRECTION('',(0.,1.,0.));
+#8891 = PCURVE('',#8399,#8892);
+#8892 = DEFINITIONAL_REPRESENTATION('',(#8893),#8897);
+#8893 = LINE('',#8894,#8895);
+#8894 = CARTESIAN_POINT('',(0.,0.));
+#8895 = VECTOR('',#8896,1.);
+#8896 = DIRECTION('',(0.,1.));
+#8897 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8898 = PCURVE('',#8371,#8899);
+#8899 = DEFINITIONAL_REPRESENTATION('',(#8900),#8904);
+#8900 = LINE('',#8901,#8902);
+#8901 = CARTESIAN_POINT('',(-0.55,2.62605853382));
+#8902 = VECTOR('',#8903,1.);
+#8903 = DIRECTION('',(1.,-2.226071387182E-62));
+#8904 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8905 = ORIENTED_EDGE('',*,*,#8383,.T.);
+#8906 = ORIENTED_EDGE('',*,*,#8859,.T.);
+#8907 = ORIENTED_EDGE('',*,*,#8587,.F.);
+#8908 = ADVANCED_FACE('',(#8909),#8371,.T.);
+#8909 = FACE_BOUND('',#8910,.T.);
+#8910 = EDGE_LOOP('',(#8911,#8912,#8913,#8914,#8915,#8916,#8917,#8918));
+#8911 = ORIENTED_EDGE('',*,*,#8610,.T.);
+#8912 = ORIENTED_EDGE('',*,*,#8885,.F.);
+#8913 = ORIENTED_EDGE('',*,*,#8355,.T.);
+#8914 = ORIENTED_EDGE('',*,*,#8515,.T.);
+#8915 = ORIENTED_EDGE('',*,*,#8682,.T.);
+#8916 = ORIENTED_EDGE('',*,*,#8780,.T.);
+#8917 = ORIENTED_EDGE('',*,*,#8807,.T.);
+#8918 = ORIENTED_EDGE('',*,*,#8731,.T.);
+#8919 = MANIFOLD_SOLID_BREP('',#8920);
+#8920 = CLOSED_SHELL('',(#8921,#9153,#9318,#9368,#9417,#9535,#9584,#9633
+ ,#9682,#9709,#9736,#9763,#9790));
+#8921 = ADVANCED_FACE('',(#8922),#8936,.F.);
+#8922 = FACE_BOUND('',#8923,.F.);
+#8923 = EDGE_LOOP('',(#8924,#8959,#8987,#9015,#9043,#9071,#9099,#9127));
+#8924 = ORIENTED_EDGE('',*,*,#8925,.T.);
+#8925 = EDGE_CURVE('',#8926,#8928,#8930,.T.);
+#8926 = VERTEX_POINT('',#8927);
+#8927 = CARTESIAN_POINT('',(3.9475,1.82,2.4225));
+#8928 = VERTEX_POINT('',#8929);
+#8929 = CARTESIAN_POINT('',(3.9475,1.82,0.275));
+#8930 = SURFACE_CURVE('',#8931,(#8935,#8947),.PCURVE_S1.);
+#8931 = LINE('',#8932,#8933);
+#8932 = CARTESIAN_POINT('',(3.9475,1.82,2.56));
+#8933 = VECTOR('',#8934,1.);
+#8934 = DIRECTION('',(0.,0.,-1.));
+#8935 = PCURVE('',#8936,#8941);
+#8936 = PLANE('',#8937);
+#8937 = AXIS2_PLACEMENT_3D('',#8938,#8939,#8940);
+#8938 = CARTESIAN_POINT('',(3.9475,1.27,-0.34105853382));
+#8939 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#8940 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#8941 = DEFINITIONAL_REPRESENTATION('',(#8942),#8946);
+#8942 = LINE('',#8943,#8944);
+#8943 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#8944 = VECTOR('',#8945,1.);
+#8945 = DIRECTION('',(0.,-1.));
+#8946 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8947 = PCURVE('',#8948,#8953);
+#8948 = PLANE('',#8949);
+#8949 = AXIS2_PLACEMENT_3D('',#8950,#8951,#8952);
+#8950 = CARTESIAN_POINT('',(3.724778209321,1.82,1.581028209321));
+#8951 = DIRECTION('',(3.17453643318E-29,1.,2.111838454822E-30));
+#8952 = DIRECTION('',(1.,-3.17453643318E-29,0.));
+#8953 = DEFINITIONAL_REPRESENTATION('',(#8954),#8958);
+#8954 = LINE('',#8955,#8956);
+#8955 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#8956 = VECTOR('',#8957,1.);
+#8957 = DIRECTION('',(0.,1.));
+#8958 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8959 = ORIENTED_EDGE('',*,*,#8960,.T.);
+#8960 = EDGE_CURVE('',#8928,#8961,#8963,.T.);
+#8961 = VERTEX_POINT('',#8962);
+#8962 = CARTESIAN_POINT('',(3.9475,1.545,0.));
+#8963 = SURFACE_CURVE('',#8964,(#8968,#8975),.PCURVE_S1.);
+#8964 = LINE('',#8965,#8966);
+#8965 = CARTESIAN_POINT('',(3.9475,1.82,0.275));
+#8966 = VECTOR('',#8967,1.);
+#8967 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#8968 = PCURVE('',#8936,#8969);
+#8969 = DEFINITIONAL_REPRESENTATION('',(#8970),#8974);
+#8970 = LINE('',#8971,#8972);
+#8971 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#8972 = VECTOR('',#8973,1.);
+#8973 = DIRECTION('',(0.707106781187,-0.707106781187));
+#8974 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8975 = PCURVE('',#8976,#8981);
+#8976 = PLANE('',#8977);
+#8977 = AXIS2_PLACEMENT_3D('',#8978,#8979,#8980);
+#8978 = CARTESIAN_POINT('',(3.6725,1.82,0.275));
+#8979 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#8980 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#8981 = DEFINITIONAL_REPRESENTATION('',(#8982),#8986);
+#8982 = LINE('',#8983,#8984);
+#8983 = CARTESIAN_POINT('',(0.,-0.275));
+#8984 = VECTOR('',#8985,1.);
+#8985 = DIRECTION('',(1.,0.));
+#8986 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#8987 = ORIENTED_EDGE('',*,*,#8988,.T.);
+#8988 = EDGE_CURVE('',#8961,#8989,#8991,.T.);
+#8989 = VERTEX_POINT('',#8990);
+#8990 = CARTESIAN_POINT('',(3.9475,1.545,-3.5));
+#8991 = SURFACE_CURVE('',#8992,(#8996,#9003),.PCURVE_S1.);
+#8992 = LINE('',#8993,#8994);
+#8993 = CARTESIAN_POINT('',(3.9475,1.545,0.));
+#8994 = VECTOR('',#8995,1.);
+#8995 = DIRECTION('',(0.,0.,-1.));
+#8996 = PCURVE('',#8936,#8997);
+#8997 = DEFINITIONAL_REPRESENTATION('',(#8998),#9002);
+#8998 = LINE('',#8999,#9000);
+#8999 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#9000 = VECTOR('',#9001,1.);
+#9001 = DIRECTION('',(0.,-1.));
+#9002 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9003 = PCURVE('',#9004,#9009);
+#9004 = PLANE('',#9005);
+#9005 = AXIS2_PLACEMENT_3D('',#9006,#9007,#9008);
+#9006 = CARTESIAN_POINT('',(3.6725,1.545,0.));
+#9007 = DIRECTION('',(0.,1.,0.));
+#9008 = DIRECTION('',(0.,0.,-1.));
+#9009 = DEFINITIONAL_REPRESENTATION('',(#9010),#9014);
+#9010 = LINE('',#9011,#9012);
+#9011 = CARTESIAN_POINT('',(0.,-0.275));
+#9012 = VECTOR('',#9013,1.);
+#9013 = DIRECTION('',(1.,0.));
+#9014 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9015 = ORIENTED_EDGE('',*,*,#9016,.T.);
+#9016 = EDGE_CURVE('',#8989,#9017,#9019,.T.);
+#9017 = VERTEX_POINT('',#9018);
+#9018 = CARTESIAN_POINT('',(3.9475,0.995,-3.5));
+#9019 = SURFACE_CURVE('',#9020,(#9024,#9031),.PCURVE_S1.);
+#9020 = LINE('',#9021,#9022);
+#9021 = CARTESIAN_POINT('',(3.9475,1.545,-3.5));
+#9022 = VECTOR('',#9023,1.);
+#9023 = DIRECTION('',(0.,-1.,0.));
+#9024 = PCURVE('',#8936,#9025);
+#9025 = DEFINITIONAL_REPRESENTATION('',(#9026),#9030);
+#9026 = LINE('',#9027,#9028);
+#9027 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#9028 = VECTOR('',#9029,1.);
+#9029 = DIRECTION('',(1.,2.226071387182E-62));
+#9030 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9031 = PCURVE('',#9032,#9037);
+#9032 = PLANE('',#9033);
+#9033 = AXIS2_PLACEMENT_3D('',#9034,#9035,#9036);
+#9034 = CARTESIAN_POINT('',(3.6725,1.545,-3.5));
+#9035 = DIRECTION('',(0.,0.,-1.));
+#9036 = DIRECTION('',(0.,-1.,0.));
+#9037 = DEFINITIONAL_REPRESENTATION('',(#9038),#9042);
+#9038 = LINE('',#9039,#9040);
+#9039 = CARTESIAN_POINT('',(0.,-0.275));
+#9040 = VECTOR('',#9041,1.);
+#9041 = DIRECTION('',(1.,0.));
+#9042 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9043 = ORIENTED_EDGE('',*,*,#9044,.T.);
+#9044 = EDGE_CURVE('',#9017,#9045,#9047,.T.);
+#9045 = VERTEX_POINT('',#9046);
+#9046 = CARTESIAN_POINT('',(3.9475,0.995,0.));
+#9047 = SURFACE_CURVE('',#9048,(#9052,#9059),.PCURVE_S1.);
+#9048 = LINE('',#9049,#9050);
+#9049 = CARTESIAN_POINT('',(3.9475,0.995,-3.5));
+#9050 = VECTOR('',#9051,1.);
+#9051 = DIRECTION('',(0.,0.,1.));
+#9052 = PCURVE('',#8936,#9053);
+#9053 = DEFINITIONAL_REPRESENTATION('',(#9054),#9058);
+#9054 = LINE('',#9055,#9056);
+#9055 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#9056 = VECTOR('',#9057,1.);
+#9057 = DIRECTION('',(0.,1.));
+#9058 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9059 = PCURVE('',#9060,#9065);
+#9060 = PLANE('',#9061);
+#9061 = AXIS2_PLACEMENT_3D('',#9062,#9063,#9064);
+#9062 = CARTESIAN_POINT('',(3.6725,0.995,-3.5));
+#9063 = DIRECTION('',(0.,-1.,0.));
+#9064 = DIRECTION('',(0.,0.,1.));
+#9065 = DEFINITIONAL_REPRESENTATION('',(#9066),#9070);
+#9066 = LINE('',#9067,#9068);
+#9067 = CARTESIAN_POINT('',(0.,-0.275));
+#9068 = VECTOR('',#9069,1.);
+#9069 = DIRECTION('',(1.,0.));
+#9070 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9071 = ORIENTED_EDGE('',*,*,#9072,.T.);
+#9072 = EDGE_CURVE('',#9045,#9073,#9075,.T.);
+#9073 = VERTEX_POINT('',#9074);
+#9074 = CARTESIAN_POINT('',(3.9475,0.72,0.275));
+#9075 = SURFACE_CURVE('',#9076,(#9080,#9087),.PCURVE_S1.);
+#9076 = LINE('',#9077,#9078);
+#9077 = CARTESIAN_POINT('',(3.9475,0.995,0.));
+#9078 = VECTOR('',#9079,1.);
+#9079 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#9080 = PCURVE('',#8936,#9081);
+#9081 = DEFINITIONAL_REPRESENTATION('',(#9082),#9086);
+#9082 = LINE('',#9083,#9084);
+#9083 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#9084 = VECTOR('',#9085,1.);
+#9085 = DIRECTION('',(0.707106781187,0.707106781187));
+#9086 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9087 = PCURVE('',#9088,#9093);
+#9088 = PLANE('',#9089);
+#9089 = AXIS2_PLACEMENT_3D('',#9090,#9091,#9092);
+#9090 = CARTESIAN_POINT('',(3.6725,0.995,0.));
+#9091 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#9092 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#9093 = DEFINITIONAL_REPRESENTATION('',(#9094),#9098);
+#9094 = LINE('',#9095,#9096);
+#9095 = CARTESIAN_POINT('',(0.,-0.275));
+#9096 = VECTOR('',#9097,1.);
+#9097 = DIRECTION('',(1.,0.));
+#9098 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9099 = ORIENTED_EDGE('',*,*,#9100,.T.);
+#9100 = EDGE_CURVE('',#9073,#9101,#9103,.T.);
+#9101 = VERTEX_POINT('',#9102);
+#9102 = CARTESIAN_POINT('',(3.9475,0.72,2.4225));
+#9103 = SURFACE_CURVE('',#9104,(#9108,#9115),.PCURVE_S1.);
+#9104 = LINE('',#9105,#9106);
+#9105 = CARTESIAN_POINT('',(3.9475,0.72,0.275));
+#9106 = VECTOR('',#9107,1.);
+#9107 = DIRECTION('',(0.,0.,1.));
+#9108 = PCURVE('',#8936,#9109);
+#9109 = DEFINITIONAL_REPRESENTATION('',(#9110),#9114);
+#9110 = LINE('',#9111,#9112);
+#9111 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#9112 = VECTOR('',#9113,1.);
+#9113 = DIRECTION('',(0.,1.));
+#9114 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9115 = PCURVE('',#9116,#9121);
+#9116 = PLANE('',#9117);
+#9117 = AXIS2_PLACEMENT_3D('',#9118,#9119,#9120);
+#9118 = CARTESIAN_POINT('',(3.724778209321,0.72,1.581028209321));
+#9119 = DIRECTION('',(1.308440111004E-29,-1.,1.156108129756E-30));
+#9120 = DIRECTION('',(-1.,-1.308440111004E-29,0.));
+#9121 = DEFINITIONAL_REPRESENTATION('',(#9122),#9126);
+#9122 = LINE('',#9123,#9124);
+#9123 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#9124 = VECTOR('',#9125,1.);
+#9125 = DIRECTION('',(0.,-1.));
+#9126 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9127 = ORIENTED_EDGE('',*,*,#9128,.T.);
+#9128 = EDGE_CURVE('',#9101,#8926,#9129,.T.);
+#9129 = SURFACE_CURVE('',#9130,(#9134,#9141),.PCURVE_S1.);
+#9130 = LINE('',#9131,#9132);
+#9131 = CARTESIAN_POINT('',(3.9475,0.72,2.4225));
+#9132 = VECTOR('',#9133,1.);
+#9133 = DIRECTION('',(0.,1.,0.));
+#9134 = PCURVE('',#8936,#9135);
+#9135 = DEFINITIONAL_REPRESENTATION('',(#9136),#9140);
+#9136 = LINE('',#9137,#9138);
+#9137 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#9138 = VECTOR('',#9139,1.);
+#9139 = DIRECTION('',(-1.,-2.226071387182E-62));
+#9140 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9141 = PCURVE('',#9142,#9147);
+#9142 = CYLINDRICAL_SURFACE('',#9143,0.1375);
+#9143 = AXIS2_PLACEMENT_3D('',#9144,#9145,#9146);
+#9144 = CARTESIAN_POINT('',(3.81,0.72,2.4225));
+#9145 = DIRECTION('',(0.,1.,0.));
+#9146 = DIRECTION('',(1.,0.,-9.8088568672E-33));
+#9147 = DEFINITIONAL_REPRESENTATION('',(#9148),#9152);
+#9148 = LINE('',#9149,#9150);
+#9149 = CARTESIAN_POINT('',(-0.,0.));
+#9150 = VECTOR('',#9151,1.);
+#9151 = DIRECTION('',(-0.,1.));
+#9152 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9153 = ADVANCED_FACE('',(#9154),#8948,.T.);
+#9154 = FACE_BOUND('',#9155,.T.);
+#9155 = EDGE_LOOP('',(#9156,#9186,#9212,#9213,#9236,#9264,#9292));
+#9156 = ORIENTED_EDGE('',*,*,#9157,.T.);
+#9157 = EDGE_CURVE('',#9158,#9160,#9162,.T.);
+#9158 = VERTEX_POINT('',#9159);
+#9159 = CARTESIAN_POINT('',(3.175,1.82,2.56));
+#9160 = VERTEX_POINT('',#9161);
+#9161 = CARTESIAN_POINT('',(3.81,1.82,2.56));
+#9162 = SURFACE_CURVE('',#9163,(#9167,#9174),.PCURVE_S1.);
+#9163 = LINE('',#9164,#9165);
+#9164 = CARTESIAN_POINT('',(3.6725,1.82,2.56));
+#9165 = VECTOR('',#9166,1.);
+#9166 = DIRECTION('',(1.,0.,0.));
+#9167 = PCURVE('',#8948,#9168);
+#9168 = DEFINITIONAL_REPRESENTATION('',(#9169),#9173);
+#9169 = LINE('',#9170,#9171);
+#9170 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#9171 = VECTOR('',#9172,1.);
+#9172 = DIRECTION('',(1.,6.704108115824E-59));
+#9173 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9174 = PCURVE('',#9175,#9180);
+#9175 = PLANE('',#9176);
+#9176 = AXIS2_PLACEMENT_3D('',#9177,#9178,#9179);
+#9177 = CARTESIAN_POINT('',(3.56125,1.27,2.56));
+#9178 = DIRECTION('',(-1.657312278749E-30,-1.304555144269E-30,1.));
+#9179 = DIRECTION('',(1.,0.,1.657312278749E-30));
+#9180 = DEFINITIONAL_REPRESENTATION('',(#9181),#9185);
+#9181 = LINE('',#9182,#9183);
+#9182 = CARTESIAN_POINT('',(0.11125,0.55));
+#9183 = VECTOR('',#9184,1.);
+#9184 = DIRECTION('',(1.,-2.162055258902E-60));
+#9185 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9186 = ORIENTED_EDGE('',*,*,#9187,.F.);
+#9187 = EDGE_CURVE('',#8926,#9160,#9188,.T.);
+#9188 = SURFACE_CURVE('',#9189,(#9194,#9205),.PCURVE_S1.);
+#9189 = CIRCLE('',#9190,0.1375);
+#9190 = AXIS2_PLACEMENT_3D('',#9191,#9192,#9193);
+#9191 = CARTESIAN_POINT('',(3.81,1.82,2.4225));
+#9192 = DIRECTION('',(0.,-1.,0.));
+#9193 = DIRECTION('',(0.,0.,1.));
+#9194 = PCURVE('',#8948,#9195);
+#9195 = DEFINITIONAL_REPRESENTATION('',(#9196),#9204);
+#9196 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#9197,#9198,#9199,#9200,
+#9201,#9202,#9203),.UNSPECIFIED.,.F.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2
+ ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786,
+6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE()
+GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,
+1.,0.5,1.)) REPRESENTATION_ITEM('') );
+#9197 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#9198 = CARTESIAN_POINT('',(-0.152935195362,-0.978971790679));
+#9199 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.772721790679));
+#9200 = CARTESIAN_POINT('',(8.522179067866E-02,-0.566471790679));
+#9201 = CARTESIAN_POINT('',(0.204300283699,-0.772721790679));
+#9202 = CARTESIAN_POINT('',(0.323378776719,-0.978971790679));
+#9203 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#9204 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9205 = PCURVE('',#9142,#9206);
+#9206 = DEFINITIONAL_REPRESENTATION('',(#9207),#9211);
+#9207 = LINE('',#9208,#9209);
+#9208 = CARTESIAN_POINT('',(4.712388980385,1.1));
+#9209 = VECTOR('',#9210,1.);
+#9210 = DIRECTION('',(-1.,0.));
+#9211 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9212 = ORIENTED_EDGE('',*,*,#8925,.T.);
+#9213 = ORIENTED_EDGE('',*,*,#9214,.F.);
+#9214 = EDGE_CURVE('',#9215,#8928,#9217,.T.);
+#9215 = VERTEX_POINT('',#9216);
+#9216 = CARTESIAN_POINT('',(3.6725,1.82,0.275));
+#9217 = SURFACE_CURVE('',#9218,(#9222,#9229),.PCURVE_S1.);
+#9218 = LINE('',#9219,#9220);
+#9219 = CARTESIAN_POINT('',(3.6725,1.82,0.275));
+#9220 = VECTOR('',#9221,1.);
+#9221 = DIRECTION('',(1.,0.,0.));
+#9222 = PCURVE('',#8948,#9223);
+#9223 = DEFINITIONAL_REPRESENTATION('',(#9224),#9228);
+#9224 = LINE('',#9225,#9226);
+#9225 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#9226 = VECTOR('',#9227,1.);
+#9227 = DIRECTION('',(1.,6.704108115824E-59));
+#9228 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9229 = PCURVE('',#8976,#9230);
+#9230 = DEFINITIONAL_REPRESENTATION('',(#9231),#9235);
+#9231 = LINE('',#9232,#9233);
+#9232 = CARTESIAN_POINT('',(4.710277376051E-16,0.));
+#9233 = VECTOR('',#9234,1.);
+#9234 = DIRECTION('',(0.,-1.));
+#9235 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9236 = ORIENTED_EDGE('',*,*,#9237,.F.);
+#9237 = EDGE_CURVE('',#9238,#9215,#9240,.T.);
+#9238 = VERTEX_POINT('',#9239);
+#9239 = CARTESIAN_POINT('',(3.6725,1.82,2.285));
+#9240 = SURFACE_CURVE('',#9241,(#9245,#9252),.PCURVE_S1.);
+#9241 = LINE('',#9242,#9243);
+#9242 = CARTESIAN_POINT('',(3.6725,1.82,2.56));
+#9243 = VECTOR('',#9244,1.);
+#9244 = DIRECTION('',(0.,0.,-1.));
+#9245 = PCURVE('',#8948,#9246);
+#9246 = DEFINITIONAL_REPRESENTATION('',(#9247),#9251);
+#9247 = LINE('',#9248,#9249);
+#9248 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#9249 = VECTOR('',#9250,1.);
+#9250 = DIRECTION('',(0.,1.));
+#9251 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9252 = PCURVE('',#9253,#9258);
+#9253 = PLANE('',#9254);
+#9254 = AXIS2_PLACEMENT_3D('',#9255,#9256,#9257);
+#9255 = CARTESIAN_POINT('',(3.6725,1.27,-0.34105853382));
+#9256 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#9257 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#9258 = DEFINITIONAL_REPRESENTATION('',(#9259),#9263);
+#9259 = LINE('',#9260,#9261);
+#9260 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#9261 = VECTOR('',#9262,1.);
+#9262 = DIRECTION('',(0.,-1.));
+#9263 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9264 = ORIENTED_EDGE('',*,*,#9265,.F.);
+#9265 = EDGE_CURVE('',#9266,#9238,#9268,.T.);
+#9266 = VERTEX_POINT('',#9267);
+#9267 = CARTESIAN_POINT('',(3.175,1.82,2.285));
+#9268 = SURFACE_CURVE('',#9269,(#9273,#9280),.PCURVE_S1.);
+#9269 = LINE('',#9270,#9271);
+#9270 = CARTESIAN_POINT('',(3.175,1.82,2.285));
+#9271 = VECTOR('',#9272,1.);
+#9272 = DIRECTION('',(1.,0.,0.));
+#9273 = PCURVE('',#8948,#9274);
+#9274 = DEFINITIONAL_REPRESENTATION('',(#9275),#9279);
+#9275 = LINE('',#9276,#9277);
+#9276 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#9277 = VECTOR('',#9278,1.);
+#9278 = DIRECTION('',(1.,6.704108115824E-59));
+#9279 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9280 = PCURVE('',#9281,#9286);
+#9281 = PLANE('',#9282);
+#9282 = AXIS2_PLACEMENT_3D('',#9283,#9284,#9285);
+#9283 = CARTESIAN_POINT('',(3.175,0.72,2.285));
+#9284 = DIRECTION('',(0.,0.,1.));
+#9285 = DIRECTION('',(1.,0.,0.));
+#9286 = DEFINITIONAL_REPRESENTATION('',(#9287),#9291);
+#9287 = LINE('',#9288,#9289);
+#9288 = CARTESIAN_POINT('',(0.,1.1));
+#9289 = VECTOR('',#9290,1.);
+#9290 = DIRECTION('',(1.,0.));
+#9291 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9292 = ORIENTED_EDGE('',*,*,#9293,.T.);
+#9293 = EDGE_CURVE('',#9266,#9158,#9294,.T.);
+#9294 = SURFACE_CURVE('',#9295,(#9299,#9306),.PCURVE_S1.);
+#9295 = LINE('',#9296,#9297);
+#9296 = CARTESIAN_POINT('',(3.175,1.82,2.285));
+#9297 = VECTOR('',#9298,1.);
+#9298 = DIRECTION('',(0.,0.,1.));
+#9299 = PCURVE('',#8948,#9300);
+#9300 = DEFINITIONAL_REPRESENTATION('',(#9301),#9305);
+#9301 = LINE('',#9302,#9303);
+#9302 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#9303 = VECTOR('',#9304,1.);
+#9304 = DIRECTION('',(0.,-1.));
+#9305 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9306 = PCURVE('',#9307,#9312);
+#9307 = PLANE('',#9308);
+#9308 = AXIS2_PLACEMENT_3D('',#9309,#9310,#9311);
+#9309 = CARTESIAN_POINT('',(3.175,0.72,2.285));
+#9310 = DIRECTION('',(1.,0.,0.));
+#9311 = DIRECTION('',(0.,0.,1.));
+#9312 = DEFINITIONAL_REPRESENTATION('',(#9313),#9317);
+#9313 = LINE('',#9314,#9315);
+#9314 = CARTESIAN_POINT('',(0.,-1.1));
+#9315 = VECTOR('',#9316,1.);
+#9316 = DIRECTION('',(1.,0.));
+#9317 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9318 = ADVANCED_FACE('',(#9319),#9142,.T.);
+#9319 = FACE_BOUND('',#9320,.F.);
+#9320 = EDGE_LOOP('',(#9321,#9345,#9366,#9367));
+#9321 = ORIENTED_EDGE('',*,*,#9322,.T.);
+#9322 = EDGE_CURVE('',#9101,#9323,#9325,.T.);
+#9323 = VERTEX_POINT('',#9324);
+#9324 = CARTESIAN_POINT('',(3.81,0.72,2.56));
+#9325 = SURFACE_CURVE('',#9326,(#9331,#9338),.PCURVE_S1.);
+#9326 = CIRCLE('',#9327,0.1375);
+#9327 = AXIS2_PLACEMENT_3D('',#9328,#9329,#9330);
+#9328 = CARTESIAN_POINT('',(3.81,0.72,2.4225));
+#9329 = DIRECTION('',(0.,-1.,0.));
+#9330 = DIRECTION('',(0.,0.,1.));
+#9331 = PCURVE('',#9142,#9332);
+#9332 = DEFINITIONAL_REPRESENTATION('',(#9333),#9337);
+#9333 = LINE('',#9334,#9335);
+#9334 = CARTESIAN_POINT('',(4.712388980385,-1.7763568394E-15));
+#9335 = VECTOR('',#9336,1.);
+#9336 = DIRECTION('',(-1.,0.));
+#9337 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9338 = PCURVE('',#9116,#9339);
+#9339 = DEFINITIONAL_REPRESENTATION('',(#9340),#9344);
+#9340 = CIRCLE('',#9341,0.1375);
+#9341 = AXIS2_PLACEMENT_2D('',#9342,#9343);
+#9342 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#9343 = DIRECTION('',(0.,-1.));
+#9344 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9345 = ORIENTED_EDGE('',*,*,#9346,.T.);
+#9346 = EDGE_CURVE('',#9323,#9160,#9347,.T.);
+#9347 = SURFACE_CURVE('',#9348,(#9352,#9359),.PCURVE_S1.);
+#9348 = LINE('',#9349,#9350);
+#9349 = CARTESIAN_POINT('',(3.81,0.72,2.56));
+#9350 = VECTOR('',#9351,1.);
+#9351 = DIRECTION('',(0.,1.,0.));
+#9352 = PCURVE('',#9142,#9353);
+#9353 = DEFINITIONAL_REPRESENTATION('',(#9354),#9358);
+#9354 = LINE('',#9355,#9356);
+#9355 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#9356 = VECTOR('',#9357,1.);
+#9357 = DIRECTION('',(-0.,1.));
+#9358 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9359 = PCURVE('',#9175,#9360);
+#9360 = DEFINITIONAL_REPRESENTATION('',(#9361),#9365);
+#9361 = LINE('',#9362,#9363);
+#9362 = CARTESIAN_POINT('',(0.24875,-0.55));
+#9363 = VECTOR('',#9364,1.);
+#9364 = DIRECTION('',(0.,1.));
+#9365 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9366 = ORIENTED_EDGE('',*,*,#9187,.F.);
+#9367 = ORIENTED_EDGE('',*,*,#9128,.F.);
+#9368 = ADVANCED_FACE('',(#9369),#8976,.T.);
+#9369 = FACE_BOUND('',#9370,.T.);
+#9370 = EDGE_LOOP('',(#9371,#9372,#9373,#9396));
+#9371 = ORIENTED_EDGE('',*,*,#9214,.T.);
+#9372 = ORIENTED_EDGE('',*,*,#8960,.T.);
+#9373 = ORIENTED_EDGE('',*,*,#9374,.F.);
+#9374 = EDGE_CURVE('',#9375,#8961,#9377,.T.);
+#9375 = VERTEX_POINT('',#9376);
+#9376 = CARTESIAN_POINT('',(3.6725,1.545,0.));
+#9377 = SURFACE_CURVE('',#9378,(#9382,#9389),.PCURVE_S1.);
+#9378 = LINE('',#9379,#9380);
+#9379 = CARTESIAN_POINT('',(3.6725,1.545,0.));
+#9380 = VECTOR('',#9381,1.);
+#9381 = DIRECTION('',(1.,0.,0.));
+#9382 = PCURVE('',#8976,#9383);
+#9383 = DEFINITIONAL_REPRESENTATION('',(#9384),#9388);
+#9384 = LINE('',#9385,#9386);
+#9385 = CARTESIAN_POINT('',(0.388908729653,0.));
+#9386 = VECTOR('',#9387,1.);
+#9387 = DIRECTION('',(0.,-1.));
+#9388 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9389 = PCURVE('',#9004,#9390);
+#9390 = DEFINITIONAL_REPRESENTATION('',(#9391),#9395);
+#9391 = LINE('',#9392,#9393);
+#9392 = CARTESIAN_POINT('',(0.,0.));
+#9393 = VECTOR('',#9394,1.);
+#9394 = DIRECTION('',(0.,-1.));
+#9395 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9396 = ORIENTED_EDGE('',*,*,#9397,.F.);
+#9397 = EDGE_CURVE('',#9215,#9375,#9398,.T.);
+#9398 = SURFACE_CURVE('',#9399,(#9403,#9410),.PCURVE_S1.);
+#9399 = LINE('',#9400,#9401);
+#9400 = CARTESIAN_POINT('',(3.6725,1.82,0.275));
+#9401 = VECTOR('',#9402,1.);
+#9402 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#9403 = PCURVE('',#8976,#9404);
+#9404 = DEFINITIONAL_REPRESENTATION('',(#9405),#9409);
+#9405 = LINE('',#9406,#9407);
+#9406 = CARTESIAN_POINT('',(0.,0.));
+#9407 = VECTOR('',#9408,1.);
+#9408 = DIRECTION('',(1.,0.));
+#9409 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9410 = PCURVE('',#9253,#9411);
+#9411 = DEFINITIONAL_REPRESENTATION('',(#9412),#9416);
+#9412 = LINE('',#9413,#9414);
+#9413 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#9414 = VECTOR('',#9415,1.);
+#9415 = DIRECTION('',(0.707106781187,-0.707106781187));
+#9416 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9417 = ADVANCED_FACE('',(#9418),#9116,.T.);
+#9418 = FACE_BOUND('',#9419,.T.);
+#9419 = EDGE_LOOP('',(#9420,#9421,#9422,#9445,#9468,#9491,#9514));
+#9420 = ORIENTED_EDGE('',*,*,#9100,.T.);
+#9421 = ORIENTED_EDGE('',*,*,#9322,.T.);
+#9422 = ORIENTED_EDGE('',*,*,#9423,.F.);
+#9423 = EDGE_CURVE('',#9424,#9323,#9426,.T.);
+#9424 = VERTEX_POINT('',#9425);
+#9425 = CARTESIAN_POINT('',(3.175,0.72,2.56));
+#9426 = SURFACE_CURVE('',#9427,(#9431,#9438),.PCURVE_S1.);
+#9427 = LINE('',#9428,#9429);
+#9428 = CARTESIAN_POINT('',(3.6725,0.72,2.56));
+#9429 = VECTOR('',#9430,1.);
+#9430 = DIRECTION('',(1.,0.,0.));
+#9431 = PCURVE('',#9116,#9432);
+#9432 = DEFINITIONAL_REPRESENTATION('',(#9433),#9437);
+#9433 = LINE('',#9434,#9435);
+#9434 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#9435 = VECTOR('',#9436,1.);
+#9436 = DIRECTION('',(-1.,1.51269824963E-59));
+#9437 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9438 = PCURVE('',#9175,#9439);
+#9439 = DEFINITIONAL_REPRESENTATION('',(#9440),#9444);
+#9440 = LINE('',#9441,#9442);
+#9441 = CARTESIAN_POINT('',(0.11125,-0.55));
+#9442 = VECTOR('',#9443,1.);
+#9443 = DIRECTION('',(1.,-2.162055258902E-60));
+#9444 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9445 = ORIENTED_EDGE('',*,*,#9446,.F.);
+#9446 = EDGE_CURVE('',#9447,#9424,#9449,.T.);
+#9447 = VERTEX_POINT('',#9448);
+#9448 = CARTESIAN_POINT('',(3.175,0.72,2.285));
+#9449 = SURFACE_CURVE('',#9450,(#9454,#9461),.PCURVE_S1.);
+#9450 = LINE('',#9451,#9452);
+#9451 = CARTESIAN_POINT('',(3.175,0.72,2.285));
+#9452 = VECTOR('',#9453,1.);
+#9453 = DIRECTION('',(0.,0.,1.));
+#9454 = PCURVE('',#9116,#9455);
+#9455 = DEFINITIONAL_REPRESENTATION('',(#9456),#9460);
+#9456 = LINE('',#9457,#9458);
+#9457 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#9458 = VECTOR('',#9459,1.);
+#9459 = DIRECTION('',(0.,-1.));
+#9460 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9461 = PCURVE('',#9307,#9462);
+#9462 = DEFINITIONAL_REPRESENTATION('',(#9463),#9467);
+#9463 = LINE('',#9464,#9465);
+#9464 = CARTESIAN_POINT('',(0.,0.));
+#9465 = VECTOR('',#9466,1.);
+#9466 = DIRECTION('',(1.,0.));
+#9467 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9468 = ORIENTED_EDGE('',*,*,#9469,.T.);
+#9469 = EDGE_CURVE('',#9447,#9470,#9472,.T.);
+#9470 = VERTEX_POINT('',#9471);
+#9471 = CARTESIAN_POINT('',(3.6725,0.72,2.285));
+#9472 = SURFACE_CURVE('',#9473,(#9477,#9484),.PCURVE_S1.);
+#9473 = LINE('',#9474,#9475);
+#9474 = CARTESIAN_POINT('',(3.175,0.72,2.285));
+#9475 = VECTOR('',#9476,1.);
+#9476 = DIRECTION('',(1.,0.,0.));
+#9477 = PCURVE('',#9116,#9478);
+#9478 = DEFINITIONAL_REPRESENTATION('',(#9479),#9483);
+#9479 = LINE('',#9480,#9481);
+#9480 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#9481 = VECTOR('',#9482,1.);
+#9482 = DIRECTION('',(-1.,1.51269824963E-59));
+#9483 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9484 = PCURVE('',#9281,#9485);
+#9485 = DEFINITIONAL_REPRESENTATION('',(#9486),#9490);
+#9486 = LINE('',#9487,#9488);
+#9487 = CARTESIAN_POINT('',(0.,0.));
+#9488 = VECTOR('',#9489,1.);
+#9489 = DIRECTION('',(1.,0.));
+#9490 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9491 = ORIENTED_EDGE('',*,*,#9492,.F.);
+#9492 = EDGE_CURVE('',#9493,#9470,#9495,.T.);
+#9493 = VERTEX_POINT('',#9494);
+#9494 = CARTESIAN_POINT('',(3.6725,0.72,0.275));
+#9495 = SURFACE_CURVE('',#9496,(#9500,#9507),.PCURVE_S1.);
+#9496 = LINE('',#9497,#9498);
+#9497 = CARTESIAN_POINT('',(3.6725,0.72,0.275));
+#9498 = VECTOR('',#9499,1.);
+#9499 = DIRECTION('',(0.,0.,1.));
+#9500 = PCURVE('',#9116,#9501);
+#9501 = DEFINITIONAL_REPRESENTATION('',(#9502),#9506);
+#9502 = LINE('',#9503,#9504);
+#9503 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#9504 = VECTOR('',#9505,1.);
+#9505 = DIRECTION('',(0.,-1.));
+#9506 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9507 = PCURVE('',#9253,#9508);
+#9508 = DEFINITIONAL_REPRESENTATION('',(#9509),#9513);
+#9509 = LINE('',#9510,#9511);
+#9510 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#9511 = VECTOR('',#9512,1.);
+#9512 = DIRECTION('',(0.,1.));
+#9513 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9514 = ORIENTED_EDGE('',*,*,#9515,.T.);
+#9515 = EDGE_CURVE('',#9493,#9073,#9516,.T.);
+#9516 = SURFACE_CURVE('',#9517,(#9521,#9528),.PCURVE_S1.);
+#9517 = LINE('',#9518,#9519);
+#9518 = CARTESIAN_POINT('',(3.6725,0.72,0.275));
+#9519 = VECTOR('',#9520,1.);
+#9520 = DIRECTION('',(1.,0.,0.));
+#9521 = PCURVE('',#9116,#9522);
+#9522 = DEFINITIONAL_REPRESENTATION('',(#9523),#9527);
+#9523 = LINE('',#9524,#9525);
+#9524 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#9525 = VECTOR('',#9526,1.);
+#9526 = DIRECTION('',(-1.,1.51269824963E-59));
+#9527 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9528 = PCURVE('',#9088,#9529);
+#9529 = DEFINITIONAL_REPRESENTATION('',(#9530),#9534);
+#9530 = LINE('',#9531,#9532);
+#9531 = CARTESIAN_POINT('',(0.388908729653,0.));
+#9532 = VECTOR('',#9533,1.);
+#9533 = DIRECTION('',(0.,-1.));
+#9534 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9535 = ADVANCED_FACE('',(#9536),#9004,.T.);
+#9536 = FACE_BOUND('',#9537,.T.);
+#9537 = EDGE_LOOP('',(#9538,#9539,#9540,#9563));
+#9538 = ORIENTED_EDGE('',*,*,#9374,.T.);
+#9539 = ORIENTED_EDGE('',*,*,#8988,.T.);
+#9540 = ORIENTED_EDGE('',*,*,#9541,.F.);
+#9541 = EDGE_CURVE('',#9542,#8989,#9544,.T.);
+#9542 = VERTEX_POINT('',#9543);
+#9543 = CARTESIAN_POINT('',(3.6725,1.545,-3.5));
+#9544 = SURFACE_CURVE('',#9545,(#9549,#9556),.PCURVE_S1.);
+#9545 = LINE('',#9546,#9547);
+#9546 = CARTESIAN_POINT('',(3.6725,1.545,-3.5));
+#9547 = VECTOR('',#9548,1.);
+#9548 = DIRECTION('',(1.,0.,0.));
+#9549 = PCURVE('',#9004,#9550);
+#9550 = DEFINITIONAL_REPRESENTATION('',(#9551),#9555);
+#9551 = LINE('',#9552,#9553);
+#9552 = CARTESIAN_POINT('',(3.5,0.));
+#9553 = VECTOR('',#9554,1.);
+#9554 = DIRECTION('',(0.,-1.));
+#9555 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9556 = PCURVE('',#9032,#9557);
+#9557 = DEFINITIONAL_REPRESENTATION('',(#9558),#9562);
+#9558 = LINE('',#9559,#9560);
+#9559 = CARTESIAN_POINT('',(7.771561172376E-16,0.));
+#9560 = VECTOR('',#9561,1.);
+#9561 = DIRECTION('',(0.,-1.));
+#9562 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9563 = ORIENTED_EDGE('',*,*,#9564,.F.);
+#9564 = EDGE_CURVE('',#9375,#9542,#9565,.T.);
+#9565 = SURFACE_CURVE('',#9566,(#9570,#9577),.PCURVE_S1.);
+#9566 = LINE('',#9567,#9568);
+#9567 = CARTESIAN_POINT('',(3.6725,1.545,0.));
+#9568 = VECTOR('',#9569,1.);
+#9569 = DIRECTION('',(0.,0.,-1.));
+#9570 = PCURVE('',#9004,#9571);
+#9571 = DEFINITIONAL_REPRESENTATION('',(#9572),#9576);
+#9572 = LINE('',#9573,#9574);
+#9573 = CARTESIAN_POINT('',(0.,0.));
+#9574 = VECTOR('',#9575,1.);
+#9575 = DIRECTION('',(1.,0.));
+#9576 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9577 = PCURVE('',#9253,#9578);
+#9578 = DEFINITIONAL_REPRESENTATION('',(#9579),#9583);
+#9579 = LINE('',#9580,#9581);
+#9580 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#9581 = VECTOR('',#9582,1.);
+#9582 = DIRECTION('',(0.,-1.));
+#9583 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9584 = ADVANCED_FACE('',(#9585),#9088,.T.);
+#9585 = FACE_BOUND('',#9586,.T.);
+#9586 = EDGE_LOOP('',(#9587,#9610,#9611,#9612));
+#9587 = ORIENTED_EDGE('',*,*,#9588,.T.);
+#9588 = EDGE_CURVE('',#9589,#9045,#9591,.T.);
+#9589 = VERTEX_POINT('',#9590);
+#9590 = CARTESIAN_POINT('',(3.6725,0.995,0.));
+#9591 = SURFACE_CURVE('',#9592,(#9596,#9603),.PCURVE_S1.);
+#9592 = LINE('',#9593,#9594);
+#9593 = CARTESIAN_POINT('',(3.6725,0.995,0.));
+#9594 = VECTOR('',#9595,1.);
+#9595 = DIRECTION('',(1.,0.,0.));
+#9596 = PCURVE('',#9088,#9597);
+#9597 = DEFINITIONAL_REPRESENTATION('',(#9598),#9602);
+#9598 = LINE('',#9599,#9600);
+#9599 = CARTESIAN_POINT('',(-1.177569344013E-16,0.));
+#9600 = VECTOR('',#9601,1.);
+#9601 = DIRECTION('',(0.,-1.));
+#9602 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9603 = PCURVE('',#9060,#9604);
+#9604 = DEFINITIONAL_REPRESENTATION('',(#9605),#9609);
+#9605 = LINE('',#9606,#9607);
+#9606 = CARTESIAN_POINT('',(3.5,0.));
+#9607 = VECTOR('',#9608,1.);
+#9608 = DIRECTION('',(0.,-1.));
+#9609 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9610 = ORIENTED_EDGE('',*,*,#9072,.T.);
+#9611 = ORIENTED_EDGE('',*,*,#9515,.F.);
+#9612 = ORIENTED_EDGE('',*,*,#9613,.F.);
+#9613 = EDGE_CURVE('',#9589,#9493,#9614,.T.);
+#9614 = SURFACE_CURVE('',#9615,(#9619,#9626),.PCURVE_S1.);
+#9615 = LINE('',#9616,#9617);
+#9616 = CARTESIAN_POINT('',(3.6725,0.995,0.));
+#9617 = VECTOR('',#9618,1.);
+#9618 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#9619 = PCURVE('',#9088,#9620);
+#9620 = DEFINITIONAL_REPRESENTATION('',(#9621),#9625);
+#9621 = LINE('',#9622,#9623);
+#9622 = CARTESIAN_POINT('',(0.,0.));
+#9623 = VECTOR('',#9624,1.);
+#9624 = DIRECTION('',(1.,0.));
+#9625 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9626 = PCURVE('',#9253,#9627);
+#9627 = DEFINITIONAL_REPRESENTATION('',(#9628),#9632);
+#9628 = LINE('',#9629,#9630);
+#9629 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#9630 = VECTOR('',#9631,1.);
+#9631 = DIRECTION('',(0.707106781187,0.707106781187));
+#9632 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9633 = ADVANCED_FACE('',(#9634),#9032,.T.);
+#9634 = FACE_BOUND('',#9635,.T.);
+#9635 = EDGE_LOOP('',(#9636,#9637,#9638,#9661));
+#9636 = ORIENTED_EDGE('',*,*,#9541,.T.);
+#9637 = ORIENTED_EDGE('',*,*,#9016,.T.);
+#9638 = ORIENTED_EDGE('',*,*,#9639,.F.);
+#9639 = EDGE_CURVE('',#9640,#9017,#9642,.T.);
+#9640 = VERTEX_POINT('',#9641);
+#9641 = CARTESIAN_POINT('',(3.6725,0.995,-3.5));
+#9642 = SURFACE_CURVE('',#9643,(#9647,#9654),.PCURVE_S1.);
+#9643 = LINE('',#9644,#9645);
+#9644 = CARTESIAN_POINT('',(3.6725,0.995,-3.5));
+#9645 = VECTOR('',#9646,1.);
+#9646 = DIRECTION('',(1.,0.,0.));
+#9647 = PCURVE('',#9032,#9648);
+#9648 = DEFINITIONAL_REPRESENTATION('',(#9649),#9653);
+#9649 = LINE('',#9650,#9651);
+#9650 = CARTESIAN_POINT('',(0.55,0.));
+#9651 = VECTOR('',#9652,1.);
+#9652 = DIRECTION('',(0.,-1.));
+#9653 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9654 = PCURVE('',#9060,#9655);
+#9655 = DEFINITIONAL_REPRESENTATION('',(#9656),#9660);
+#9656 = LINE('',#9657,#9658);
+#9657 = CARTESIAN_POINT('',(0.,0.));
+#9658 = VECTOR('',#9659,1.);
+#9659 = DIRECTION('',(0.,-1.));
+#9660 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9661 = ORIENTED_EDGE('',*,*,#9662,.F.);
+#9662 = EDGE_CURVE('',#9542,#9640,#9663,.T.);
+#9663 = SURFACE_CURVE('',#9664,(#9668,#9675),.PCURVE_S1.);
+#9664 = LINE('',#9665,#9666);
+#9665 = CARTESIAN_POINT('',(3.6725,1.545,-3.5));
+#9666 = VECTOR('',#9667,1.);
+#9667 = DIRECTION('',(0.,-1.,0.));
+#9668 = PCURVE('',#9032,#9669);
+#9669 = DEFINITIONAL_REPRESENTATION('',(#9670),#9674);
+#9670 = LINE('',#9671,#9672);
+#9671 = CARTESIAN_POINT('',(0.,-0.));
+#9672 = VECTOR('',#9673,1.);
+#9673 = DIRECTION('',(1.,0.));
+#9674 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9675 = PCURVE('',#9253,#9676);
+#9676 = DEFINITIONAL_REPRESENTATION('',(#9677),#9681);
+#9677 = LINE('',#9678,#9679);
+#9678 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#9679 = VECTOR('',#9680,1.);
+#9680 = DIRECTION('',(1.,2.226071387182E-62));
+#9681 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9682 = ADVANCED_FACE('',(#9683),#9060,.T.);
+#9683 = FACE_BOUND('',#9684,.T.);
+#9684 = EDGE_LOOP('',(#9685,#9686,#9687,#9688));
+#9685 = ORIENTED_EDGE('',*,*,#9639,.T.);
+#9686 = ORIENTED_EDGE('',*,*,#9044,.T.);
+#9687 = ORIENTED_EDGE('',*,*,#9588,.F.);
+#9688 = ORIENTED_EDGE('',*,*,#9689,.F.);
+#9689 = EDGE_CURVE('',#9640,#9589,#9690,.T.);
+#9690 = SURFACE_CURVE('',#9691,(#9695,#9702),.PCURVE_S1.);
+#9691 = LINE('',#9692,#9693);
+#9692 = CARTESIAN_POINT('',(3.6725,0.995,-3.5));
+#9693 = VECTOR('',#9694,1.);
+#9694 = DIRECTION('',(0.,0.,1.));
+#9695 = PCURVE('',#9060,#9696);
+#9696 = DEFINITIONAL_REPRESENTATION('',(#9697),#9701);
+#9697 = LINE('',#9698,#9699);
+#9698 = CARTESIAN_POINT('',(0.,0.));
+#9699 = VECTOR('',#9700,1.);
+#9700 = DIRECTION('',(1.,0.));
+#9701 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9702 = PCURVE('',#9253,#9703);
+#9703 = DEFINITIONAL_REPRESENTATION('',(#9704),#9708);
+#9704 = LINE('',#9705,#9706);
+#9705 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#9706 = VECTOR('',#9707,1.);
+#9707 = DIRECTION('',(0.,1.));
+#9708 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9709 = ADVANCED_FACE('',(#9710),#9175,.T.);
+#9710 = FACE_BOUND('',#9711,.T.);
+#9711 = EDGE_LOOP('',(#9712,#9713,#9714,#9715));
+#9712 = ORIENTED_EDGE('',*,*,#9423,.T.);
+#9713 = ORIENTED_EDGE('',*,*,#9346,.T.);
+#9714 = ORIENTED_EDGE('',*,*,#9157,.F.);
+#9715 = ORIENTED_EDGE('',*,*,#9716,.F.);
+#9716 = EDGE_CURVE('',#9424,#9158,#9717,.T.);
+#9717 = SURFACE_CURVE('',#9718,(#9722,#9729),.PCURVE_S1.);
+#9718 = LINE('',#9719,#9720);
+#9719 = CARTESIAN_POINT('',(3.175,0.72,2.56));
+#9720 = VECTOR('',#9721,1.);
+#9721 = DIRECTION('',(0.,1.,0.));
+#9722 = PCURVE('',#9175,#9723);
+#9723 = DEFINITIONAL_REPRESENTATION('',(#9724),#9728);
+#9724 = LINE('',#9725,#9726);
+#9725 = CARTESIAN_POINT('',(-0.38625,-0.55));
+#9726 = VECTOR('',#9727,1.);
+#9727 = DIRECTION('',(0.,1.));
+#9728 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9729 = PCURVE('',#9307,#9730);
+#9730 = DEFINITIONAL_REPRESENTATION('',(#9731),#9735);
+#9731 = LINE('',#9732,#9733);
+#9732 = CARTESIAN_POINT('',(0.275,0.));
+#9733 = VECTOR('',#9734,1.);
+#9734 = DIRECTION('',(0.,-1.));
+#9735 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9736 = ADVANCED_FACE('',(#9737),#9307,.F.);
+#9737 = FACE_BOUND('',#9738,.F.);
+#9738 = EDGE_LOOP('',(#9739,#9740,#9761,#9762));
+#9739 = ORIENTED_EDGE('',*,*,#9446,.F.);
+#9740 = ORIENTED_EDGE('',*,*,#9741,.T.);
+#9741 = EDGE_CURVE('',#9447,#9266,#9742,.T.);
+#9742 = SURFACE_CURVE('',#9743,(#9747,#9754),.PCURVE_S1.);
+#9743 = LINE('',#9744,#9745);
+#9744 = CARTESIAN_POINT('',(3.175,0.72,2.285));
+#9745 = VECTOR('',#9746,1.);
+#9746 = DIRECTION('',(0.,1.,0.));
+#9747 = PCURVE('',#9307,#9748);
+#9748 = DEFINITIONAL_REPRESENTATION('',(#9749),#9753);
+#9749 = LINE('',#9750,#9751);
+#9750 = CARTESIAN_POINT('',(0.,0.));
+#9751 = VECTOR('',#9752,1.);
+#9752 = DIRECTION('',(0.,-1.));
+#9753 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9754 = PCURVE('',#9281,#9755);
+#9755 = DEFINITIONAL_REPRESENTATION('',(#9756),#9760);
+#9756 = LINE('',#9757,#9758);
+#9757 = CARTESIAN_POINT('',(0.,0.));
+#9758 = VECTOR('',#9759,1.);
+#9759 = DIRECTION('',(0.,1.));
+#9760 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9761 = ORIENTED_EDGE('',*,*,#9293,.T.);
+#9762 = ORIENTED_EDGE('',*,*,#9716,.F.);
+#9763 = ADVANCED_FACE('',(#9764),#9281,.F.);
+#9764 = FACE_BOUND('',#9765,.F.);
+#9765 = EDGE_LOOP('',(#9766,#9767,#9768,#9789));
+#9766 = ORIENTED_EDGE('',*,*,#9741,.F.);
+#9767 = ORIENTED_EDGE('',*,*,#9469,.T.);
+#9768 = ORIENTED_EDGE('',*,*,#9769,.T.);
+#9769 = EDGE_CURVE('',#9470,#9238,#9770,.T.);
+#9770 = SURFACE_CURVE('',#9771,(#9775,#9782),.PCURVE_S1.);
+#9771 = LINE('',#9772,#9773);
+#9772 = CARTESIAN_POINT('',(3.6725,0.72,2.285));
+#9773 = VECTOR('',#9774,1.);
+#9774 = DIRECTION('',(0.,1.,0.));
+#9775 = PCURVE('',#9281,#9776);
+#9776 = DEFINITIONAL_REPRESENTATION('',(#9777),#9781);
+#9777 = LINE('',#9778,#9779);
+#9778 = CARTESIAN_POINT('',(0.4975,0.));
+#9779 = VECTOR('',#9780,1.);
+#9780 = DIRECTION('',(0.,1.));
+#9781 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9782 = PCURVE('',#9253,#9783);
+#9783 = DEFINITIONAL_REPRESENTATION('',(#9784),#9788);
+#9784 = LINE('',#9785,#9786);
+#9785 = CARTESIAN_POINT('',(0.55,2.62605853382));
+#9786 = VECTOR('',#9787,1.);
+#9787 = DIRECTION('',(-1.,-2.226071387182E-62));
+#9788 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9789 = ORIENTED_EDGE('',*,*,#9265,.F.);
+#9790 = ADVANCED_FACE('',(#9791),#9253,.T.);
+#9791 = FACE_BOUND('',#9792,.T.);
+#9792 = EDGE_LOOP('',(#9793,#9794,#9795,#9796,#9797,#9798,#9799,#9800));
+#9793 = ORIENTED_EDGE('',*,*,#9492,.T.);
+#9794 = ORIENTED_EDGE('',*,*,#9769,.T.);
+#9795 = ORIENTED_EDGE('',*,*,#9237,.T.);
+#9796 = ORIENTED_EDGE('',*,*,#9397,.T.);
+#9797 = ORIENTED_EDGE('',*,*,#9564,.T.);
+#9798 = ORIENTED_EDGE('',*,*,#9662,.T.);
+#9799 = ORIENTED_EDGE('',*,*,#9689,.T.);
+#9800 = ORIENTED_EDGE('',*,*,#9613,.T.);
+#9801 = MANIFOLD_SOLID_BREP('',#9802);
+#9802 = CLOSED_SHELL('',(#9803,#10035,#10200,#10250,#10299,#10417,#10466
+ ,#10515,#10564,#10591,#10618,#10645,#10672));
+#9803 = ADVANCED_FACE('',(#9804),#9818,.F.);
+#9804 = FACE_BOUND('',#9805,.F.);
+#9805 = EDGE_LOOP('',(#9806,#9841,#9869,#9897,#9925,#9953,#9981,#10009)
+ );
+#9806 = ORIENTED_EDGE('',*,*,#9807,.T.);
+#9807 = EDGE_CURVE('',#9808,#9810,#9812,.T.);
+#9808 = VERTEX_POINT('',#9809);
+#9809 = CARTESIAN_POINT('',(-3.9475,-1.82,2.4225));
+#9810 = VERTEX_POINT('',#9811);
+#9811 = CARTESIAN_POINT('',(-3.9475,-1.82,0.275));
+#9812 = SURFACE_CURVE('',#9813,(#9817,#9829),.PCURVE_S1.);
+#9813 = LINE('',#9814,#9815);
+#9814 = CARTESIAN_POINT('',(-3.9475,-1.82,2.56));
+#9815 = VECTOR('',#9816,1.);
+#9816 = DIRECTION('',(0.,0.,-1.));
+#9817 = PCURVE('',#9818,#9823);
+#9818 = PLANE('',#9819);
+#9819 = AXIS2_PLACEMENT_3D('',#9820,#9821,#9822);
+#9820 = CARTESIAN_POINT('',(-3.9475,-1.27,-0.34105853382));
+#9821 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#9822 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#9823 = DEFINITIONAL_REPRESENTATION('',(#9824),#9828);
+#9824 = LINE('',#9825,#9826);
+#9825 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#9826 = VECTOR('',#9827,1.);
+#9827 = DIRECTION('',(0.,-1.));
+#9828 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9829 = PCURVE('',#9830,#9835);
+#9830 = PLANE('',#9831);
+#9831 = AXIS2_PLACEMENT_3D('',#9832,#9833,#9834);
+#9832 = CARTESIAN_POINT('',(-3.724778209321,-1.82,1.581028209321));
+#9833 = DIRECTION('',(1.58726821659E-29,-1.,-1.055919227411E-30));
+#9834 = DIRECTION('',(-1.,-1.58726821659E-29,0.));
+#9835 = DEFINITIONAL_REPRESENTATION('',(#9836),#9840);
+#9836 = LINE('',#9837,#9838);
+#9837 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#9838 = VECTOR('',#9839,1.);
+#9839 = DIRECTION('',(0.,1.));
+#9840 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9841 = ORIENTED_EDGE('',*,*,#9842,.T.);
+#9842 = EDGE_CURVE('',#9810,#9843,#9845,.T.);
+#9843 = VERTEX_POINT('',#9844);
+#9844 = CARTESIAN_POINT('',(-3.9475,-1.545,0.));
+#9845 = SURFACE_CURVE('',#9846,(#9850,#9857),.PCURVE_S1.);
+#9846 = LINE('',#9847,#9848);
+#9847 = CARTESIAN_POINT('',(-3.9475,-1.82,0.275));
+#9848 = VECTOR('',#9849,1.);
+#9849 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#9850 = PCURVE('',#9818,#9851);
+#9851 = DEFINITIONAL_REPRESENTATION('',(#9852),#9856);
+#9852 = LINE('',#9853,#9854);
+#9853 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#9854 = VECTOR('',#9855,1.);
+#9855 = DIRECTION('',(0.707106781187,-0.707106781187));
+#9856 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9857 = PCURVE('',#9858,#9863);
+#9858 = PLANE('',#9859);
+#9859 = AXIS2_PLACEMENT_3D('',#9860,#9861,#9862);
+#9860 = CARTESIAN_POINT('',(-3.6725,-1.82,0.275));
+#9861 = DIRECTION('',(-0.,-0.707106781187,-0.707106781187));
+#9862 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#9863 = DEFINITIONAL_REPRESENTATION('',(#9864),#9868);
+#9864 = LINE('',#9865,#9866);
+#9865 = CARTESIAN_POINT('',(0.,-0.275));
+#9866 = VECTOR('',#9867,1.);
+#9867 = DIRECTION('',(1.,0.));
+#9868 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9869 = ORIENTED_EDGE('',*,*,#9870,.T.);
+#9870 = EDGE_CURVE('',#9843,#9871,#9873,.T.);
+#9871 = VERTEX_POINT('',#9872);
+#9872 = CARTESIAN_POINT('',(-3.9475,-1.545,-3.5));
+#9873 = SURFACE_CURVE('',#9874,(#9878,#9885),.PCURVE_S1.);
+#9874 = LINE('',#9875,#9876);
+#9875 = CARTESIAN_POINT('',(-3.9475,-1.545,0.));
+#9876 = VECTOR('',#9877,1.);
+#9877 = DIRECTION('',(0.,0.,-1.));
+#9878 = PCURVE('',#9818,#9879);
+#9879 = DEFINITIONAL_REPRESENTATION('',(#9880),#9884);
+#9880 = LINE('',#9881,#9882);
+#9881 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#9882 = VECTOR('',#9883,1.);
+#9883 = DIRECTION('',(0.,-1.));
+#9884 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9885 = PCURVE('',#9886,#9891);
+#9886 = PLANE('',#9887);
+#9887 = AXIS2_PLACEMENT_3D('',#9888,#9889,#9890);
+#9888 = CARTESIAN_POINT('',(-3.6725,-1.545,0.));
+#9889 = DIRECTION('',(-0.,-1.,-0.));
+#9890 = DIRECTION('',(0.,0.,-1.));
+#9891 = DEFINITIONAL_REPRESENTATION('',(#9892),#9896);
+#9892 = LINE('',#9893,#9894);
+#9893 = CARTESIAN_POINT('',(0.,-0.275));
+#9894 = VECTOR('',#9895,1.);
+#9895 = DIRECTION('',(1.,0.));
+#9896 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9897 = ORIENTED_EDGE('',*,*,#9898,.T.);
+#9898 = EDGE_CURVE('',#9871,#9899,#9901,.T.);
+#9899 = VERTEX_POINT('',#9900);
+#9900 = CARTESIAN_POINT('',(-3.9475,-0.995,-3.5));
+#9901 = SURFACE_CURVE('',#9902,(#9906,#9913),.PCURVE_S1.);
+#9902 = LINE('',#9903,#9904);
+#9903 = CARTESIAN_POINT('',(-3.9475,-1.545,-3.5));
+#9904 = VECTOR('',#9905,1.);
+#9905 = DIRECTION('',(0.,1.,0.));
+#9906 = PCURVE('',#9818,#9907);
+#9907 = DEFINITIONAL_REPRESENTATION('',(#9908),#9912);
+#9908 = LINE('',#9909,#9910);
+#9909 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#9910 = VECTOR('',#9911,1.);
+#9911 = DIRECTION('',(1.,-2.226071387182E-62));
+#9912 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9913 = PCURVE('',#9914,#9919);
+#9914 = PLANE('',#9915);
+#9915 = AXIS2_PLACEMENT_3D('',#9916,#9917,#9918);
+#9916 = CARTESIAN_POINT('',(-3.6725,-1.545,-3.5));
+#9917 = DIRECTION('',(0.,0.,-1.));
+#9918 = DIRECTION('',(0.,1.,0.));
+#9919 = DEFINITIONAL_REPRESENTATION('',(#9920),#9924);
+#9920 = LINE('',#9921,#9922);
+#9921 = CARTESIAN_POINT('',(0.,-0.275));
+#9922 = VECTOR('',#9923,1.);
+#9923 = DIRECTION('',(1.,0.));
+#9924 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9925 = ORIENTED_EDGE('',*,*,#9926,.T.);
+#9926 = EDGE_CURVE('',#9899,#9927,#9929,.T.);
+#9927 = VERTEX_POINT('',#9928);
+#9928 = CARTESIAN_POINT('',(-3.9475,-0.995,0.));
+#9929 = SURFACE_CURVE('',#9930,(#9934,#9941),.PCURVE_S1.);
+#9930 = LINE('',#9931,#9932);
+#9931 = CARTESIAN_POINT('',(-3.9475,-0.995,-3.5));
+#9932 = VECTOR('',#9933,1.);
+#9933 = DIRECTION('',(0.,0.,1.));
+#9934 = PCURVE('',#9818,#9935);
+#9935 = DEFINITIONAL_REPRESENTATION('',(#9936),#9940);
+#9936 = LINE('',#9937,#9938);
+#9937 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#9938 = VECTOR('',#9939,1.);
+#9939 = DIRECTION('',(0.,1.));
+#9940 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9941 = PCURVE('',#9942,#9947);
+#9942 = PLANE('',#9943);
+#9943 = AXIS2_PLACEMENT_3D('',#9944,#9945,#9946);
+#9944 = CARTESIAN_POINT('',(-3.6725,-0.995,-3.5));
+#9945 = DIRECTION('',(0.,1.,0.));
+#9946 = DIRECTION('',(0.,0.,1.));
+#9947 = DEFINITIONAL_REPRESENTATION('',(#9948),#9952);
+#9948 = LINE('',#9949,#9950);
+#9949 = CARTESIAN_POINT('',(0.,-0.275));
+#9950 = VECTOR('',#9951,1.);
+#9951 = DIRECTION('',(1.,0.));
+#9952 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9953 = ORIENTED_EDGE('',*,*,#9954,.T.);
+#9954 = EDGE_CURVE('',#9927,#9955,#9957,.T.);
+#9955 = VERTEX_POINT('',#9956);
+#9956 = CARTESIAN_POINT('',(-3.9475,-0.72,0.275));
+#9957 = SURFACE_CURVE('',#9958,(#9962,#9969),.PCURVE_S1.);
+#9958 = LINE('',#9959,#9960);
+#9959 = CARTESIAN_POINT('',(-3.9475,-0.995,0.));
+#9960 = VECTOR('',#9961,1.);
+#9961 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#9962 = PCURVE('',#9818,#9963);
+#9963 = DEFINITIONAL_REPRESENTATION('',(#9964),#9968);
+#9964 = LINE('',#9965,#9966);
+#9965 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#9966 = VECTOR('',#9967,1.);
+#9967 = DIRECTION('',(0.707106781187,0.707106781187));
+#9968 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9969 = PCURVE('',#9970,#9975);
+#9970 = PLANE('',#9971);
+#9971 = AXIS2_PLACEMENT_3D('',#9972,#9973,#9974);
+#9972 = CARTESIAN_POINT('',(-3.6725,-0.995,0.));
+#9973 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#9974 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#9975 = DEFINITIONAL_REPRESENTATION('',(#9976),#9980);
+#9976 = LINE('',#9977,#9978);
+#9977 = CARTESIAN_POINT('',(0.,-0.275));
+#9978 = VECTOR('',#9979,1.);
+#9979 = DIRECTION('',(1.,0.));
+#9980 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9981 = ORIENTED_EDGE('',*,*,#9982,.T.);
+#9982 = EDGE_CURVE('',#9955,#9983,#9985,.T.);
+#9983 = VERTEX_POINT('',#9984);
+#9984 = CARTESIAN_POINT('',(-3.9475,-0.72,2.4225));
+#9985 = SURFACE_CURVE('',#9986,(#9990,#9997),.PCURVE_S1.);
+#9986 = LINE('',#9987,#9988);
+#9987 = CARTESIAN_POINT('',(-3.9475,-0.72,0.275));
+#9988 = VECTOR('',#9989,1.);
+#9989 = DIRECTION('',(0.,0.,1.));
+#9990 = PCURVE('',#9818,#9991);
+#9991 = DEFINITIONAL_REPRESENTATION('',(#9992),#9996);
+#9992 = LINE('',#9993,#9994);
+#9993 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#9994 = VECTOR('',#9995,1.);
+#9995 = DIRECTION('',(0.,1.));
+#9996 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#9997 = PCURVE('',#9998,#10003);
+#9998 = PLANE('',#9999);
+#9999 = AXIS2_PLACEMENT_3D('',#10000,#10001,#10002);
+#10000 = CARTESIAN_POINT('',(-3.724778209321,-0.72,1.581028209321));
+#10001 = DIRECTION('',(2.616880222009E-29,1.,-2.312216259511E-30));
+#10002 = DIRECTION('',(1.,-2.616880222009E-29,0.));
+#10003 = DEFINITIONAL_REPRESENTATION('',(#10004),#10008);
+#10004 = LINE('',#10005,#10006);
+#10005 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#10006 = VECTOR('',#10007,1.);
+#10007 = DIRECTION('',(0.,-1.));
+#10008 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10009 = ORIENTED_EDGE('',*,*,#10010,.T.);
+#10010 = EDGE_CURVE('',#9983,#9808,#10011,.T.);
+#10011 = SURFACE_CURVE('',#10012,(#10016,#10023),.PCURVE_S1.);
+#10012 = LINE('',#10013,#10014);
+#10013 = CARTESIAN_POINT('',(-3.9475,-0.72,2.4225));
+#10014 = VECTOR('',#10015,1.);
+#10015 = DIRECTION('',(0.,-1.,0.));
+#10016 = PCURVE('',#9818,#10017);
+#10017 = DEFINITIONAL_REPRESENTATION('',(#10018),#10022);
+#10018 = LINE('',#10019,#10020);
+#10019 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#10020 = VECTOR('',#10021,1.);
+#10021 = DIRECTION('',(-1.,2.226071387182E-62));
+#10022 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10023 = PCURVE('',#10024,#10029);
+#10024 = CYLINDRICAL_SURFACE('',#10025,0.1375);
+#10025 = AXIS2_PLACEMENT_3D('',#10026,#10027,#10028);
+#10026 = CARTESIAN_POINT('',(-3.81,-0.72,2.4225));
+#10027 = DIRECTION('',(0.,-1.,0.));
+#10028 = DIRECTION('',(-1.,-0.,-9.8088568672E-33));
+#10029 = DEFINITIONAL_REPRESENTATION('',(#10030),#10034);
+#10030 = LINE('',#10031,#10032);
+#10031 = CARTESIAN_POINT('',(-0.,0.));
+#10032 = VECTOR('',#10033,1.);
+#10033 = DIRECTION('',(-0.,1.));
+#10034 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10035 = ADVANCED_FACE('',(#10036),#9830,.T.);
+#10036 = FACE_BOUND('',#10037,.T.);
+#10037 = EDGE_LOOP('',(#10038,#10068,#10094,#10095,#10118,#10146,#10174)
+ );
+#10038 = ORIENTED_EDGE('',*,*,#10039,.T.);
+#10039 = EDGE_CURVE('',#10040,#10042,#10044,.T.);
+#10040 = VERTEX_POINT('',#10041);
+#10041 = CARTESIAN_POINT('',(-3.175,-1.82,2.56));
+#10042 = VERTEX_POINT('',#10043);
+#10043 = CARTESIAN_POINT('',(-3.81,-1.82,2.56));
+#10044 = SURFACE_CURVE('',#10045,(#10049,#10056),.PCURVE_S1.);
+#10045 = LINE('',#10046,#10047);
+#10046 = CARTESIAN_POINT('',(-3.6725,-1.82,2.56));
+#10047 = VECTOR('',#10048,1.);
+#10048 = DIRECTION('',(-1.,0.,0.));
+#10049 = PCURVE('',#9830,#10050);
+#10050 = DEFINITIONAL_REPRESENTATION('',(#10051),#10055);
+#10051 = LINE('',#10052,#10053);
+#10052 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#10053 = VECTOR('',#10054,1.);
+#10054 = DIRECTION('',(1.,1.676027028956E-59));
+#10055 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10056 = PCURVE('',#10057,#10062);
+#10057 = PLANE('',#10058);
+#10058 = AXIS2_PLACEMENT_3D('',#10059,#10060,#10061);
+#10059 = CARTESIAN_POINT('',(-3.56125,-1.27,2.56));
+#10060 = DIRECTION('',(1.601195610168E-30,3.925633828627E-30,1.));
+#10061 = DIRECTION('',(0.,1.,-3.925633828627E-30));
+#10062 = DEFINITIONAL_REPRESENTATION('',(#10063),#10067);
+#10063 = LINE('',#10064,#10065);
+#10064 = CARTESIAN_POINT('',(-0.55,0.11125));
+#10065 = VECTOR('',#10066,1.);
+#10066 = DIRECTION('',(0.,1.));
+#10067 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10068 = ORIENTED_EDGE('',*,*,#10069,.F.);
+#10069 = EDGE_CURVE('',#9808,#10042,#10070,.T.);
+#10070 = SURFACE_CURVE('',#10071,(#10076,#10087),.PCURVE_S1.);
+#10071 = CIRCLE('',#10072,0.1375);
+#10072 = AXIS2_PLACEMENT_3D('',#10073,#10074,#10075);
+#10073 = CARTESIAN_POINT('',(-3.81,-1.82,2.4225));
+#10074 = DIRECTION('',(-0.,1.,0.));
+#10075 = DIRECTION('',(0.,0.,-1.));
+#10076 = PCURVE('',#9830,#10077);
+#10077 = DEFINITIONAL_REPRESENTATION('',(#10078),#10086);
+#10078 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#10079,#10080,#10081,#10082
+ ,#10083,#10084,#10085),.UNSPECIFIED.,.F.,.F.)
+B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),(-2.094395102393,0.,
+ 2.094395102393,4.188790204786,6.28318530718,8.377580409573),
+.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM()
+RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM(
+ '') );
+#10079 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#10080 = CARTESIAN_POINT('',(0.323378776719,-0.703971790679));
+#10081 = CARTESIAN_POINT('',(0.204300283699,-0.910221790679));
+#10082 = CARTESIAN_POINT('',(8.522179067866E-02,-1.116471790679));
+#10083 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.910221790679));
+#10084 = CARTESIAN_POINT('',(-0.152935195362,-0.703971790679));
+#10085 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#10086 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10087 = PCURVE('',#10024,#10088);
+#10088 = DEFINITIONAL_REPRESENTATION('',(#10089),#10093);
+#10089 = LINE('',#10090,#10091);
+#10090 = CARTESIAN_POINT('',(1.570796326795,1.1));
+#10091 = VECTOR('',#10092,1.);
+#10092 = DIRECTION('',(-1.,0.));
+#10093 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10094 = ORIENTED_EDGE('',*,*,#9807,.T.);
+#10095 = ORIENTED_EDGE('',*,*,#10096,.F.);
+#10096 = EDGE_CURVE('',#10097,#9810,#10099,.T.);
+#10097 = VERTEX_POINT('',#10098);
+#10098 = CARTESIAN_POINT('',(-3.6725,-1.82,0.275));
+#10099 = SURFACE_CURVE('',#10100,(#10104,#10111),.PCURVE_S1.);
+#10100 = LINE('',#10101,#10102);
+#10101 = CARTESIAN_POINT('',(-3.6725,-1.82,0.275));
+#10102 = VECTOR('',#10103,1.);
+#10103 = DIRECTION('',(-1.,0.,0.));
+#10104 = PCURVE('',#9830,#10105);
+#10105 = DEFINITIONAL_REPRESENTATION('',(#10106),#10110);
+#10106 = LINE('',#10107,#10108);
+#10107 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#10108 = VECTOR('',#10109,1.);
+#10109 = DIRECTION('',(1.,1.676027028956E-59));
+#10110 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10111 = PCURVE('',#9858,#10112);
+#10112 = DEFINITIONAL_REPRESENTATION('',(#10113),#10117);
+#10113 = LINE('',#10114,#10115);
+#10114 = CARTESIAN_POINT('',(0.,0.));
+#10115 = VECTOR('',#10116,1.);
+#10116 = DIRECTION('',(0.,-1.));
+#10117 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10118 = ORIENTED_EDGE('',*,*,#10119,.F.);
+#10119 = EDGE_CURVE('',#10120,#10097,#10122,.T.);
+#10120 = VERTEX_POINT('',#10121);
+#10121 = CARTESIAN_POINT('',(-3.6725,-1.82,2.285));
+#10122 = SURFACE_CURVE('',#10123,(#10127,#10134),.PCURVE_S1.);
+#10123 = LINE('',#10124,#10125);
+#10124 = CARTESIAN_POINT('',(-3.6725,-1.82,2.56));
+#10125 = VECTOR('',#10126,1.);
+#10126 = DIRECTION('',(0.,0.,-1.));
+#10127 = PCURVE('',#9830,#10128);
+#10128 = DEFINITIONAL_REPRESENTATION('',(#10129),#10133);
+#10129 = LINE('',#10130,#10131);
+#10130 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#10131 = VECTOR('',#10132,1.);
+#10132 = DIRECTION('',(0.,1.));
+#10133 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10134 = PCURVE('',#10135,#10140);
+#10135 = PLANE('',#10136);
+#10136 = AXIS2_PLACEMENT_3D('',#10137,#10138,#10139);
+#10137 = CARTESIAN_POINT('',(-3.6725,-1.27,-0.34105853382));
+#10138 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#10139 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#10140 = DEFINITIONAL_REPRESENTATION('',(#10141),#10145);
+#10141 = LINE('',#10142,#10143);
+#10142 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#10143 = VECTOR('',#10144,1.);
+#10144 = DIRECTION('',(0.,-1.));
+#10145 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10146 = ORIENTED_EDGE('',*,*,#10147,.T.);
+#10147 = EDGE_CURVE('',#10120,#10148,#10150,.T.);
+#10148 = VERTEX_POINT('',#10149);
+#10149 = CARTESIAN_POINT('',(-3.175,-1.82,2.285));
+#10150 = SURFACE_CURVE('',#10151,(#10155,#10162),.PCURVE_S1.);
+#10151 = LINE('',#10152,#10153);
+#10152 = CARTESIAN_POINT('',(-3.6725,-1.82,2.285));
+#10153 = VECTOR('',#10154,1.);
+#10154 = DIRECTION('',(1.,0.,0.));
+#10155 = PCURVE('',#9830,#10156);
+#10156 = DEFINITIONAL_REPRESENTATION('',(#10157),#10161);
+#10157 = LINE('',#10158,#10159);
+#10158 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.703971790679));
+#10159 = VECTOR('',#10160,1.);
+#10160 = DIRECTION('',(-1.,-1.676027028956E-59));
+#10161 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10162 = PCURVE('',#10163,#10168);
+#10163 = PLANE('',#10164);
+#10164 = AXIS2_PLACEMENT_3D('',#10165,#10166,#10167);
+#10165 = CARTESIAN_POINT('',(-3.6725,-1.82,2.285));
+#10166 = DIRECTION('',(0.,0.,1.));
+#10167 = DIRECTION('',(1.,0.,0.));
+#10168 = DEFINITIONAL_REPRESENTATION('',(#10169),#10173);
+#10169 = LINE('',#10170,#10171);
+#10170 = CARTESIAN_POINT('',(0.,0.));
+#10171 = VECTOR('',#10172,1.);
+#10172 = DIRECTION('',(1.,0.));
+#10173 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10174 = ORIENTED_EDGE('',*,*,#10175,.T.);
+#10175 = EDGE_CURVE('',#10148,#10040,#10176,.T.);
+#10176 = SURFACE_CURVE('',#10177,(#10181,#10188),.PCURVE_S1.);
+#10177 = LINE('',#10178,#10179);
+#10178 = CARTESIAN_POINT('',(-3.175,-1.82,2.285));
+#10179 = VECTOR('',#10180,1.);
+#10180 = DIRECTION('',(0.,0.,1.));
+#10181 = PCURVE('',#9830,#10182);
+#10182 = DEFINITIONAL_REPRESENTATION('',(#10183),#10187);
+#10183 = LINE('',#10184,#10185);
+#10184 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#10185 = VECTOR('',#10186,1.);
+#10186 = DIRECTION('',(0.,-1.));
+#10187 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10188 = PCURVE('',#10189,#10194);
+#10189 = PLANE('',#10190);
+#10190 = AXIS2_PLACEMENT_3D('',#10191,#10192,#10193);
+#10191 = CARTESIAN_POINT('',(-3.175,-1.82,2.285));
+#10192 = DIRECTION('',(1.,0.,0.));
+#10193 = DIRECTION('',(0.,0.,1.));
+#10194 = DEFINITIONAL_REPRESENTATION('',(#10195),#10199);
+#10195 = LINE('',#10196,#10197);
+#10196 = CARTESIAN_POINT('',(0.,0.));
+#10197 = VECTOR('',#10198,1.);
+#10198 = DIRECTION('',(1.,0.));
+#10199 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10200 = ADVANCED_FACE('',(#10201),#10024,.T.);
+#10201 = FACE_BOUND('',#10202,.F.);
+#10202 = EDGE_LOOP('',(#10203,#10227,#10248,#10249));
+#10203 = ORIENTED_EDGE('',*,*,#10204,.T.);
+#10204 = EDGE_CURVE('',#9983,#10205,#10207,.T.);
+#10205 = VERTEX_POINT('',#10206);
+#10206 = CARTESIAN_POINT('',(-3.81,-0.72,2.56));
+#10207 = SURFACE_CURVE('',#10208,(#10213,#10220),.PCURVE_S1.);
+#10208 = CIRCLE('',#10209,0.1375);
+#10209 = AXIS2_PLACEMENT_3D('',#10210,#10211,#10212);
+#10210 = CARTESIAN_POINT('',(-3.81,-0.72,2.4225));
+#10211 = DIRECTION('',(-0.,1.,0.));
+#10212 = DIRECTION('',(0.,0.,-1.));
+#10213 = PCURVE('',#10024,#10214);
+#10214 = DEFINITIONAL_REPRESENTATION('',(#10215),#10219);
+#10215 = LINE('',#10216,#10217);
+#10216 = CARTESIAN_POINT('',(1.570796326795,3.552713678801E-15));
+#10217 = VECTOR('',#10218,1.);
+#10218 = DIRECTION('',(-1.,0.));
+#10219 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10220 = PCURVE('',#9998,#10221);
+#10221 = DEFINITIONAL_REPRESENTATION('',(#10222),#10226);
+#10222 = CIRCLE('',#10223,0.1375);
+#10223 = AXIS2_PLACEMENT_2D('',#10224,#10225);
+#10224 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#10225 = DIRECTION('',(0.,1.));
+#10226 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10227 = ORIENTED_EDGE('',*,*,#10228,.T.);
+#10228 = EDGE_CURVE('',#10205,#10042,#10229,.T.);
+#10229 = SURFACE_CURVE('',#10230,(#10234,#10241),.PCURVE_S1.);
+#10230 = LINE('',#10231,#10232);
+#10231 = CARTESIAN_POINT('',(-3.81,-0.72,2.56));
+#10232 = VECTOR('',#10233,1.);
+#10233 = DIRECTION('',(0.,-1.,0.));
+#10234 = PCURVE('',#10024,#10235);
+#10235 = DEFINITIONAL_REPRESENTATION('',(#10236),#10240);
+#10236 = LINE('',#10237,#10238);
+#10237 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#10238 = VECTOR('',#10239,1.);
+#10239 = DIRECTION('',(-0.,1.));
+#10240 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10241 = PCURVE('',#10057,#10242);
+#10242 = DEFINITIONAL_REPRESENTATION('',(#10243),#10247);
+#10243 = LINE('',#10244,#10245);
+#10244 = CARTESIAN_POINT('',(0.55,0.24875));
+#10245 = VECTOR('',#10246,1.);
+#10246 = DIRECTION('',(-1.,-6.285707653525E-60));
+#10247 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10248 = ORIENTED_EDGE('',*,*,#10069,.F.);
+#10249 = ORIENTED_EDGE('',*,*,#10010,.F.);
+#10250 = ADVANCED_FACE('',(#10251),#9858,.T.);
+#10251 = FACE_BOUND('',#10252,.T.);
+#10252 = EDGE_LOOP('',(#10253,#10254,#10255,#10278));
+#10253 = ORIENTED_EDGE('',*,*,#10096,.T.);
+#10254 = ORIENTED_EDGE('',*,*,#9842,.T.);
+#10255 = ORIENTED_EDGE('',*,*,#10256,.F.);
+#10256 = EDGE_CURVE('',#10257,#9843,#10259,.T.);
+#10257 = VERTEX_POINT('',#10258);
+#10258 = CARTESIAN_POINT('',(-3.6725,-1.545,0.));
+#10259 = SURFACE_CURVE('',#10260,(#10264,#10271),.PCURVE_S1.);
+#10260 = LINE('',#10261,#10262);
+#10261 = CARTESIAN_POINT('',(-3.6725,-1.545,0.));
+#10262 = VECTOR('',#10263,1.);
+#10263 = DIRECTION('',(-1.,0.,0.));
+#10264 = PCURVE('',#9858,#10265);
+#10265 = DEFINITIONAL_REPRESENTATION('',(#10266),#10270);
+#10266 = LINE('',#10267,#10268);
+#10267 = CARTESIAN_POINT('',(0.388908729653,0.));
+#10268 = VECTOR('',#10269,1.);
+#10269 = DIRECTION('',(0.,-1.));
+#10270 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10271 = PCURVE('',#9886,#10272);
+#10272 = DEFINITIONAL_REPRESENTATION('',(#10273),#10277);
+#10273 = LINE('',#10274,#10275);
+#10274 = CARTESIAN_POINT('',(0.,0.));
+#10275 = VECTOR('',#10276,1.);
+#10276 = DIRECTION('',(0.,-1.));
+#10277 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10278 = ORIENTED_EDGE('',*,*,#10279,.F.);
+#10279 = EDGE_CURVE('',#10097,#10257,#10280,.T.);
+#10280 = SURFACE_CURVE('',#10281,(#10285,#10292),.PCURVE_S1.);
+#10281 = LINE('',#10282,#10283);
+#10282 = CARTESIAN_POINT('',(-3.6725,-1.82,0.275));
+#10283 = VECTOR('',#10284,1.);
+#10284 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#10285 = PCURVE('',#9858,#10286);
+#10286 = DEFINITIONAL_REPRESENTATION('',(#10287),#10291);
+#10287 = LINE('',#10288,#10289);
+#10288 = CARTESIAN_POINT('',(0.,0.));
+#10289 = VECTOR('',#10290,1.);
+#10290 = DIRECTION('',(1.,0.));
+#10291 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10292 = PCURVE('',#10135,#10293);
+#10293 = DEFINITIONAL_REPRESENTATION('',(#10294),#10298);
+#10294 = LINE('',#10295,#10296);
+#10295 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#10296 = VECTOR('',#10297,1.);
+#10297 = DIRECTION('',(0.707106781187,-0.707106781187));
+#10298 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10299 = ADVANCED_FACE('',(#10300),#9998,.T.);
+#10300 = FACE_BOUND('',#10301,.T.);
+#10301 = EDGE_LOOP('',(#10302,#10303,#10304,#10327,#10350,#10373,#10396)
+ );
+#10302 = ORIENTED_EDGE('',*,*,#9982,.T.);
+#10303 = ORIENTED_EDGE('',*,*,#10204,.T.);
+#10304 = ORIENTED_EDGE('',*,*,#10305,.T.);
+#10305 = EDGE_CURVE('',#10205,#10306,#10308,.T.);
+#10306 = VERTEX_POINT('',#10307);
+#10307 = CARTESIAN_POINT('',(-3.175,-0.72,2.56));
+#10308 = SURFACE_CURVE('',#10309,(#10313,#10320),.PCURVE_S1.);
+#10309 = LINE('',#10310,#10311);
+#10310 = CARTESIAN_POINT('',(-3.6725,-0.72,2.56));
+#10311 = VECTOR('',#10312,1.);
+#10312 = DIRECTION('',(1.,0.,0.));
+#10313 = PCURVE('',#9998,#10314);
+#10314 = DEFINITIONAL_REPRESENTATION('',(#10315),#10319);
+#10315 = LINE('',#10316,#10317);
+#10316 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#10317 = VECTOR('',#10318,1.);
+#10318 = DIRECTION('',(1.,-6.050792998522E-59));
+#10319 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10320 = PCURVE('',#10057,#10321);
+#10321 = DEFINITIONAL_REPRESENTATION('',(#10322),#10326);
+#10322 = LINE('',#10323,#10324);
+#10323 = CARTESIAN_POINT('',(0.55,0.11125));
+#10324 = VECTOR('',#10325,1.);
+#10325 = DIRECTION('',(0.,-1.));
+#10326 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10327 = ORIENTED_EDGE('',*,*,#10328,.F.);
+#10328 = EDGE_CURVE('',#10329,#10306,#10331,.T.);
+#10329 = VERTEX_POINT('',#10330);
+#10330 = CARTESIAN_POINT('',(-3.175,-0.72,2.285));
+#10331 = SURFACE_CURVE('',#10332,(#10336,#10343),.PCURVE_S1.);
+#10332 = LINE('',#10333,#10334);
+#10333 = CARTESIAN_POINT('',(-3.175,-0.72,2.285));
+#10334 = VECTOR('',#10335,1.);
+#10335 = DIRECTION('',(0.,0.,1.));
+#10336 = PCURVE('',#9998,#10337);
+#10337 = DEFINITIONAL_REPRESENTATION('',(#10338),#10342);
+#10338 = LINE('',#10339,#10340);
+#10339 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#10340 = VECTOR('',#10341,1.);
+#10341 = DIRECTION('',(0.,-1.));
+#10342 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10343 = PCURVE('',#10189,#10344);
+#10344 = DEFINITIONAL_REPRESENTATION('',(#10345),#10349);
+#10345 = LINE('',#10346,#10347);
+#10346 = CARTESIAN_POINT('',(0.,-1.1));
+#10347 = VECTOR('',#10348,1.);
+#10348 = DIRECTION('',(1.,0.));
+#10349 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10350 = ORIENTED_EDGE('',*,*,#10351,.F.);
+#10351 = EDGE_CURVE('',#10352,#10329,#10354,.T.);
+#10352 = VERTEX_POINT('',#10353);
+#10353 = CARTESIAN_POINT('',(-3.6725,-0.72,2.285));
+#10354 = SURFACE_CURVE('',#10355,(#10359,#10366),.PCURVE_S1.);
+#10355 = LINE('',#10356,#10357);
+#10356 = CARTESIAN_POINT('',(-3.6725,-0.72,2.285));
+#10357 = VECTOR('',#10358,1.);
+#10358 = DIRECTION('',(1.,0.,0.));
+#10359 = PCURVE('',#9998,#10360);
+#10360 = DEFINITIONAL_REPRESENTATION('',(#10361),#10365);
+#10361 = LINE('',#10362,#10363);
+#10362 = CARTESIAN_POINT('',(5.227820932134E-02,-0.703971790679));
+#10363 = VECTOR('',#10364,1.);
+#10364 = DIRECTION('',(1.,-6.050792998522E-59));
+#10365 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10366 = PCURVE('',#10163,#10367);
+#10367 = DEFINITIONAL_REPRESENTATION('',(#10368),#10372);
+#10368 = LINE('',#10369,#10370);
+#10369 = CARTESIAN_POINT('',(0.,1.1));
+#10370 = VECTOR('',#10371,1.);
+#10371 = DIRECTION('',(1.,0.));
+#10372 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10373 = ORIENTED_EDGE('',*,*,#10374,.F.);
+#10374 = EDGE_CURVE('',#10375,#10352,#10377,.T.);
+#10375 = VERTEX_POINT('',#10376);
+#10376 = CARTESIAN_POINT('',(-3.6725,-0.72,0.275));
+#10377 = SURFACE_CURVE('',#10378,(#10382,#10389),.PCURVE_S1.);
+#10378 = LINE('',#10379,#10380);
+#10379 = CARTESIAN_POINT('',(-3.6725,-0.72,0.275));
+#10380 = VECTOR('',#10381,1.);
+#10381 = DIRECTION('',(0.,0.,1.));
+#10382 = PCURVE('',#9998,#10383);
+#10383 = DEFINITIONAL_REPRESENTATION('',(#10384),#10388);
+#10384 = LINE('',#10385,#10386);
+#10385 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#10386 = VECTOR('',#10387,1.);
+#10387 = DIRECTION('',(0.,-1.));
+#10388 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10389 = PCURVE('',#10135,#10390);
+#10390 = DEFINITIONAL_REPRESENTATION('',(#10391),#10395);
+#10391 = LINE('',#10392,#10393);
+#10392 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#10393 = VECTOR('',#10394,1.);
+#10394 = DIRECTION('',(0.,1.));
+#10395 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10396 = ORIENTED_EDGE('',*,*,#10397,.T.);
+#10397 = EDGE_CURVE('',#10375,#9955,#10398,.T.);
+#10398 = SURFACE_CURVE('',#10399,(#10403,#10410),.PCURVE_S1.);
+#10399 = LINE('',#10400,#10401);
+#10400 = CARTESIAN_POINT('',(-3.6725,-0.72,0.275));
+#10401 = VECTOR('',#10402,1.);
+#10402 = DIRECTION('',(-1.,0.,0.));
+#10403 = PCURVE('',#9998,#10404);
+#10404 = DEFINITIONAL_REPRESENTATION('',(#10405),#10409);
+#10405 = LINE('',#10406,#10407);
+#10406 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#10407 = VECTOR('',#10408,1.);
+#10408 = DIRECTION('',(-1.,6.050792998522E-59));
+#10409 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10410 = PCURVE('',#9970,#10411);
+#10411 = DEFINITIONAL_REPRESENTATION('',(#10412),#10416);
+#10412 = LINE('',#10413,#10414);
+#10413 = CARTESIAN_POINT('',(0.388908729653,0.));
+#10414 = VECTOR('',#10415,1.);
+#10415 = DIRECTION('',(0.,-1.));
+#10416 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10417 = ADVANCED_FACE('',(#10418),#9886,.T.);
+#10418 = FACE_BOUND('',#10419,.T.);
+#10419 = EDGE_LOOP('',(#10420,#10421,#10422,#10445));
+#10420 = ORIENTED_EDGE('',*,*,#10256,.T.);
+#10421 = ORIENTED_EDGE('',*,*,#9870,.T.);
+#10422 = ORIENTED_EDGE('',*,*,#10423,.F.);
+#10423 = EDGE_CURVE('',#10424,#9871,#10426,.T.);
+#10424 = VERTEX_POINT('',#10425);
+#10425 = CARTESIAN_POINT('',(-3.6725,-1.545,-3.5));
+#10426 = SURFACE_CURVE('',#10427,(#10431,#10438),.PCURVE_S1.);
+#10427 = LINE('',#10428,#10429);
+#10428 = CARTESIAN_POINT('',(-3.6725,-1.545,-3.5));
+#10429 = VECTOR('',#10430,1.);
+#10430 = DIRECTION('',(-1.,0.,0.));
+#10431 = PCURVE('',#9886,#10432);
+#10432 = DEFINITIONAL_REPRESENTATION('',(#10433),#10437);
+#10433 = LINE('',#10434,#10435);
+#10434 = CARTESIAN_POINT('',(3.5,0.));
+#10435 = VECTOR('',#10436,1.);
+#10436 = DIRECTION('',(0.,-1.));
+#10437 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10438 = PCURVE('',#9914,#10439);
+#10439 = DEFINITIONAL_REPRESENTATION('',(#10440),#10444);
+#10440 = LINE('',#10441,#10442);
+#10441 = CARTESIAN_POINT('',(3.330669073875E-16,0.));
+#10442 = VECTOR('',#10443,1.);
+#10443 = DIRECTION('',(0.,-1.));
+#10444 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10445 = ORIENTED_EDGE('',*,*,#10446,.F.);
+#10446 = EDGE_CURVE('',#10257,#10424,#10447,.T.);
+#10447 = SURFACE_CURVE('',#10448,(#10452,#10459),.PCURVE_S1.);
+#10448 = LINE('',#10449,#10450);
+#10449 = CARTESIAN_POINT('',(-3.6725,-1.545,0.));
+#10450 = VECTOR('',#10451,1.);
+#10451 = DIRECTION('',(0.,0.,-1.));
+#10452 = PCURVE('',#9886,#10453);
+#10453 = DEFINITIONAL_REPRESENTATION('',(#10454),#10458);
+#10454 = LINE('',#10455,#10456);
+#10455 = CARTESIAN_POINT('',(0.,0.));
+#10456 = VECTOR('',#10457,1.);
+#10457 = DIRECTION('',(1.,0.));
+#10458 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10459 = PCURVE('',#10135,#10460);
+#10460 = DEFINITIONAL_REPRESENTATION('',(#10461),#10465);
+#10461 = LINE('',#10462,#10463);
+#10462 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#10463 = VECTOR('',#10464,1.);
+#10464 = DIRECTION('',(0.,-1.));
+#10465 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10466 = ADVANCED_FACE('',(#10467),#9970,.T.);
+#10467 = FACE_BOUND('',#10468,.T.);
+#10468 = EDGE_LOOP('',(#10469,#10492,#10493,#10494));
+#10469 = ORIENTED_EDGE('',*,*,#10470,.T.);
+#10470 = EDGE_CURVE('',#10471,#9927,#10473,.T.);
+#10471 = VERTEX_POINT('',#10472);
+#10472 = CARTESIAN_POINT('',(-3.6725,-0.995,0.));
+#10473 = SURFACE_CURVE('',#10474,(#10478,#10485),.PCURVE_S1.);
+#10474 = LINE('',#10475,#10476);
+#10475 = CARTESIAN_POINT('',(-3.6725,-0.995,0.));
+#10476 = VECTOR('',#10477,1.);
+#10477 = DIRECTION('',(-1.,0.,0.));
+#10478 = PCURVE('',#9970,#10479);
+#10479 = DEFINITIONAL_REPRESENTATION('',(#10480),#10484);
+#10480 = LINE('',#10481,#10482);
+#10481 = CARTESIAN_POINT('',(-6.280369834735E-16,0.));
+#10482 = VECTOR('',#10483,1.);
+#10483 = DIRECTION('',(0.,-1.));
+#10484 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10485 = PCURVE('',#9942,#10486);
+#10486 = DEFINITIONAL_REPRESENTATION('',(#10487),#10491);
+#10487 = LINE('',#10488,#10489);
+#10488 = CARTESIAN_POINT('',(3.5,0.));
+#10489 = VECTOR('',#10490,1.);
+#10490 = DIRECTION('',(0.,-1.));
+#10491 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10492 = ORIENTED_EDGE('',*,*,#9954,.T.);
+#10493 = ORIENTED_EDGE('',*,*,#10397,.F.);
+#10494 = ORIENTED_EDGE('',*,*,#10495,.F.);
+#10495 = EDGE_CURVE('',#10471,#10375,#10496,.T.);
+#10496 = SURFACE_CURVE('',#10497,(#10501,#10508),.PCURVE_S1.);
+#10497 = LINE('',#10498,#10499);
+#10498 = CARTESIAN_POINT('',(-3.6725,-0.995,0.));
+#10499 = VECTOR('',#10500,1.);
+#10500 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#10501 = PCURVE('',#9970,#10502);
+#10502 = DEFINITIONAL_REPRESENTATION('',(#10503),#10507);
+#10503 = LINE('',#10504,#10505);
+#10504 = CARTESIAN_POINT('',(0.,0.));
+#10505 = VECTOR('',#10506,1.);
+#10506 = DIRECTION('',(1.,0.));
+#10507 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10508 = PCURVE('',#10135,#10509);
+#10509 = DEFINITIONAL_REPRESENTATION('',(#10510),#10514);
+#10510 = LINE('',#10511,#10512);
+#10511 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#10512 = VECTOR('',#10513,1.);
+#10513 = DIRECTION('',(0.707106781187,0.707106781187));
+#10514 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10515 = ADVANCED_FACE('',(#10516),#9914,.T.);
+#10516 = FACE_BOUND('',#10517,.T.);
+#10517 = EDGE_LOOP('',(#10518,#10519,#10520,#10543));
+#10518 = ORIENTED_EDGE('',*,*,#10423,.T.);
+#10519 = ORIENTED_EDGE('',*,*,#9898,.T.);
+#10520 = ORIENTED_EDGE('',*,*,#10521,.F.);
+#10521 = EDGE_CURVE('',#10522,#9899,#10524,.T.);
+#10522 = VERTEX_POINT('',#10523);
+#10523 = CARTESIAN_POINT('',(-3.6725,-0.995,-3.5));
+#10524 = SURFACE_CURVE('',#10525,(#10529,#10536),.PCURVE_S1.);
+#10525 = LINE('',#10526,#10527);
+#10526 = CARTESIAN_POINT('',(-3.6725,-0.995,-3.5));
+#10527 = VECTOR('',#10528,1.);
+#10528 = DIRECTION('',(-1.,0.,0.));
+#10529 = PCURVE('',#9914,#10530);
+#10530 = DEFINITIONAL_REPRESENTATION('',(#10531),#10535);
+#10531 = LINE('',#10532,#10533);
+#10532 = CARTESIAN_POINT('',(0.55,0.));
+#10533 = VECTOR('',#10534,1.);
+#10534 = DIRECTION('',(0.,-1.));
+#10535 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10536 = PCURVE('',#9942,#10537);
+#10537 = DEFINITIONAL_REPRESENTATION('',(#10538),#10542);
+#10538 = LINE('',#10539,#10540);
+#10539 = CARTESIAN_POINT('',(0.,0.));
+#10540 = VECTOR('',#10541,1.);
+#10541 = DIRECTION('',(0.,-1.));
+#10542 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10543 = ORIENTED_EDGE('',*,*,#10544,.F.);
+#10544 = EDGE_CURVE('',#10424,#10522,#10545,.T.);
+#10545 = SURFACE_CURVE('',#10546,(#10550,#10557),.PCURVE_S1.);
+#10546 = LINE('',#10547,#10548);
+#10547 = CARTESIAN_POINT('',(-3.6725,-1.545,-3.5));
+#10548 = VECTOR('',#10549,1.);
+#10549 = DIRECTION('',(0.,1.,0.));
+#10550 = PCURVE('',#9914,#10551);
+#10551 = DEFINITIONAL_REPRESENTATION('',(#10552),#10556);
+#10552 = LINE('',#10553,#10554);
+#10553 = CARTESIAN_POINT('',(0.,0.));
+#10554 = VECTOR('',#10555,1.);
+#10555 = DIRECTION('',(1.,0.));
+#10556 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10557 = PCURVE('',#10135,#10558);
+#10558 = DEFINITIONAL_REPRESENTATION('',(#10559),#10563);
+#10559 = LINE('',#10560,#10561);
+#10560 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#10561 = VECTOR('',#10562,1.);
+#10562 = DIRECTION('',(1.,-2.226071387182E-62));
+#10563 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10564 = ADVANCED_FACE('',(#10565),#9942,.T.);
+#10565 = FACE_BOUND('',#10566,.T.);
+#10566 = EDGE_LOOP('',(#10567,#10568,#10569,#10570));
+#10567 = ORIENTED_EDGE('',*,*,#10521,.T.);
+#10568 = ORIENTED_EDGE('',*,*,#9926,.T.);
+#10569 = ORIENTED_EDGE('',*,*,#10470,.F.);
+#10570 = ORIENTED_EDGE('',*,*,#10571,.F.);
+#10571 = EDGE_CURVE('',#10522,#10471,#10572,.T.);
+#10572 = SURFACE_CURVE('',#10573,(#10577,#10584),.PCURVE_S1.);
+#10573 = LINE('',#10574,#10575);
+#10574 = CARTESIAN_POINT('',(-3.6725,-0.995,-3.5));
+#10575 = VECTOR('',#10576,1.);
+#10576 = DIRECTION('',(0.,0.,1.));
+#10577 = PCURVE('',#9942,#10578);
+#10578 = DEFINITIONAL_REPRESENTATION('',(#10579),#10583);
+#10579 = LINE('',#10580,#10581);
+#10580 = CARTESIAN_POINT('',(0.,0.));
+#10581 = VECTOR('',#10582,1.);
+#10582 = DIRECTION('',(1.,0.));
+#10583 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10584 = PCURVE('',#10135,#10585);
+#10585 = DEFINITIONAL_REPRESENTATION('',(#10586),#10590);
+#10586 = LINE('',#10587,#10588);
+#10587 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#10588 = VECTOR('',#10589,1.);
+#10589 = DIRECTION('',(0.,1.));
+#10590 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10591 = ADVANCED_FACE('',(#10592),#10057,.T.);
+#10592 = FACE_BOUND('',#10593,.T.);
+#10593 = EDGE_LOOP('',(#10594,#10595,#10616,#10617));
+#10594 = ORIENTED_EDGE('',*,*,#10039,.F.);
+#10595 = ORIENTED_EDGE('',*,*,#10596,.T.);
+#10596 = EDGE_CURVE('',#10040,#10306,#10597,.T.);
+#10597 = SURFACE_CURVE('',#10598,(#10602,#10609),.PCURVE_S1.);
+#10598 = LINE('',#10599,#10600);
+#10599 = CARTESIAN_POINT('',(-3.175,-1.82,2.56));
+#10600 = VECTOR('',#10601,1.);
+#10601 = DIRECTION('',(0.,1.,0.));
+#10602 = PCURVE('',#10057,#10603);
+#10603 = DEFINITIONAL_REPRESENTATION('',(#10604),#10608);
+#10604 = LINE('',#10605,#10606);
+#10605 = CARTESIAN_POINT('',(-0.55,-0.38625));
+#10606 = VECTOR('',#10607,1.);
+#10607 = DIRECTION('',(1.,6.285707653525E-60));
+#10608 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10609 = PCURVE('',#10189,#10610);
+#10610 = DEFINITIONAL_REPRESENTATION('',(#10611),#10615);
+#10611 = LINE('',#10612,#10613);
+#10612 = CARTESIAN_POINT('',(0.275,0.));
+#10613 = VECTOR('',#10614,1.);
+#10614 = DIRECTION('',(0.,-1.));
+#10615 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10616 = ORIENTED_EDGE('',*,*,#10305,.F.);
+#10617 = ORIENTED_EDGE('',*,*,#10228,.T.);
+#10618 = ADVANCED_FACE('',(#10619),#10189,.T.);
+#10619 = FACE_BOUND('',#10620,.T.);
+#10620 = EDGE_LOOP('',(#10621,#10622,#10643,#10644));
+#10621 = ORIENTED_EDGE('',*,*,#10175,.F.);
+#10622 = ORIENTED_EDGE('',*,*,#10623,.T.);
+#10623 = EDGE_CURVE('',#10148,#10329,#10624,.T.);
+#10624 = SURFACE_CURVE('',#10625,(#10629,#10636),.PCURVE_S1.);
+#10625 = LINE('',#10626,#10627);
+#10626 = CARTESIAN_POINT('',(-3.175,-1.82,2.285));
+#10627 = VECTOR('',#10628,1.);
+#10628 = DIRECTION('',(0.,1.,0.));
+#10629 = PCURVE('',#10189,#10630);
+#10630 = DEFINITIONAL_REPRESENTATION('',(#10631),#10635);
+#10631 = LINE('',#10632,#10633);
+#10632 = CARTESIAN_POINT('',(0.,0.));
+#10633 = VECTOR('',#10634,1.);
+#10634 = DIRECTION('',(0.,-1.));
+#10635 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10636 = PCURVE('',#10163,#10637);
+#10637 = DEFINITIONAL_REPRESENTATION('',(#10638),#10642);
+#10638 = LINE('',#10639,#10640);
+#10639 = CARTESIAN_POINT('',(0.4975,0.));
+#10640 = VECTOR('',#10641,1.);
+#10641 = DIRECTION('',(0.,1.));
+#10642 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10643 = ORIENTED_EDGE('',*,*,#10328,.T.);
+#10644 = ORIENTED_EDGE('',*,*,#10596,.F.);
+#10645 = ADVANCED_FACE('',(#10646),#10163,.F.);
+#10646 = FACE_BOUND('',#10647,.F.);
+#10647 = EDGE_LOOP('',(#10648,#10669,#10670,#10671));
+#10648 = ORIENTED_EDGE('',*,*,#10649,.F.);
+#10649 = EDGE_CURVE('',#10120,#10352,#10650,.T.);
+#10650 = SURFACE_CURVE('',#10651,(#10655,#10662),.PCURVE_S1.);
+#10651 = LINE('',#10652,#10653);
+#10652 = CARTESIAN_POINT('',(-3.6725,-1.82,2.285));
+#10653 = VECTOR('',#10654,1.);
+#10654 = DIRECTION('',(0.,1.,0.));
+#10655 = PCURVE('',#10163,#10656);
+#10656 = DEFINITIONAL_REPRESENTATION('',(#10657),#10661);
+#10657 = LINE('',#10658,#10659);
+#10658 = CARTESIAN_POINT('',(0.,0.));
+#10659 = VECTOR('',#10660,1.);
+#10660 = DIRECTION('',(0.,1.));
+#10661 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10662 = PCURVE('',#10135,#10663);
+#10663 = DEFINITIONAL_REPRESENTATION('',(#10664),#10668);
+#10664 = LINE('',#10665,#10666);
+#10665 = CARTESIAN_POINT('',(-0.55,2.62605853382));
+#10666 = VECTOR('',#10667,1.);
+#10667 = DIRECTION('',(1.,-2.226071387182E-62));
+#10668 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10669 = ORIENTED_EDGE('',*,*,#10147,.T.);
+#10670 = ORIENTED_EDGE('',*,*,#10623,.T.);
+#10671 = ORIENTED_EDGE('',*,*,#10351,.F.);
+#10672 = ADVANCED_FACE('',(#10673),#10135,.T.);
+#10673 = FACE_BOUND('',#10674,.T.);
+#10674 = EDGE_LOOP('',(#10675,#10676,#10677,#10678,#10679,#10680,#10681,
+ #10682));
+#10675 = ORIENTED_EDGE('',*,*,#10374,.T.);
+#10676 = ORIENTED_EDGE('',*,*,#10649,.F.);
+#10677 = ORIENTED_EDGE('',*,*,#10119,.T.);
+#10678 = ORIENTED_EDGE('',*,*,#10279,.T.);
+#10679 = ORIENTED_EDGE('',*,*,#10446,.T.);
+#10680 = ORIENTED_EDGE('',*,*,#10544,.T.);
+#10681 = ORIENTED_EDGE('',*,*,#10571,.T.);
+#10682 = ORIENTED_EDGE('',*,*,#10495,.T.);
+#10683 = MANIFOLD_SOLID_BREP('',#10684);
+#10684 = CLOSED_SHELL('',(#10685,#10917,#11082,#11132,#11181,#11299,
+ #11348,#11397,#11446,#11473,#11500,#11527,#11554));
+#10685 = ADVANCED_FACE('',(#10686),#10700,.F.);
+#10686 = FACE_BOUND('',#10687,.F.);
+#10687 = EDGE_LOOP('',(#10688,#10723,#10751,#10779,#10807,#10835,#10863,
+ #10891));
+#10688 = ORIENTED_EDGE('',*,*,#10689,.T.);
+#10689 = EDGE_CURVE('',#10690,#10692,#10694,.T.);
+#10690 = VERTEX_POINT('',#10691);
+#10691 = CARTESIAN_POINT('',(3.9475,-0.72,2.4225));
+#10692 = VERTEX_POINT('',#10693);
+#10693 = CARTESIAN_POINT('',(3.9475,-0.72,0.275));
+#10694 = SURFACE_CURVE('',#10695,(#10699,#10711),.PCURVE_S1.);
+#10695 = LINE('',#10696,#10697);
+#10696 = CARTESIAN_POINT('',(3.9475,-0.72,2.56));
+#10697 = VECTOR('',#10698,1.);
+#10698 = DIRECTION('',(0.,0.,-1.));
+#10699 = PCURVE('',#10700,#10705);
+#10700 = PLANE('',#10701);
+#10701 = AXIS2_PLACEMENT_3D('',#10702,#10703,#10704);
+#10702 = CARTESIAN_POINT('',(3.9475,-1.27,-0.34105853382));
+#10703 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#10704 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#10705 = DEFINITIONAL_REPRESENTATION('',(#10706),#10710);
+#10706 = LINE('',#10707,#10708);
+#10707 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#10708 = VECTOR('',#10709,1.);
+#10709 = DIRECTION('',(0.,-1.));
+#10710 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10711 = PCURVE('',#10712,#10717);
+#10712 = PLANE('',#10713);
+#10713 = AXIS2_PLACEMENT_3D('',#10714,#10715,#10716);
+#10714 = CARTESIAN_POINT('',(3.724778209321,-0.72,1.581028209321));
+#10715 = DIRECTION('',(3.17453643318E-29,1.,2.111838454822E-30));
+#10716 = DIRECTION('',(1.,-3.17453643318E-29,0.));
+#10717 = DEFINITIONAL_REPRESENTATION('',(#10718),#10722);
+#10718 = LINE('',#10719,#10720);
+#10719 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#10720 = VECTOR('',#10721,1.);
+#10721 = DIRECTION('',(0.,1.));
+#10722 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10723 = ORIENTED_EDGE('',*,*,#10724,.T.);
+#10724 = EDGE_CURVE('',#10692,#10725,#10727,.T.);
+#10725 = VERTEX_POINT('',#10726);
+#10726 = CARTESIAN_POINT('',(3.9475,-0.995,0.));
+#10727 = SURFACE_CURVE('',#10728,(#10732,#10739),.PCURVE_S1.);
+#10728 = LINE('',#10729,#10730);
+#10729 = CARTESIAN_POINT('',(3.9475,-0.72,0.275));
+#10730 = VECTOR('',#10731,1.);
+#10731 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#10732 = PCURVE('',#10700,#10733);
+#10733 = DEFINITIONAL_REPRESENTATION('',(#10734),#10738);
+#10734 = LINE('',#10735,#10736);
+#10735 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#10736 = VECTOR('',#10737,1.);
+#10737 = DIRECTION('',(0.707106781187,-0.707106781187));
+#10738 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10739 = PCURVE('',#10740,#10745);
+#10740 = PLANE('',#10741);
+#10741 = AXIS2_PLACEMENT_3D('',#10742,#10743,#10744);
+#10742 = CARTESIAN_POINT('',(3.6725,-0.72,0.275));
+#10743 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#10744 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#10745 = DEFINITIONAL_REPRESENTATION('',(#10746),#10750);
+#10746 = LINE('',#10747,#10748);
+#10747 = CARTESIAN_POINT('',(0.,-0.275));
+#10748 = VECTOR('',#10749,1.);
+#10749 = DIRECTION('',(1.,0.));
+#10750 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10751 = ORIENTED_EDGE('',*,*,#10752,.T.);
+#10752 = EDGE_CURVE('',#10725,#10753,#10755,.T.);
+#10753 = VERTEX_POINT('',#10754);
+#10754 = CARTESIAN_POINT('',(3.9475,-0.995,-3.5));
+#10755 = SURFACE_CURVE('',#10756,(#10760,#10767),.PCURVE_S1.);
+#10756 = LINE('',#10757,#10758);
+#10757 = CARTESIAN_POINT('',(3.9475,-0.995,0.));
+#10758 = VECTOR('',#10759,1.);
+#10759 = DIRECTION('',(0.,0.,-1.));
+#10760 = PCURVE('',#10700,#10761);
+#10761 = DEFINITIONAL_REPRESENTATION('',(#10762),#10766);
+#10762 = LINE('',#10763,#10764);
+#10763 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#10764 = VECTOR('',#10765,1.);
+#10765 = DIRECTION('',(0.,-1.));
+#10766 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10767 = PCURVE('',#10768,#10773);
+#10768 = PLANE('',#10769);
+#10769 = AXIS2_PLACEMENT_3D('',#10770,#10771,#10772);
+#10770 = CARTESIAN_POINT('',(3.6725,-0.995,0.));
+#10771 = DIRECTION('',(0.,1.,0.));
+#10772 = DIRECTION('',(0.,0.,-1.));
+#10773 = DEFINITIONAL_REPRESENTATION('',(#10774),#10778);
+#10774 = LINE('',#10775,#10776);
+#10775 = CARTESIAN_POINT('',(0.,-0.275));
+#10776 = VECTOR('',#10777,1.);
+#10777 = DIRECTION('',(1.,0.));
+#10778 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10779 = ORIENTED_EDGE('',*,*,#10780,.T.);
+#10780 = EDGE_CURVE('',#10753,#10781,#10783,.T.);
+#10781 = VERTEX_POINT('',#10782);
+#10782 = CARTESIAN_POINT('',(3.9475,-1.545,-3.5));
+#10783 = SURFACE_CURVE('',#10784,(#10788,#10795),.PCURVE_S1.);
+#10784 = LINE('',#10785,#10786);
+#10785 = CARTESIAN_POINT('',(3.9475,-0.995,-3.5));
+#10786 = VECTOR('',#10787,1.);
+#10787 = DIRECTION('',(0.,-1.,0.));
+#10788 = PCURVE('',#10700,#10789);
+#10789 = DEFINITIONAL_REPRESENTATION('',(#10790),#10794);
+#10790 = LINE('',#10791,#10792);
+#10791 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#10792 = VECTOR('',#10793,1.);
+#10793 = DIRECTION('',(1.,2.226071387182E-62));
+#10794 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10795 = PCURVE('',#10796,#10801);
+#10796 = PLANE('',#10797);
+#10797 = AXIS2_PLACEMENT_3D('',#10798,#10799,#10800);
+#10798 = CARTESIAN_POINT('',(3.6725,-0.995,-3.5));
+#10799 = DIRECTION('',(0.,0.,-1.));
+#10800 = DIRECTION('',(0.,-1.,0.));
+#10801 = DEFINITIONAL_REPRESENTATION('',(#10802),#10806);
+#10802 = LINE('',#10803,#10804);
+#10803 = CARTESIAN_POINT('',(0.,-0.275));
+#10804 = VECTOR('',#10805,1.);
+#10805 = DIRECTION('',(1.,0.));
+#10806 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10807 = ORIENTED_EDGE('',*,*,#10808,.T.);
+#10808 = EDGE_CURVE('',#10781,#10809,#10811,.T.);
+#10809 = VERTEX_POINT('',#10810);
+#10810 = CARTESIAN_POINT('',(3.9475,-1.545,0.));
+#10811 = SURFACE_CURVE('',#10812,(#10816,#10823),.PCURVE_S1.);
+#10812 = LINE('',#10813,#10814);
+#10813 = CARTESIAN_POINT('',(3.9475,-1.545,-3.5));
+#10814 = VECTOR('',#10815,1.);
+#10815 = DIRECTION('',(0.,0.,1.));
+#10816 = PCURVE('',#10700,#10817);
+#10817 = DEFINITIONAL_REPRESENTATION('',(#10818),#10822);
+#10818 = LINE('',#10819,#10820);
+#10819 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#10820 = VECTOR('',#10821,1.);
+#10821 = DIRECTION('',(0.,1.));
+#10822 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10823 = PCURVE('',#10824,#10829);
+#10824 = PLANE('',#10825);
+#10825 = AXIS2_PLACEMENT_3D('',#10826,#10827,#10828);
+#10826 = CARTESIAN_POINT('',(3.6725,-1.545,-3.5));
+#10827 = DIRECTION('',(0.,-1.,0.));
+#10828 = DIRECTION('',(0.,0.,1.));
+#10829 = DEFINITIONAL_REPRESENTATION('',(#10830),#10834);
+#10830 = LINE('',#10831,#10832);
+#10831 = CARTESIAN_POINT('',(0.,-0.275));
+#10832 = VECTOR('',#10833,1.);
+#10833 = DIRECTION('',(1.,0.));
+#10834 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10835 = ORIENTED_EDGE('',*,*,#10836,.T.);
+#10836 = EDGE_CURVE('',#10809,#10837,#10839,.T.);
+#10837 = VERTEX_POINT('',#10838);
+#10838 = CARTESIAN_POINT('',(3.9475,-1.82,0.275));
+#10839 = SURFACE_CURVE('',#10840,(#10844,#10851),.PCURVE_S1.);
+#10840 = LINE('',#10841,#10842);
+#10841 = CARTESIAN_POINT('',(3.9475,-1.545,0.));
+#10842 = VECTOR('',#10843,1.);
+#10843 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#10844 = PCURVE('',#10700,#10845);
+#10845 = DEFINITIONAL_REPRESENTATION('',(#10846),#10850);
+#10846 = LINE('',#10847,#10848);
+#10847 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#10848 = VECTOR('',#10849,1.);
+#10849 = DIRECTION('',(0.707106781187,0.707106781187));
+#10850 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10851 = PCURVE('',#10852,#10857);
+#10852 = PLANE('',#10853);
+#10853 = AXIS2_PLACEMENT_3D('',#10854,#10855,#10856);
+#10854 = CARTESIAN_POINT('',(3.6725,-1.545,0.));
+#10855 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#10856 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#10857 = DEFINITIONAL_REPRESENTATION('',(#10858),#10862);
+#10858 = LINE('',#10859,#10860);
+#10859 = CARTESIAN_POINT('',(0.,-0.275));
+#10860 = VECTOR('',#10861,1.);
+#10861 = DIRECTION('',(1.,0.));
+#10862 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10863 = ORIENTED_EDGE('',*,*,#10864,.T.);
+#10864 = EDGE_CURVE('',#10837,#10865,#10867,.T.);
+#10865 = VERTEX_POINT('',#10866);
+#10866 = CARTESIAN_POINT('',(3.9475,-1.82,2.4225));
+#10867 = SURFACE_CURVE('',#10868,(#10872,#10879),.PCURVE_S1.);
+#10868 = LINE('',#10869,#10870);
+#10869 = CARTESIAN_POINT('',(3.9475,-1.82,0.275));
+#10870 = VECTOR('',#10871,1.);
+#10871 = DIRECTION('',(0.,0.,1.));
+#10872 = PCURVE('',#10700,#10873);
+#10873 = DEFINITIONAL_REPRESENTATION('',(#10874),#10878);
+#10874 = LINE('',#10875,#10876);
+#10875 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#10876 = VECTOR('',#10877,1.);
+#10877 = DIRECTION('',(0.,1.));
+#10878 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10879 = PCURVE('',#10880,#10885);
+#10880 = PLANE('',#10881);
+#10881 = AXIS2_PLACEMENT_3D('',#10882,#10883,#10884);
+#10882 = CARTESIAN_POINT('',(3.724778209321,-1.82,1.581028209321));
+#10883 = DIRECTION('',(1.308440111004E-29,-1.,1.156108129756E-30));
+#10884 = DIRECTION('',(-1.,-1.308440111004E-29,0.));
+#10885 = DEFINITIONAL_REPRESENTATION('',(#10886),#10890);
+#10886 = LINE('',#10887,#10888);
+#10887 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#10888 = VECTOR('',#10889,1.);
+#10889 = DIRECTION('',(0.,-1.));
+#10890 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10891 = ORIENTED_EDGE('',*,*,#10892,.T.);
+#10892 = EDGE_CURVE('',#10865,#10690,#10893,.T.);
+#10893 = SURFACE_CURVE('',#10894,(#10898,#10905),.PCURVE_S1.);
+#10894 = LINE('',#10895,#10896);
+#10895 = CARTESIAN_POINT('',(3.9475,-1.82,2.4225));
+#10896 = VECTOR('',#10897,1.);
+#10897 = DIRECTION('',(0.,1.,0.));
+#10898 = PCURVE('',#10700,#10899);
+#10899 = DEFINITIONAL_REPRESENTATION('',(#10900),#10904);
+#10900 = LINE('',#10901,#10902);
+#10901 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#10902 = VECTOR('',#10903,1.);
+#10903 = DIRECTION('',(-1.,-2.226071387182E-62));
+#10904 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10905 = PCURVE('',#10906,#10911);
+#10906 = CYLINDRICAL_SURFACE('',#10907,0.1375);
+#10907 = AXIS2_PLACEMENT_3D('',#10908,#10909,#10910);
+#10908 = CARTESIAN_POINT('',(3.81,-1.82,2.4225));
+#10909 = DIRECTION('',(0.,1.,0.));
+#10910 = DIRECTION('',(1.,0.,-9.8088568672E-33));
+#10911 = DEFINITIONAL_REPRESENTATION('',(#10912),#10916);
+#10912 = LINE('',#10913,#10914);
+#10913 = CARTESIAN_POINT('',(-0.,0.));
+#10914 = VECTOR('',#10915,1.);
+#10915 = DIRECTION('',(-0.,1.));
+#10916 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10917 = ADVANCED_FACE('',(#10918),#10712,.T.);
+#10918 = FACE_BOUND('',#10919,.T.);
+#10919 = EDGE_LOOP('',(#10920,#10950,#10976,#10977,#11000,#11028,#11056)
+ );
+#10920 = ORIENTED_EDGE('',*,*,#10921,.T.);
+#10921 = EDGE_CURVE('',#10922,#10924,#10926,.T.);
+#10922 = VERTEX_POINT('',#10923);
+#10923 = CARTESIAN_POINT('',(3.175,-0.72,2.56));
+#10924 = VERTEX_POINT('',#10925);
+#10925 = CARTESIAN_POINT('',(3.81,-0.72,2.56));
+#10926 = SURFACE_CURVE('',#10927,(#10931,#10938),.PCURVE_S1.);
+#10927 = LINE('',#10928,#10929);
+#10928 = CARTESIAN_POINT('',(3.6725,-0.72,2.56));
+#10929 = VECTOR('',#10930,1.);
+#10930 = DIRECTION('',(1.,0.,0.));
+#10931 = PCURVE('',#10712,#10932);
+#10932 = DEFINITIONAL_REPRESENTATION('',(#10933),#10937);
+#10933 = LINE('',#10934,#10935);
+#10934 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#10935 = VECTOR('',#10936,1.);
+#10936 = DIRECTION('',(1.,6.704108115824E-59));
+#10937 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10938 = PCURVE('',#10939,#10944);
+#10939 = PLANE('',#10940);
+#10940 = AXIS2_PLACEMENT_3D('',#10941,#10942,#10943);
+#10941 = CARTESIAN_POINT('',(3.56125,-1.27,2.56));
+#10942 = DIRECTION('',(-1.657312278749E-30,-1.304555144269E-30,1.));
+#10943 = DIRECTION('',(1.,0.,1.657312278749E-30));
+#10944 = DEFINITIONAL_REPRESENTATION('',(#10945),#10949);
+#10945 = LINE('',#10946,#10947);
+#10946 = CARTESIAN_POINT('',(0.11125,0.55));
+#10947 = VECTOR('',#10948,1.);
+#10948 = DIRECTION('',(1.,-2.162055258902E-60));
+#10949 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10950 = ORIENTED_EDGE('',*,*,#10951,.F.);
+#10951 = EDGE_CURVE('',#10690,#10924,#10952,.T.);
+#10952 = SURFACE_CURVE('',#10953,(#10958,#10969),.PCURVE_S1.);
+#10953 = CIRCLE('',#10954,0.1375);
+#10954 = AXIS2_PLACEMENT_3D('',#10955,#10956,#10957);
+#10955 = CARTESIAN_POINT('',(3.81,-0.72,2.4225));
+#10956 = DIRECTION('',(0.,-1.,0.));
+#10957 = DIRECTION('',(0.,0.,1.));
+#10958 = PCURVE('',#10712,#10959);
+#10959 = DEFINITIONAL_REPRESENTATION('',(#10960),#10968);
+#10960 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#10961,#10962,#10963,#10964
+ ,#10965,#10966,#10967),.UNSPECIFIED.,.F.,.F.)
+B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),(-2.094395102393,0.,
+ 2.094395102393,4.188790204786,6.28318530718,8.377580409573),
+.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM()
+RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM(
+ '') );
+#10961 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#10962 = CARTESIAN_POINT('',(-0.152935195362,-0.978971790679));
+#10963 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.772721790679));
+#10964 = CARTESIAN_POINT('',(8.522179067866E-02,-0.566471790679));
+#10965 = CARTESIAN_POINT('',(0.204300283699,-0.772721790679));
+#10966 = CARTESIAN_POINT('',(0.323378776719,-0.978971790679));
+#10967 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#10968 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10969 = PCURVE('',#10906,#10970);
+#10970 = DEFINITIONAL_REPRESENTATION('',(#10971),#10975);
+#10971 = LINE('',#10972,#10973);
+#10972 = CARTESIAN_POINT('',(4.712388980385,1.1));
+#10973 = VECTOR('',#10974,1.);
+#10974 = DIRECTION('',(-1.,0.));
+#10975 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10976 = ORIENTED_EDGE('',*,*,#10689,.T.);
+#10977 = ORIENTED_EDGE('',*,*,#10978,.F.);
+#10978 = EDGE_CURVE('',#10979,#10692,#10981,.T.);
+#10979 = VERTEX_POINT('',#10980);
+#10980 = CARTESIAN_POINT('',(3.6725,-0.72,0.275));
+#10981 = SURFACE_CURVE('',#10982,(#10986,#10993),.PCURVE_S1.);
+#10982 = LINE('',#10983,#10984);
+#10983 = CARTESIAN_POINT('',(3.6725,-0.72,0.275));
+#10984 = VECTOR('',#10985,1.);
+#10985 = DIRECTION('',(1.,0.,0.));
+#10986 = PCURVE('',#10712,#10987);
+#10987 = DEFINITIONAL_REPRESENTATION('',(#10988),#10992);
+#10988 = LINE('',#10989,#10990);
+#10989 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#10990 = VECTOR('',#10991,1.);
+#10991 = DIRECTION('',(1.,6.704108115824E-59));
+#10992 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#10993 = PCURVE('',#10740,#10994);
+#10994 = DEFINITIONAL_REPRESENTATION('',(#10995),#10999);
+#10995 = LINE('',#10996,#10997);
+#10996 = CARTESIAN_POINT('',(4.710277376051E-16,0.));
+#10997 = VECTOR('',#10998,1.);
+#10998 = DIRECTION('',(0.,-1.));
+#10999 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11000 = ORIENTED_EDGE('',*,*,#11001,.F.);
+#11001 = EDGE_CURVE('',#11002,#10979,#11004,.T.);
+#11002 = VERTEX_POINT('',#11003);
+#11003 = CARTESIAN_POINT('',(3.6725,-0.72,2.285));
+#11004 = SURFACE_CURVE('',#11005,(#11009,#11016),.PCURVE_S1.);
+#11005 = LINE('',#11006,#11007);
+#11006 = CARTESIAN_POINT('',(3.6725,-0.72,2.56));
+#11007 = VECTOR('',#11008,1.);
+#11008 = DIRECTION('',(0.,0.,-1.));
+#11009 = PCURVE('',#10712,#11010);
+#11010 = DEFINITIONAL_REPRESENTATION('',(#11011),#11015);
+#11011 = LINE('',#11012,#11013);
+#11012 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#11013 = VECTOR('',#11014,1.);
+#11014 = DIRECTION('',(0.,1.));
+#11015 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11016 = PCURVE('',#11017,#11022);
+#11017 = PLANE('',#11018);
+#11018 = AXIS2_PLACEMENT_3D('',#11019,#11020,#11021);
+#11019 = CARTESIAN_POINT('',(3.6725,-1.27,-0.34105853382));
+#11020 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#11021 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#11022 = DEFINITIONAL_REPRESENTATION('',(#11023),#11027);
+#11023 = LINE('',#11024,#11025);
+#11024 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#11025 = VECTOR('',#11026,1.);
+#11026 = DIRECTION('',(0.,-1.));
+#11027 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11028 = ORIENTED_EDGE('',*,*,#11029,.F.);
+#11029 = EDGE_CURVE('',#11030,#11002,#11032,.T.);
+#11030 = VERTEX_POINT('',#11031);
+#11031 = CARTESIAN_POINT('',(3.175,-0.72,2.285));
+#11032 = SURFACE_CURVE('',#11033,(#11037,#11044),.PCURVE_S1.);
+#11033 = LINE('',#11034,#11035);
+#11034 = CARTESIAN_POINT('',(3.175,-0.72,2.285));
+#11035 = VECTOR('',#11036,1.);
+#11036 = DIRECTION('',(1.,0.,0.));
+#11037 = PCURVE('',#10712,#11038);
+#11038 = DEFINITIONAL_REPRESENTATION('',(#11039),#11043);
+#11039 = LINE('',#11040,#11041);
+#11040 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#11041 = VECTOR('',#11042,1.);
+#11042 = DIRECTION('',(1.,6.704108115824E-59));
+#11043 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11044 = PCURVE('',#11045,#11050);
+#11045 = PLANE('',#11046);
+#11046 = AXIS2_PLACEMENT_3D('',#11047,#11048,#11049);
+#11047 = CARTESIAN_POINT('',(3.175,-1.82,2.285));
+#11048 = DIRECTION('',(0.,0.,1.));
+#11049 = DIRECTION('',(1.,0.,0.));
+#11050 = DEFINITIONAL_REPRESENTATION('',(#11051),#11055);
+#11051 = LINE('',#11052,#11053);
+#11052 = CARTESIAN_POINT('',(0.,1.1));
+#11053 = VECTOR('',#11054,1.);
+#11054 = DIRECTION('',(1.,0.));
+#11055 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11056 = ORIENTED_EDGE('',*,*,#11057,.T.);
+#11057 = EDGE_CURVE('',#11030,#10922,#11058,.T.);
+#11058 = SURFACE_CURVE('',#11059,(#11063,#11070),.PCURVE_S1.);
+#11059 = LINE('',#11060,#11061);
+#11060 = CARTESIAN_POINT('',(3.175,-0.72,2.285));
+#11061 = VECTOR('',#11062,1.);
+#11062 = DIRECTION('',(0.,0.,1.));
+#11063 = PCURVE('',#10712,#11064);
+#11064 = DEFINITIONAL_REPRESENTATION('',(#11065),#11069);
+#11065 = LINE('',#11066,#11067);
+#11066 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#11067 = VECTOR('',#11068,1.);
+#11068 = DIRECTION('',(0.,-1.));
+#11069 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11070 = PCURVE('',#11071,#11076);
+#11071 = PLANE('',#11072);
+#11072 = AXIS2_PLACEMENT_3D('',#11073,#11074,#11075);
+#11073 = CARTESIAN_POINT('',(3.175,-1.82,2.285));
+#11074 = DIRECTION('',(1.,0.,0.));
+#11075 = DIRECTION('',(0.,0.,1.));
+#11076 = DEFINITIONAL_REPRESENTATION('',(#11077),#11081);
+#11077 = LINE('',#11078,#11079);
+#11078 = CARTESIAN_POINT('',(0.,-1.1));
+#11079 = VECTOR('',#11080,1.);
+#11080 = DIRECTION('',(1.,0.));
+#11081 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11082 = ADVANCED_FACE('',(#11083),#10906,.T.);
+#11083 = FACE_BOUND('',#11084,.F.);
+#11084 = EDGE_LOOP('',(#11085,#11109,#11130,#11131));
+#11085 = ORIENTED_EDGE('',*,*,#11086,.T.);
+#11086 = EDGE_CURVE('',#10865,#11087,#11089,.T.);
+#11087 = VERTEX_POINT('',#11088);
+#11088 = CARTESIAN_POINT('',(3.81,-1.82,2.56));
+#11089 = SURFACE_CURVE('',#11090,(#11095,#11102),.PCURVE_S1.);
+#11090 = CIRCLE('',#11091,0.1375);
+#11091 = AXIS2_PLACEMENT_3D('',#11092,#11093,#11094);
+#11092 = CARTESIAN_POINT('',(3.81,-1.82,2.4225));
+#11093 = DIRECTION('',(0.,-1.,0.));
+#11094 = DIRECTION('',(0.,0.,1.));
+#11095 = PCURVE('',#10906,#11096);
+#11096 = DEFINITIONAL_REPRESENTATION('',(#11097),#11101);
+#11097 = LINE('',#11098,#11099);
+#11098 = CARTESIAN_POINT('',(4.712388980385,-1.7763568394E-15));
+#11099 = VECTOR('',#11100,1.);
+#11100 = DIRECTION('',(-1.,0.));
+#11101 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11102 = PCURVE('',#10880,#11103);
+#11103 = DEFINITIONAL_REPRESENTATION('',(#11104),#11108);
+#11104 = CIRCLE('',#11105,0.1375);
+#11105 = AXIS2_PLACEMENT_2D('',#11106,#11107);
+#11106 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#11107 = DIRECTION('',(0.,-1.));
+#11108 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11109 = ORIENTED_EDGE('',*,*,#11110,.T.);
+#11110 = EDGE_CURVE('',#11087,#10924,#11111,.T.);
+#11111 = SURFACE_CURVE('',#11112,(#11116,#11123),.PCURVE_S1.);
+#11112 = LINE('',#11113,#11114);
+#11113 = CARTESIAN_POINT('',(3.81,-1.82,2.56));
+#11114 = VECTOR('',#11115,1.);
+#11115 = DIRECTION('',(0.,1.,0.));
+#11116 = PCURVE('',#10906,#11117);
+#11117 = DEFINITIONAL_REPRESENTATION('',(#11118),#11122);
+#11118 = LINE('',#11119,#11120);
+#11119 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#11120 = VECTOR('',#11121,1.);
+#11121 = DIRECTION('',(-0.,1.));
+#11122 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11123 = PCURVE('',#10939,#11124);
+#11124 = DEFINITIONAL_REPRESENTATION('',(#11125),#11129);
+#11125 = LINE('',#11126,#11127);
+#11126 = CARTESIAN_POINT('',(0.24875,-0.55));
+#11127 = VECTOR('',#11128,1.);
+#11128 = DIRECTION('',(0.,1.));
+#11129 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11130 = ORIENTED_EDGE('',*,*,#10951,.F.);
+#11131 = ORIENTED_EDGE('',*,*,#10892,.F.);
+#11132 = ADVANCED_FACE('',(#11133),#10740,.T.);
+#11133 = FACE_BOUND('',#11134,.T.);
+#11134 = EDGE_LOOP('',(#11135,#11136,#11137,#11160));
+#11135 = ORIENTED_EDGE('',*,*,#10978,.T.);
+#11136 = ORIENTED_EDGE('',*,*,#10724,.T.);
+#11137 = ORIENTED_EDGE('',*,*,#11138,.F.);
+#11138 = EDGE_CURVE('',#11139,#10725,#11141,.T.);
+#11139 = VERTEX_POINT('',#11140);
+#11140 = CARTESIAN_POINT('',(3.6725,-0.995,0.));
+#11141 = SURFACE_CURVE('',#11142,(#11146,#11153),.PCURVE_S1.);
+#11142 = LINE('',#11143,#11144);
+#11143 = CARTESIAN_POINT('',(3.6725,-0.995,0.));
+#11144 = VECTOR('',#11145,1.);
+#11145 = DIRECTION('',(1.,0.,0.));
+#11146 = PCURVE('',#10740,#11147);
+#11147 = DEFINITIONAL_REPRESENTATION('',(#11148),#11152);
+#11148 = LINE('',#11149,#11150);
+#11149 = CARTESIAN_POINT('',(0.388908729653,0.));
+#11150 = VECTOR('',#11151,1.);
+#11151 = DIRECTION('',(0.,-1.));
+#11152 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11153 = PCURVE('',#10768,#11154);
+#11154 = DEFINITIONAL_REPRESENTATION('',(#11155),#11159);
+#11155 = LINE('',#11156,#11157);
+#11156 = CARTESIAN_POINT('',(0.,0.));
+#11157 = VECTOR('',#11158,1.);
+#11158 = DIRECTION('',(0.,-1.));
+#11159 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11160 = ORIENTED_EDGE('',*,*,#11161,.F.);
+#11161 = EDGE_CURVE('',#10979,#11139,#11162,.T.);
+#11162 = SURFACE_CURVE('',#11163,(#11167,#11174),.PCURVE_S1.);
+#11163 = LINE('',#11164,#11165);
+#11164 = CARTESIAN_POINT('',(3.6725,-0.72,0.275));
+#11165 = VECTOR('',#11166,1.);
+#11166 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#11167 = PCURVE('',#10740,#11168);
+#11168 = DEFINITIONAL_REPRESENTATION('',(#11169),#11173);
+#11169 = LINE('',#11170,#11171);
+#11170 = CARTESIAN_POINT('',(0.,0.));
+#11171 = VECTOR('',#11172,1.);
+#11172 = DIRECTION('',(1.,0.));
+#11173 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11174 = PCURVE('',#11017,#11175);
+#11175 = DEFINITIONAL_REPRESENTATION('',(#11176),#11180);
+#11176 = LINE('',#11177,#11178);
+#11177 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#11178 = VECTOR('',#11179,1.);
+#11179 = DIRECTION('',(0.707106781187,-0.707106781187));
+#11180 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11181 = ADVANCED_FACE('',(#11182),#10880,.T.);
+#11182 = FACE_BOUND('',#11183,.T.);
+#11183 = EDGE_LOOP('',(#11184,#11185,#11186,#11209,#11232,#11255,#11278)
+ );
+#11184 = ORIENTED_EDGE('',*,*,#10864,.T.);
+#11185 = ORIENTED_EDGE('',*,*,#11086,.T.);
+#11186 = ORIENTED_EDGE('',*,*,#11187,.F.);
+#11187 = EDGE_CURVE('',#11188,#11087,#11190,.T.);
+#11188 = VERTEX_POINT('',#11189);
+#11189 = CARTESIAN_POINT('',(3.175,-1.82,2.56));
+#11190 = SURFACE_CURVE('',#11191,(#11195,#11202),.PCURVE_S1.);
+#11191 = LINE('',#11192,#11193);
+#11192 = CARTESIAN_POINT('',(3.6725,-1.82,2.56));
+#11193 = VECTOR('',#11194,1.);
+#11194 = DIRECTION('',(1.,0.,0.));
+#11195 = PCURVE('',#10880,#11196);
+#11196 = DEFINITIONAL_REPRESENTATION('',(#11197),#11201);
+#11197 = LINE('',#11198,#11199);
+#11198 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#11199 = VECTOR('',#11200,1.);
+#11200 = DIRECTION('',(-1.,1.51269824963E-59));
+#11201 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11202 = PCURVE('',#10939,#11203);
+#11203 = DEFINITIONAL_REPRESENTATION('',(#11204),#11208);
+#11204 = LINE('',#11205,#11206);
+#11205 = CARTESIAN_POINT('',(0.11125,-0.55));
+#11206 = VECTOR('',#11207,1.);
+#11207 = DIRECTION('',(1.,-2.162055258902E-60));
+#11208 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11209 = ORIENTED_EDGE('',*,*,#11210,.F.);
+#11210 = EDGE_CURVE('',#11211,#11188,#11213,.T.);
+#11211 = VERTEX_POINT('',#11212);
+#11212 = CARTESIAN_POINT('',(3.175,-1.82,2.285));
+#11213 = SURFACE_CURVE('',#11214,(#11218,#11225),.PCURVE_S1.);
+#11214 = LINE('',#11215,#11216);
+#11215 = CARTESIAN_POINT('',(3.175,-1.82,2.285));
+#11216 = VECTOR('',#11217,1.);
+#11217 = DIRECTION('',(0.,0.,1.));
+#11218 = PCURVE('',#10880,#11219);
+#11219 = DEFINITIONAL_REPRESENTATION('',(#11220),#11224);
+#11220 = LINE('',#11221,#11222);
+#11221 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#11222 = VECTOR('',#11223,1.);
+#11223 = DIRECTION('',(0.,-1.));
+#11224 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11225 = PCURVE('',#11071,#11226);
+#11226 = DEFINITIONAL_REPRESENTATION('',(#11227),#11231);
+#11227 = LINE('',#11228,#11229);
+#11228 = CARTESIAN_POINT('',(0.,0.));
+#11229 = VECTOR('',#11230,1.);
+#11230 = DIRECTION('',(1.,0.));
+#11231 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11232 = ORIENTED_EDGE('',*,*,#11233,.T.);
+#11233 = EDGE_CURVE('',#11211,#11234,#11236,.T.);
+#11234 = VERTEX_POINT('',#11235);
+#11235 = CARTESIAN_POINT('',(3.6725,-1.82,2.285));
+#11236 = SURFACE_CURVE('',#11237,(#11241,#11248),.PCURVE_S1.);
+#11237 = LINE('',#11238,#11239);
+#11238 = CARTESIAN_POINT('',(3.175,-1.82,2.285));
+#11239 = VECTOR('',#11240,1.);
+#11240 = DIRECTION('',(1.,0.,0.));
+#11241 = PCURVE('',#10880,#11242);
+#11242 = DEFINITIONAL_REPRESENTATION('',(#11243),#11247);
+#11243 = LINE('',#11244,#11245);
+#11244 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#11245 = VECTOR('',#11246,1.);
+#11246 = DIRECTION('',(-1.,1.51269824963E-59));
+#11247 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11248 = PCURVE('',#11045,#11249);
+#11249 = DEFINITIONAL_REPRESENTATION('',(#11250),#11254);
+#11250 = LINE('',#11251,#11252);
+#11251 = CARTESIAN_POINT('',(0.,0.));
+#11252 = VECTOR('',#11253,1.);
+#11253 = DIRECTION('',(1.,0.));
+#11254 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11255 = ORIENTED_EDGE('',*,*,#11256,.F.);
+#11256 = EDGE_CURVE('',#11257,#11234,#11259,.T.);
+#11257 = VERTEX_POINT('',#11258);
+#11258 = CARTESIAN_POINT('',(3.6725,-1.82,0.275));
+#11259 = SURFACE_CURVE('',#11260,(#11264,#11271),.PCURVE_S1.);
+#11260 = LINE('',#11261,#11262);
+#11261 = CARTESIAN_POINT('',(3.6725,-1.82,0.275));
+#11262 = VECTOR('',#11263,1.);
+#11263 = DIRECTION('',(0.,0.,1.));
+#11264 = PCURVE('',#10880,#11265);
+#11265 = DEFINITIONAL_REPRESENTATION('',(#11266),#11270);
+#11266 = LINE('',#11267,#11268);
+#11267 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#11268 = VECTOR('',#11269,1.);
+#11269 = DIRECTION('',(0.,-1.));
+#11270 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11271 = PCURVE('',#11017,#11272);
+#11272 = DEFINITIONAL_REPRESENTATION('',(#11273),#11277);
+#11273 = LINE('',#11274,#11275);
+#11274 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#11275 = VECTOR('',#11276,1.);
+#11276 = DIRECTION('',(0.,1.));
+#11277 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11278 = ORIENTED_EDGE('',*,*,#11279,.T.);
+#11279 = EDGE_CURVE('',#11257,#10837,#11280,.T.);
+#11280 = SURFACE_CURVE('',#11281,(#11285,#11292),.PCURVE_S1.);
+#11281 = LINE('',#11282,#11283);
+#11282 = CARTESIAN_POINT('',(3.6725,-1.82,0.275));
+#11283 = VECTOR('',#11284,1.);
+#11284 = DIRECTION('',(1.,0.,0.));
+#11285 = PCURVE('',#10880,#11286);
+#11286 = DEFINITIONAL_REPRESENTATION('',(#11287),#11291);
+#11287 = LINE('',#11288,#11289);
+#11288 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#11289 = VECTOR('',#11290,1.);
+#11290 = DIRECTION('',(-1.,1.51269824963E-59));
+#11291 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11292 = PCURVE('',#10852,#11293);
+#11293 = DEFINITIONAL_REPRESENTATION('',(#11294),#11298);
+#11294 = LINE('',#11295,#11296);
+#11295 = CARTESIAN_POINT('',(0.388908729653,0.));
+#11296 = VECTOR('',#11297,1.);
+#11297 = DIRECTION('',(0.,-1.));
+#11298 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11299 = ADVANCED_FACE('',(#11300),#10768,.T.);
+#11300 = FACE_BOUND('',#11301,.T.);
+#11301 = EDGE_LOOP('',(#11302,#11303,#11304,#11327));
+#11302 = ORIENTED_EDGE('',*,*,#11138,.T.);
+#11303 = ORIENTED_EDGE('',*,*,#10752,.T.);
+#11304 = ORIENTED_EDGE('',*,*,#11305,.F.);
+#11305 = EDGE_CURVE('',#11306,#10753,#11308,.T.);
+#11306 = VERTEX_POINT('',#11307);
+#11307 = CARTESIAN_POINT('',(3.6725,-0.995,-3.5));
+#11308 = SURFACE_CURVE('',#11309,(#11313,#11320),.PCURVE_S1.);
+#11309 = LINE('',#11310,#11311);
+#11310 = CARTESIAN_POINT('',(3.6725,-0.995,-3.5));
+#11311 = VECTOR('',#11312,1.);
+#11312 = DIRECTION('',(1.,0.,0.));
+#11313 = PCURVE('',#10768,#11314);
+#11314 = DEFINITIONAL_REPRESENTATION('',(#11315),#11319);
+#11315 = LINE('',#11316,#11317);
+#11316 = CARTESIAN_POINT('',(3.5,0.));
+#11317 = VECTOR('',#11318,1.);
+#11318 = DIRECTION('',(0.,-1.));
+#11319 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11320 = PCURVE('',#10796,#11321);
+#11321 = DEFINITIONAL_REPRESENTATION('',(#11322),#11326);
+#11322 = LINE('',#11323,#11324);
+#11323 = CARTESIAN_POINT('',(7.771561172376E-16,0.));
+#11324 = VECTOR('',#11325,1.);
+#11325 = DIRECTION('',(0.,-1.));
+#11326 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11327 = ORIENTED_EDGE('',*,*,#11328,.F.);
+#11328 = EDGE_CURVE('',#11139,#11306,#11329,.T.);
+#11329 = SURFACE_CURVE('',#11330,(#11334,#11341),.PCURVE_S1.);
+#11330 = LINE('',#11331,#11332);
+#11331 = CARTESIAN_POINT('',(3.6725,-0.995,0.));
+#11332 = VECTOR('',#11333,1.);
+#11333 = DIRECTION('',(0.,0.,-1.));
+#11334 = PCURVE('',#10768,#11335);
+#11335 = DEFINITIONAL_REPRESENTATION('',(#11336),#11340);
+#11336 = LINE('',#11337,#11338);
+#11337 = CARTESIAN_POINT('',(0.,0.));
+#11338 = VECTOR('',#11339,1.);
+#11339 = DIRECTION('',(1.,0.));
+#11340 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11341 = PCURVE('',#11017,#11342);
+#11342 = DEFINITIONAL_REPRESENTATION('',(#11343),#11347);
+#11343 = LINE('',#11344,#11345);
+#11344 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#11345 = VECTOR('',#11346,1.);
+#11346 = DIRECTION('',(0.,-1.));
+#11347 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11348 = ADVANCED_FACE('',(#11349),#10852,.T.);
+#11349 = FACE_BOUND('',#11350,.T.);
+#11350 = EDGE_LOOP('',(#11351,#11374,#11375,#11376));
+#11351 = ORIENTED_EDGE('',*,*,#11352,.T.);
+#11352 = EDGE_CURVE('',#11353,#10809,#11355,.T.);
+#11353 = VERTEX_POINT('',#11354);
+#11354 = CARTESIAN_POINT('',(3.6725,-1.545,0.));
+#11355 = SURFACE_CURVE('',#11356,(#11360,#11367),.PCURVE_S1.);
+#11356 = LINE('',#11357,#11358);
+#11357 = CARTESIAN_POINT('',(3.6725,-1.545,0.));
+#11358 = VECTOR('',#11359,1.);
+#11359 = DIRECTION('',(1.,0.,0.));
+#11360 = PCURVE('',#10852,#11361);
+#11361 = DEFINITIONAL_REPRESENTATION('',(#11362),#11366);
+#11362 = LINE('',#11363,#11364);
+#11363 = CARTESIAN_POINT('',(-1.177569344013E-16,0.));
+#11364 = VECTOR('',#11365,1.);
+#11365 = DIRECTION('',(0.,-1.));
+#11366 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11367 = PCURVE('',#10824,#11368);
+#11368 = DEFINITIONAL_REPRESENTATION('',(#11369),#11373);
+#11369 = LINE('',#11370,#11371);
+#11370 = CARTESIAN_POINT('',(3.5,0.));
+#11371 = VECTOR('',#11372,1.);
+#11372 = DIRECTION('',(0.,-1.));
+#11373 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11374 = ORIENTED_EDGE('',*,*,#10836,.T.);
+#11375 = ORIENTED_EDGE('',*,*,#11279,.F.);
+#11376 = ORIENTED_EDGE('',*,*,#11377,.F.);
+#11377 = EDGE_CURVE('',#11353,#11257,#11378,.T.);
+#11378 = SURFACE_CURVE('',#11379,(#11383,#11390),.PCURVE_S1.);
+#11379 = LINE('',#11380,#11381);
+#11380 = CARTESIAN_POINT('',(3.6725,-1.545,0.));
+#11381 = VECTOR('',#11382,1.);
+#11382 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#11383 = PCURVE('',#10852,#11384);
+#11384 = DEFINITIONAL_REPRESENTATION('',(#11385),#11389);
+#11385 = LINE('',#11386,#11387);
+#11386 = CARTESIAN_POINT('',(0.,0.));
+#11387 = VECTOR('',#11388,1.);
+#11388 = DIRECTION('',(1.,0.));
+#11389 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11390 = PCURVE('',#11017,#11391);
+#11391 = DEFINITIONAL_REPRESENTATION('',(#11392),#11396);
+#11392 = LINE('',#11393,#11394);
+#11393 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#11394 = VECTOR('',#11395,1.);
+#11395 = DIRECTION('',(0.707106781187,0.707106781187));
+#11396 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11397 = ADVANCED_FACE('',(#11398),#10796,.T.);
+#11398 = FACE_BOUND('',#11399,.T.);
+#11399 = EDGE_LOOP('',(#11400,#11401,#11402,#11425));
+#11400 = ORIENTED_EDGE('',*,*,#11305,.T.);
+#11401 = ORIENTED_EDGE('',*,*,#10780,.T.);
+#11402 = ORIENTED_EDGE('',*,*,#11403,.F.);
+#11403 = EDGE_CURVE('',#11404,#10781,#11406,.T.);
+#11404 = VERTEX_POINT('',#11405);
+#11405 = CARTESIAN_POINT('',(3.6725,-1.545,-3.5));
+#11406 = SURFACE_CURVE('',#11407,(#11411,#11418),.PCURVE_S1.);
+#11407 = LINE('',#11408,#11409);
+#11408 = CARTESIAN_POINT('',(3.6725,-1.545,-3.5));
+#11409 = VECTOR('',#11410,1.);
+#11410 = DIRECTION('',(1.,0.,0.));
+#11411 = PCURVE('',#10796,#11412);
+#11412 = DEFINITIONAL_REPRESENTATION('',(#11413),#11417);
+#11413 = LINE('',#11414,#11415);
+#11414 = CARTESIAN_POINT('',(0.55,0.));
+#11415 = VECTOR('',#11416,1.);
+#11416 = DIRECTION('',(0.,-1.));
+#11417 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11418 = PCURVE('',#10824,#11419);
+#11419 = DEFINITIONAL_REPRESENTATION('',(#11420),#11424);
+#11420 = LINE('',#11421,#11422);
+#11421 = CARTESIAN_POINT('',(0.,0.));
+#11422 = VECTOR('',#11423,1.);
+#11423 = DIRECTION('',(0.,-1.));
+#11424 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11425 = ORIENTED_EDGE('',*,*,#11426,.F.);
+#11426 = EDGE_CURVE('',#11306,#11404,#11427,.T.);
+#11427 = SURFACE_CURVE('',#11428,(#11432,#11439),.PCURVE_S1.);
+#11428 = LINE('',#11429,#11430);
+#11429 = CARTESIAN_POINT('',(3.6725,-0.995,-3.5));
+#11430 = VECTOR('',#11431,1.);
+#11431 = DIRECTION('',(0.,-1.,0.));
+#11432 = PCURVE('',#10796,#11433);
+#11433 = DEFINITIONAL_REPRESENTATION('',(#11434),#11438);
+#11434 = LINE('',#11435,#11436);
+#11435 = CARTESIAN_POINT('',(0.,-0.));
+#11436 = VECTOR('',#11437,1.);
+#11437 = DIRECTION('',(1.,0.));
+#11438 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11439 = PCURVE('',#11017,#11440);
+#11440 = DEFINITIONAL_REPRESENTATION('',(#11441),#11445);
+#11441 = LINE('',#11442,#11443);
+#11442 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#11443 = VECTOR('',#11444,1.);
+#11444 = DIRECTION('',(1.,2.226071387182E-62));
+#11445 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11446 = ADVANCED_FACE('',(#11447),#10824,.T.);
+#11447 = FACE_BOUND('',#11448,.T.);
+#11448 = EDGE_LOOP('',(#11449,#11450,#11451,#11452));
+#11449 = ORIENTED_EDGE('',*,*,#11403,.T.);
+#11450 = ORIENTED_EDGE('',*,*,#10808,.T.);
+#11451 = ORIENTED_EDGE('',*,*,#11352,.F.);
+#11452 = ORIENTED_EDGE('',*,*,#11453,.F.);
+#11453 = EDGE_CURVE('',#11404,#11353,#11454,.T.);
+#11454 = SURFACE_CURVE('',#11455,(#11459,#11466),.PCURVE_S1.);
+#11455 = LINE('',#11456,#11457);
+#11456 = CARTESIAN_POINT('',(3.6725,-1.545,-3.5));
+#11457 = VECTOR('',#11458,1.);
+#11458 = DIRECTION('',(0.,0.,1.));
+#11459 = PCURVE('',#10824,#11460);
+#11460 = DEFINITIONAL_REPRESENTATION('',(#11461),#11465);
+#11461 = LINE('',#11462,#11463);
+#11462 = CARTESIAN_POINT('',(0.,0.));
+#11463 = VECTOR('',#11464,1.);
+#11464 = DIRECTION('',(1.,0.));
+#11465 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11466 = PCURVE('',#11017,#11467);
+#11467 = DEFINITIONAL_REPRESENTATION('',(#11468),#11472);
+#11468 = LINE('',#11469,#11470);
+#11469 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#11470 = VECTOR('',#11471,1.);
+#11471 = DIRECTION('',(0.,1.));
+#11472 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11473 = ADVANCED_FACE('',(#11474),#10939,.T.);
+#11474 = FACE_BOUND('',#11475,.T.);
+#11475 = EDGE_LOOP('',(#11476,#11477,#11478,#11479));
+#11476 = ORIENTED_EDGE('',*,*,#11187,.T.);
+#11477 = ORIENTED_EDGE('',*,*,#11110,.T.);
+#11478 = ORIENTED_EDGE('',*,*,#10921,.F.);
+#11479 = ORIENTED_EDGE('',*,*,#11480,.F.);
+#11480 = EDGE_CURVE('',#11188,#10922,#11481,.T.);
+#11481 = SURFACE_CURVE('',#11482,(#11486,#11493),.PCURVE_S1.);
+#11482 = LINE('',#11483,#11484);
+#11483 = CARTESIAN_POINT('',(3.175,-1.82,2.56));
+#11484 = VECTOR('',#11485,1.);
+#11485 = DIRECTION('',(0.,1.,0.));
+#11486 = PCURVE('',#10939,#11487);
+#11487 = DEFINITIONAL_REPRESENTATION('',(#11488),#11492);
+#11488 = LINE('',#11489,#11490);
+#11489 = CARTESIAN_POINT('',(-0.38625,-0.55));
+#11490 = VECTOR('',#11491,1.);
+#11491 = DIRECTION('',(0.,1.));
+#11492 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11493 = PCURVE('',#11071,#11494);
+#11494 = DEFINITIONAL_REPRESENTATION('',(#11495),#11499);
+#11495 = LINE('',#11496,#11497);
+#11496 = CARTESIAN_POINT('',(0.275,0.));
+#11497 = VECTOR('',#11498,1.);
+#11498 = DIRECTION('',(0.,-1.));
+#11499 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11500 = ADVANCED_FACE('',(#11501),#11071,.F.);
+#11501 = FACE_BOUND('',#11502,.F.);
+#11502 = EDGE_LOOP('',(#11503,#11504,#11525,#11526));
+#11503 = ORIENTED_EDGE('',*,*,#11210,.F.);
+#11504 = ORIENTED_EDGE('',*,*,#11505,.T.);
+#11505 = EDGE_CURVE('',#11211,#11030,#11506,.T.);
+#11506 = SURFACE_CURVE('',#11507,(#11511,#11518),.PCURVE_S1.);
+#11507 = LINE('',#11508,#11509);
+#11508 = CARTESIAN_POINT('',(3.175,-1.82,2.285));
+#11509 = VECTOR('',#11510,1.);
+#11510 = DIRECTION('',(0.,1.,0.));
+#11511 = PCURVE('',#11071,#11512);
+#11512 = DEFINITIONAL_REPRESENTATION('',(#11513),#11517);
+#11513 = LINE('',#11514,#11515);
+#11514 = CARTESIAN_POINT('',(0.,0.));
+#11515 = VECTOR('',#11516,1.);
+#11516 = DIRECTION('',(0.,-1.));
+#11517 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11518 = PCURVE('',#11045,#11519);
+#11519 = DEFINITIONAL_REPRESENTATION('',(#11520),#11524);
+#11520 = LINE('',#11521,#11522);
+#11521 = CARTESIAN_POINT('',(0.,0.));
+#11522 = VECTOR('',#11523,1.);
+#11523 = DIRECTION('',(0.,1.));
+#11524 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11525 = ORIENTED_EDGE('',*,*,#11057,.T.);
+#11526 = ORIENTED_EDGE('',*,*,#11480,.F.);
+#11527 = ADVANCED_FACE('',(#11528),#11045,.F.);
+#11528 = FACE_BOUND('',#11529,.F.);
+#11529 = EDGE_LOOP('',(#11530,#11531,#11532,#11553));
+#11530 = ORIENTED_EDGE('',*,*,#11505,.F.);
+#11531 = ORIENTED_EDGE('',*,*,#11233,.T.);
+#11532 = ORIENTED_EDGE('',*,*,#11533,.T.);
+#11533 = EDGE_CURVE('',#11234,#11002,#11534,.T.);
+#11534 = SURFACE_CURVE('',#11535,(#11539,#11546),.PCURVE_S1.);
+#11535 = LINE('',#11536,#11537);
+#11536 = CARTESIAN_POINT('',(3.6725,-1.82,2.285));
+#11537 = VECTOR('',#11538,1.);
+#11538 = DIRECTION('',(0.,1.,0.));
+#11539 = PCURVE('',#11045,#11540);
+#11540 = DEFINITIONAL_REPRESENTATION('',(#11541),#11545);
+#11541 = LINE('',#11542,#11543);
+#11542 = CARTESIAN_POINT('',(0.4975,0.));
+#11543 = VECTOR('',#11544,1.);
+#11544 = DIRECTION('',(0.,1.));
+#11545 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11546 = PCURVE('',#11017,#11547);
+#11547 = DEFINITIONAL_REPRESENTATION('',(#11548),#11552);
+#11548 = LINE('',#11549,#11550);
+#11549 = CARTESIAN_POINT('',(0.55,2.62605853382));
+#11550 = VECTOR('',#11551,1.);
+#11551 = DIRECTION('',(-1.,-2.226071387182E-62));
+#11552 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11553 = ORIENTED_EDGE('',*,*,#11029,.F.);
+#11554 = ADVANCED_FACE('',(#11555),#11017,.T.);
+#11555 = FACE_BOUND('',#11556,.T.);
+#11556 = EDGE_LOOP('',(#11557,#11558,#11559,#11560,#11561,#11562,#11563,
+ #11564));
+#11557 = ORIENTED_EDGE('',*,*,#11256,.T.);
+#11558 = ORIENTED_EDGE('',*,*,#11533,.T.);
+#11559 = ORIENTED_EDGE('',*,*,#11001,.T.);
+#11560 = ORIENTED_EDGE('',*,*,#11161,.T.);
+#11561 = ORIENTED_EDGE('',*,*,#11328,.T.);
+#11562 = ORIENTED_EDGE('',*,*,#11426,.T.);
+#11563 = ORIENTED_EDGE('',*,*,#11453,.T.);
+#11564 = ORIENTED_EDGE('',*,*,#11377,.T.);
+#11565 = MANIFOLD_SOLID_BREP('',#11566);
+#11566 = CLOSED_SHELL('',(#11567,#11799,#11964,#12014,#12063,#12181,
+ #12230,#12279,#12328,#12355,#12382,#12409,#12436));
+#11567 = ADVANCED_FACE('',(#11568),#11582,.F.);
+#11568 = FACE_BOUND('',#11569,.F.);
+#11569 = EDGE_LOOP('',(#11570,#11605,#11633,#11661,#11689,#11717,#11745,
+ #11773));
+#11570 = ORIENTED_EDGE('',*,*,#11571,.T.);
+#11571 = EDGE_CURVE('',#11572,#11574,#11576,.T.);
+#11572 = VERTEX_POINT('',#11573);
+#11573 = CARTESIAN_POINT('',(-3.9475,-4.36,2.4225));
+#11574 = VERTEX_POINT('',#11575);
+#11575 = CARTESIAN_POINT('',(-3.9475,-4.36,0.275));
+#11576 = SURFACE_CURVE('',#11577,(#11581,#11593),.PCURVE_S1.);
+#11577 = LINE('',#11578,#11579);
+#11578 = CARTESIAN_POINT('',(-3.9475,-4.36,2.56));
+#11579 = VECTOR('',#11580,1.);
+#11580 = DIRECTION('',(0.,0.,-1.));
+#11581 = PCURVE('',#11582,#11587);
+#11582 = PLANE('',#11583);
+#11583 = AXIS2_PLACEMENT_3D('',#11584,#11585,#11586);
+#11584 = CARTESIAN_POINT('',(-3.9475,-3.81,-0.34105853382));
+#11585 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#11586 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#11587 = DEFINITIONAL_REPRESENTATION('',(#11588),#11592);
+#11588 = LINE('',#11589,#11590);
+#11589 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#11590 = VECTOR('',#11591,1.);
+#11591 = DIRECTION('',(0.,-1.));
+#11592 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11593 = PCURVE('',#11594,#11599);
+#11594 = PLANE('',#11595);
+#11595 = AXIS2_PLACEMENT_3D('',#11596,#11597,#11598);
+#11596 = CARTESIAN_POINT('',(-3.724778209321,-4.36,1.581028209321));
+#11597 = DIRECTION('',(1.58726821659E-29,-1.,-1.055919227411E-30));
+#11598 = DIRECTION('',(-1.,-1.58726821659E-29,0.));
+#11599 = DEFINITIONAL_REPRESENTATION('',(#11600),#11604);
+#11600 = LINE('',#11601,#11602);
+#11601 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#11602 = VECTOR('',#11603,1.);
+#11603 = DIRECTION('',(0.,1.));
+#11604 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11605 = ORIENTED_EDGE('',*,*,#11606,.T.);
+#11606 = EDGE_CURVE('',#11574,#11607,#11609,.T.);
+#11607 = VERTEX_POINT('',#11608);
+#11608 = CARTESIAN_POINT('',(-3.9475,-4.085,0.));
+#11609 = SURFACE_CURVE('',#11610,(#11614,#11621),.PCURVE_S1.);
+#11610 = LINE('',#11611,#11612);
+#11611 = CARTESIAN_POINT('',(-3.9475,-4.36,0.275));
+#11612 = VECTOR('',#11613,1.);
+#11613 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#11614 = PCURVE('',#11582,#11615);
+#11615 = DEFINITIONAL_REPRESENTATION('',(#11616),#11620);
+#11616 = LINE('',#11617,#11618);
+#11617 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#11618 = VECTOR('',#11619,1.);
+#11619 = DIRECTION('',(0.707106781187,-0.707106781187));
+#11620 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11621 = PCURVE('',#11622,#11627);
+#11622 = PLANE('',#11623);
+#11623 = AXIS2_PLACEMENT_3D('',#11624,#11625,#11626);
+#11624 = CARTESIAN_POINT('',(-3.6725,-4.36,0.275));
+#11625 = DIRECTION('',(-0.,-0.707106781187,-0.707106781187));
+#11626 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#11627 = DEFINITIONAL_REPRESENTATION('',(#11628),#11632);
+#11628 = LINE('',#11629,#11630);
+#11629 = CARTESIAN_POINT('',(0.,-0.275));
+#11630 = VECTOR('',#11631,1.);
+#11631 = DIRECTION('',(1.,0.));
+#11632 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11633 = ORIENTED_EDGE('',*,*,#11634,.T.);
+#11634 = EDGE_CURVE('',#11607,#11635,#11637,.T.);
+#11635 = VERTEX_POINT('',#11636);
+#11636 = CARTESIAN_POINT('',(-3.9475,-4.085,-3.5));
+#11637 = SURFACE_CURVE('',#11638,(#11642,#11649),.PCURVE_S1.);
+#11638 = LINE('',#11639,#11640);
+#11639 = CARTESIAN_POINT('',(-3.9475,-4.085,0.));
+#11640 = VECTOR('',#11641,1.);
+#11641 = DIRECTION('',(0.,0.,-1.));
+#11642 = PCURVE('',#11582,#11643);
+#11643 = DEFINITIONAL_REPRESENTATION('',(#11644),#11648);
+#11644 = LINE('',#11645,#11646);
+#11645 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#11646 = VECTOR('',#11647,1.);
+#11647 = DIRECTION('',(0.,-1.));
+#11648 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11649 = PCURVE('',#11650,#11655);
+#11650 = PLANE('',#11651);
+#11651 = AXIS2_PLACEMENT_3D('',#11652,#11653,#11654);
+#11652 = CARTESIAN_POINT('',(-3.6725,-4.085,0.));
+#11653 = DIRECTION('',(-0.,-1.,-0.));
+#11654 = DIRECTION('',(0.,0.,-1.));
+#11655 = DEFINITIONAL_REPRESENTATION('',(#11656),#11660);
+#11656 = LINE('',#11657,#11658);
+#11657 = CARTESIAN_POINT('',(0.,-0.275));
+#11658 = VECTOR('',#11659,1.);
+#11659 = DIRECTION('',(1.,0.));
+#11660 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11661 = ORIENTED_EDGE('',*,*,#11662,.T.);
+#11662 = EDGE_CURVE('',#11635,#11663,#11665,.T.);
+#11663 = VERTEX_POINT('',#11664);
+#11664 = CARTESIAN_POINT('',(-3.9475,-3.535,-3.5));
+#11665 = SURFACE_CURVE('',#11666,(#11670,#11677),.PCURVE_S1.);
+#11666 = LINE('',#11667,#11668);
+#11667 = CARTESIAN_POINT('',(-3.9475,-4.085,-3.5));
+#11668 = VECTOR('',#11669,1.);
+#11669 = DIRECTION('',(0.,1.,0.));
+#11670 = PCURVE('',#11582,#11671);
+#11671 = DEFINITIONAL_REPRESENTATION('',(#11672),#11676);
+#11672 = LINE('',#11673,#11674);
+#11673 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#11674 = VECTOR('',#11675,1.);
+#11675 = DIRECTION('',(1.,-2.226071387182E-62));
+#11676 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11677 = PCURVE('',#11678,#11683);
+#11678 = PLANE('',#11679);
+#11679 = AXIS2_PLACEMENT_3D('',#11680,#11681,#11682);
+#11680 = CARTESIAN_POINT('',(-3.6725,-4.085,-3.5));
+#11681 = DIRECTION('',(0.,0.,-1.));
+#11682 = DIRECTION('',(0.,1.,0.));
+#11683 = DEFINITIONAL_REPRESENTATION('',(#11684),#11688);
+#11684 = LINE('',#11685,#11686);
+#11685 = CARTESIAN_POINT('',(0.,-0.275));
+#11686 = VECTOR('',#11687,1.);
+#11687 = DIRECTION('',(1.,0.));
+#11688 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11689 = ORIENTED_EDGE('',*,*,#11690,.T.);
+#11690 = EDGE_CURVE('',#11663,#11691,#11693,.T.);
+#11691 = VERTEX_POINT('',#11692);
+#11692 = CARTESIAN_POINT('',(-3.9475,-3.535,0.));
+#11693 = SURFACE_CURVE('',#11694,(#11698,#11705),.PCURVE_S1.);
+#11694 = LINE('',#11695,#11696);
+#11695 = CARTESIAN_POINT('',(-3.9475,-3.535,-3.5));
+#11696 = VECTOR('',#11697,1.);
+#11697 = DIRECTION('',(0.,0.,1.));
+#11698 = PCURVE('',#11582,#11699);
+#11699 = DEFINITIONAL_REPRESENTATION('',(#11700),#11704);
+#11700 = LINE('',#11701,#11702);
+#11701 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#11702 = VECTOR('',#11703,1.);
+#11703 = DIRECTION('',(0.,1.));
+#11704 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11705 = PCURVE('',#11706,#11711);
+#11706 = PLANE('',#11707);
+#11707 = AXIS2_PLACEMENT_3D('',#11708,#11709,#11710);
+#11708 = CARTESIAN_POINT('',(-3.6725,-3.535,-3.5));
+#11709 = DIRECTION('',(0.,1.,0.));
+#11710 = DIRECTION('',(0.,0.,1.));
+#11711 = DEFINITIONAL_REPRESENTATION('',(#11712),#11716);
+#11712 = LINE('',#11713,#11714);
+#11713 = CARTESIAN_POINT('',(0.,-0.275));
+#11714 = VECTOR('',#11715,1.);
+#11715 = DIRECTION('',(1.,0.));
+#11716 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11717 = ORIENTED_EDGE('',*,*,#11718,.T.);
+#11718 = EDGE_CURVE('',#11691,#11719,#11721,.T.);
+#11719 = VERTEX_POINT('',#11720);
+#11720 = CARTESIAN_POINT('',(-3.9475,-3.26,0.275));
+#11721 = SURFACE_CURVE('',#11722,(#11726,#11733),.PCURVE_S1.);
+#11722 = LINE('',#11723,#11724);
+#11723 = CARTESIAN_POINT('',(-3.9475,-3.535,0.));
+#11724 = VECTOR('',#11725,1.);
+#11725 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#11726 = PCURVE('',#11582,#11727);
+#11727 = DEFINITIONAL_REPRESENTATION('',(#11728),#11732);
+#11728 = LINE('',#11729,#11730);
+#11729 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#11730 = VECTOR('',#11731,1.);
+#11731 = DIRECTION('',(0.707106781187,0.707106781187));
+#11732 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11733 = PCURVE('',#11734,#11739);
+#11734 = PLANE('',#11735);
+#11735 = AXIS2_PLACEMENT_3D('',#11736,#11737,#11738);
+#11736 = CARTESIAN_POINT('',(-3.6725,-3.535,0.));
+#11737 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#11738 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#11739 = DEFINITIONAL_REPRESENTATION('',(#11740),#11744);
+#11740 = LINE('',#11741,#11742);
+#11741 = CARTESIAN_POINT('',(0.,-0.275));
+#11742 = VECTOR('',#11743,1.);
+#11743 = DIRECTION('',(1.,0.));
+#11744 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11745 = ORIENTED_EDGE('',*,*,#11746,.T.);
+#11746 = EDGE_CURVE('',#11719,#11747,#11749,.T.);
+#11747 = VERTEX_POINT('',#11748);
+#11748 = CARTESIAN_POINT('',(-3.9475,-3.26,2.4225));
+#11749 = SURFACE_CURVE('',#11750,(#11754,#11761),.PCURVE_S1.);
+#11750 = LINE('',#11751,#11752);
+#11751 = CARTESIAN_POINT('',(-3.9475,-3.26,0.275));
+#11752 = VECTOR('',#11753,1.);
+#11753 = DIRECTION('',(0.,0.,1.));
+#11754 = PCURVE('',#11582,#11755);
+#11755 = DEFINITIONAL_REPRESENTATION('',(#11756),#11760);
+#11756 = LINE('',#11757,#11758);
+#11757 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#11758 = VECTOR('',#11759,1.);
+#11759 = DIRECTION('',(0.,1.));
+#11760 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11761 = PCURVE('',#11762,#11767);
+#11762 = PLANE('',#11763);
+#11763 = AXIS2_PLACEMENT_3D('',#11764,#11765,#11766);
+#11764 = CARTESIAN_POINT('',(-3.724778209321,-3.26,1.581028209321));
+#11765 = DIRECTION('',(2.616880222009E-29,1.,-2.312216259511E-30));
+#11766 = DIRECTION('',(1.,-2.616880222009E-29,0.));
+#11767 = DEFINITIONAL_REPRESENTATION('',(#11768),#11772);
+#11768 = LINE('',#11769,#11770);
+#11769 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#11770 = VECTOR('',#11771,1.);
+#11771 = DIRECTION('',(0.,-1.));
+#11772 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11773 = ORIENTED_EDGE('',*,*,#11774,.T.);
+#11774 = EDGE_CURVE('',#11747,#11572,#11775,.T.);
+#11775 = SURFACE_CURVE('',#11776,(#11780,#11787),.PCURVE_S1.);
+#11776 = LINE('',#11777,#11778);
+#11777 = CARTESIAN_POINT('',(-3.9475,-3.26,2.4225));
+#11778 = VECTOR('',#11779,1.);
+#11779 = DIRECTION('',(0.,-1.,0.));
+#11780 = PCURVE('',#11582,#11781);
+#11781 = DEFINITIONAL_REPRESENTATION('',(#11782),#11786);
+#11782 = LINE('',#11783,#11784);
+#11783 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#11784 = VECTOR('',#11785,1.);
+#11785 = DIRECTION('',(-1.,2.226071387182E-62));
+#11786 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11787 = PCURVE('',#11788,#11793);
+#11788 = CYLINDRICAL_SURFACE('',#11789,0.1375);
+#11789 = AXIS2_PLACEMENT_3D('',#11790,#11791,#11792);
+#11790 = CARTESIAN_POINT('',(-3.81,-3.26,2.4225));
+#11791 = DIRECTION('',(0.,-1.,0.));
+#11792 = DIRECTION('',(-1.,-0.,-9.8088568672E-33));
+#11793 = DEFINITIONAL_REPRESENTATION('',(#11794),#11798);
+#11794 = LINE('',#11795,#11796);
+#11795 = CARTESIAN_POINT('',(-0.,0.));
+#11796 = VECTOR('',#11797,1.);
+#11797 = DIRECTION('',(-0.,1.));
+#11798 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11799 = ADVANCED_FACE('',(#11800),#11594,.T.);
+#11800 = FACE_BOUND('',#11801,.T.);
+#11801 = EDGE_LOOP('',(#11802,#11832,#11858,#11859,#11882,#11910,#11938)
+ );
+#11802 = ORIENTED_EDGE('',*,*,#11803,.T.);
+#11803 = EDGE_CURVE('',#11804,#11806,#11808,.T.);
+#11804 = VERTEX_POINT('',#11805);
+#11805 = CARTESIAN_POINT('',(-3.175,-4.36,2.56));
+#11806 = VERTEX_POINT('',#11807);
+#11807 = CARTESIAN_POINT('',(-3.81,-4.36,2.56));
+#11808 = SURFACE_CURVE('',#11809,(#11813,#11820),.PCURVE_S1.);
+#11809 = LINE('',#11810,#11811);
+#11810 = CARTESIAN_POINT('',(-3.6725,-4.36,2.56));
+#11811 = VECTOR('',#11812,1.);
+#11812 = DIRECTION('',(-1.,0.,0.));
+#11813 = PCURVE('',#11594,#11814);
+#11814 = DEFINITIONAL_REPRESENTATION('',(#11815),#11819);
+#11815 = LINE('',#11816,#11817);
+#11816 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#11817 = VECTOR('',#11818,1.);
+#11818 = DIRECTION('',(1.,1.676027028956E-59));
+#11819 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11820 = PCURVE('',#11821,#11826);
+#11821 = PLANE('',#11822);
+#11822 = AXIS2_PLACEMENT_3D('',#11823,#11824,#11825);
+#11823 = CARTESIAN_POINT('',(-3.56125,-3.81,2.56));
+#11824 = DIRECTION('',(1.601195610168E-30,3.925633828627E-30,1.));
+#11825 = DIRECTION('',(0.,1.,-3.925633828627E-30));
+#11826 = DEFINITIONAL_REPRESENTATION('',(#11827),#11831);
+#11827 = LINE('',#11828,#11829);
+#11828 = CARTESIAN_POINT('',(-0.55,0.11125));
+#11829 = VECTOR('',#11830,1.);
+#11830 = DIRECTION('',(0.,1.));
+#11831 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11832 = ORIENTED_EDGE('',*,*,#11833,.F.);
+#11833 = EDGE_CURVE('',#11572,#11806,#11834,.T.);
+#11834 = SURFACE_CURVE('',#11835,(#11840,#11851),.PCURVE_S1.);
+#11835 = CIRCLE('',#11836,0.1375);
+#11836 = AXIS2_PLACEMENT_3D('',#11837,#11838,#11839);
+#11837 = CARTESIAN_POINT('',(-3.81,-4.36,2.4225));
+#11838 = DIRECTION('',(-0.,1.,0.));
+#11839 = DIRECTION('',(0.,0.,-1.));
+#11840 = PCURVE('',#11594,#11841);
+#11841 = DEFINITIONAL_REPRESENTATION('',(#11842),#11850);
+#11842 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#11843,#11844,#11845,#11846
+ ,#11847,#11848,#11849),.UNSPECIFIED.,.F.,.F.)
+B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),(-2.094395102393,0.,
+ 2.094395102393,4.188790204786,6.28318530718,8.377580409573),
+.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM()
+RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM(
+ '') );
+#11843 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#11844 = CARTESIAN_POINT('',(0.323378776719,-0.703971790679));
+#11845 = CARTESIAN_POINT('',(0.204300283699,-0.910221790679));
+#11846 = CARTESIAN_POINT('',(8.522179067866E-02,-1.116471790679));
+#11847 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.910221790679));
+#11848 = CARTESIAN_POINT('',(-0.152935195362,-0.703971790679));
+#11849 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#11850 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11851 = PCURVE('',#11788,#11852);
+#11852 = DEFINITIONAL_REPRESENTATION('',(#11853),#11857);
+#11853 = LINE('',#11854,#11855);
+#11854 = CARTESIAN_POINT('',(1.570796326795,1.1));
+#11855 = VECTOR('',#11856,1.);
+#11856 = DIRECTION('',(-1.,0.));
+#11857 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11858 = ORIENTED_EDGE('',*,*,#11571,.T.);
+#11859 = ORIENTED_EDGE('',*,*,#11860,.F.);
+#11860 = EDGE_CURVE('',#11861,#11574,#11863,.T.);
+#11861 = VERTEX_POINT('',#11862);
+#11862 = CARTESIAN_POINT('',(-3.6725,-4.36,0.275));
+#11863 = SURFACE_CURVE('',#11864,(#11868,#11875),.PCURVE_S1.);
+#11864 = LINE('',#11865,#11866);
+#11865 = CARTESIAN_POINT('',(-3.6725,-4.36,0.275));
+#11866 = VECTOR('',#11867,1.);
+#11867 = DIRECTION('',(-1.,0.,0.));
+#11868 = PCURVE('',#11594,#11869);
+#11869 = DEFINITIONAL_REPRESENTATION('',(#11870),#11874);
+#11870 = LINE('',#11871,#11872);
+#11871 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#11872 = VECTOR('',#11873,1.);
+#11873 = DIRECTION('',(1.,1.676027028956E-59));
+#11874 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11875 = PCURVE('',#11622,#11876);
+#11876 = DEFINITIONAL_REPRESENTATION('',(#11877),#11881);
+#11877 = LINE('',#11878,#11879);
+#11878 = CARTESIAN_POINT('',(0.,0.));
+#11879 = VECTOR('',#11880,1.);
+#11880 = DIRECTION('',(0.,-1.));
+#11881 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11882 = ORIENTED_EDGE('',*,*,#11883,.F.);
+#11883 = EDGE_CURVE('',#11884,#11861,#11886,.T.);
+#11884 = VERTEX_POINT('',#11885);
+#11885 = CARTESIAN_POINT('',(-3.6725,-4.36,2.285));
+#11886 = SURFACE_CURVE('',#11887,(#11891,#11898),.PCURVE_S1.);
+#11887 = LINE('',#11888,#11889);
+#11888 = CARTESIAN_POINT('',(-3.6725,-4.36,2.56));
+#11889 = VECTOR('',#11890,1.);
+#11890 = DIRECTION('',(0.,0.,-1.));
+#11891 = PCURVE('',#11594,#11892);
+#11892 = DEFINITIONAL_REPRESENTATION('',(#11893),#11897);
+#11893 = LINE('',#11894,#11895);
+#11894 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#11895 = VECTOR('',#11896,1.);
+#11896 = DIRECTION('',(0.,1.));
+#11897 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11898 = PCURVE('',#11899,#11904);
+#11899 = PLANE('',#11900);
+#11900 = AXIS2_PLACEMENT_3D('',#11901,#11902,#11903);
+#11901 = CARTESIAN_POINT('',(-3.6725,-3.81,-0.34105853382));
+#11902 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#11903 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#11904 = DEFINITIONAL_REPRESENTATION('',(#11905),#11909);
+#11905 = LINE('',#11906,#11907);
+#11906 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#11907 = VECTOR('',#11908,1.);
+#11908 = DIRECTION('',(0.,-1.));
+#11909 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11910 = ORIENTED_EDGE('',*,*,#11911,.T.);
+#11911 = EDGE_CURVE('',#11884,#11912,#11914,.T.);
+#11912 = VERTEX_POINT('',#11913);
+#11913 = CARTESIAN_POINT('',(-3.175,-4.36,2.285));
+#11914 = SURFACE_CURVE('',#11915,(#11919,#11926),.PCURVE_S1.);
+#11915 = LINE('',#11916,#11917);
+#11916 = CARTESIAN_POINT('',(-3.6725,-4.36,2.285));
+#11917 = VECTOR('',#11918,1.);
+#11918 = DIRECTION('',(1.,0.,0.));
+#11919 = PCURVE('',#11594,#11920);
+#11920 = DEFINITIONAL_REPRESENTATION('',(#11921),#11925);
+#11921 = LINE('',#11922,#11923);
+#11922 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.703971790679));
+#11923 = VECTOR('',#11924,1.);
+#11924 = DIRECTION('',(-1.,-1.676027028956E-59));
+#11925 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11926 = PCURVE('',#11927,#11932);
+#11927 = PLANE('',#11928);
+#11928 = AXIS2_PLACEMENT_3D('',#11929,#11930,#11931);
+#11929 = CARTESIAN_POINT('',(-3.6725,-4.36,2.285));
+#11930 = DIRECTION('',(0.,0.,1.));
+#11931 = DIRECTION('',(1.,0.,0.));
+#11932 = DEFINITIONAL_REPRESENTATION('',(#11933),#11937);
+#11933 = LINE('',#11934,#11935);
+#11934 = CARTESIAN_POINT('',(0.,0.));
+#11935 = VECTOR('',#11936,1.);
+#11936 = DIRECTION('',(1.,0.));
+#11937 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11938 = ORIENTED_EDGE('',*,*,#11939,.T.);
+#11939 = EDGE_CURVE('',#11912,#11804,#11940,.T.);
+#11940 = SURFACE_CURVE('',#11941,(#11945,#11952),.PCURVE_S1.);
+#11941 = LINE('',#11942,#11943);
+#11942 = CARTESIAN_POINT('',(-3.175,-4.36,2.285));
+#11943 = VECTOR('',#11944,1.);
+#11944 = DIRECTION('',(0.,0.,1.));
+#11945 = PCURVE('',#11594,#11946);
+#11946 = DEFINITIONAL_REPRESENTATION('',(#11947),#11951);
+#11947 = LINE('',#11948,#11949);
+#11948 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#11949 = VECTOR('',#11950,1.);
+#11950 = DIRECTION('',(0.,-1.));
+#11951 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11952 = PCURVE('',#11953,#11958);
+#11953 = PLANE('',#11954);
+#11954 = AXIS2_PLACEMENT_3D('',#11955,#11956,#11957);
+#11955 = CARTESIAN_POINT('',(-3.175,-4.36,2.285));
+#11956 = DIRECTION('',(1.,0.,0.));
+#11957 = DIRECTION('',(0.,0.,1.));
+#11958 = DEFINITIONAL_REPRESENTATION('',(#11959),#11963);
+#11959 = LINE('',#11960,#11961);
+#11960 = CARTESIAN_POINT('',(0.,0.));
+#11961 = VECTOR('',#11962,1.);
+#11962 = DIRECTION('',(1.,0.));
+#11963 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11964 = ADVANCED_FACE('',(#11965),#11788,.T.);
+#11965 = FACE_BOUND('',#11966,.F.);
+#11966 = EDGE_LOOP('',(#11967,#11991,#12012,#12013));
+#11967 = ORIENTED_EDGE('',*,*,#11968,.T.);
+#11968 = EDGE_CURVE('',#11747,#11969,#11971,.T.);
+#11969 = VERTEX_POINT('',#11970);
+#11970 = CARTESIAN_POINT('',(-3.81,-3.26,2.56));
+#11971 = SURFACE_CURVE('',#11972,(#11977,#11984),.PCURVE_S1.);
+#11972 = CIRCLE('',#11973,0.1375);
+#11973 = AXIS2_PLACEMENT_3D('',#11974,#11975,#11976);
+#11974 = CARTESIAN_POINT('',(-3.81,-3.26,2.4225));
+#11975 = DIRECTION('',(-0.,1.,0.));
+#11976 = DIRECTION('',(0.,0.,-1.));
+#11977 = PCURVE('',#11788,#11978);
+#11978 = DEFINITIONAL_REPRESENTATION('',(#11979),#11983);
+#11979 = LINE('',#11980,#11981);
+#11980 = CARTESIAN_POINT('',(1.570796326795,3.552713678801E-15));
+#11981 = VECTOR('',#11982,1.);
+#11982 = DIRECTION('',(-1.,0.));
+#11983 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11984 = PCURVE('',#11762,#11985);
+#11985 = DEFINITIONAL_REPRESENTATION('',(#11986),#11990);
+#11986 = CIRCLE('',#11987,0.1375);
+#11987 = AXIS2_PLACEMENT_2D('',#11988,#11989);
+#11988 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#11989 = DIRECTION('',(0.,1.));
+#11990 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#11991 = ORIENTED_EDGE('',*,*,#11992,.T.);
+#11992 = EDGE_CURVE('',#11969,#11806,#11993,.T.);
+#11993 = SURFACE_CURVE('',#11994,(#11998,#12005),.PCURVE_S1.);
+#11994 = LINE('',#11995,#11996);
+#11995 = CARTESIAN_POINT('',(-3.81,-3.26,2.56));
+#11996 = VECTOR('',#11997,1.);
+#11997 = DIRECTION('',(0.,-1.,0.));
+#11998 = PCURVE('',#11788,#11999);
+#11999 = DEFINITIONAL_REPRESENTATION('',(#12000),#12004);
+#12000 = LINE('',#12001,#12002);
+#12001 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#12002 = VECTOR('',#12003,1.);
+#12003 = DIRECTION('',(-0.,1.));
+#12004 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12005 = PCURVE('',#11821,#12006);
+#12006 = DEFINITIONAL_REPRESENTATION('',(#12007),#12011);
+#12007 = LINE('',#12008,#12009);
+#12008 = CARTESIAN_POINT('',(0.55,0.24875));
+#12009 = VECTOR('',#12010,1.);
+#12010 = DIRECTION('',(-1.,-6.285707653525E-60));
+#12011 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12012 = ORIENTED_EDGE('',*,*,#11833,.F.);
+#12013 = ORIENTED_EDGE('',*,*,#11774,.F.);
+#12014 = ADVANCED_FACE('',(#12015),#11622,.T.);
+#12015 = FACE_BOUND('',#12016,.T.);
+#12016 = EDGE_LOOP('',(#12017,#12018,#12019,#12042));
+#12017 = ORIENTED_EDGE('',*,*,#11860,.T.);
+#12018 = ORIENTED_EDGE('',*,*,#11606,.T.);
+#12019 = ORIENTED_EDGE('',*,*,#12020,.F.);
+#12020 = EDGE_CURVE('',#12021,#11607,#12023,.T.);
+#12021 = VERTEX_POINT('',#12022);
+#12022 = CARTESIAN_POINT('',(-3.6725,-4.085,0.));
+#12023 = SURFACE_CURVE('',#12024,(#12028,#12035),.PCURVE_S1.);
+#12024 = LINE('',#12025,#12026);
+#12025 = CARTESIAN_POINT('',(-3.6725,-4.085,0.));
+#12026 = VECTOR('',#12027,1.);
+#12027 = DIRECTION('',(-1.,0.,0.));
+#12028 = PCURVE('',#11622,#12029);
+#12029 = DEFINITIONAL_REPRESENTATION('',(#12030),#12034);
+#12030 = LINE('',#12031,#12032);
+#12031 = CARTESIAN_POINT('',(0.388908729653,0.));
+#12032 = VECTOR('',#12033,1.);
+#12033 = DIRECTION('',(0.,-1.));
+#12034 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12035 = PCURVE('',#11650,#12036);
+#12036 = DEFINITIONAL_REPRESENTATION('',(#12037),#12041);
+#12037 = LINE('',#12038,#12039);
+#12038 = CARTESIAN_POINT('',(0.,0.));
+#12039 = VECTOR('',#12040,1.);
+#12040 = DIRECTION('',(0.,-1.));
+#12041 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12042 = ORIENTED_EDGE('',*,*,#12043,.F.);
+#12043 = EDGE_CURVE('',#11861,#12021,#12044,.T.);
+#12044 = SURFACE_CURVE('',#12045,(#12049,#12056),.PCURVE_S1.);
+#12045 = LINE('',#12046,#12047);
+#12046 = CARTESIAN_POINT('',(-3.6725,-4.36,0.275));
+#12047 = VECTOR('',#12048,1.);
+#12048 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#12049 = PCURVE('',#11622,#12050);
+#12050 = DEFINITIONAL_REPRESENTATION('',(#12051),#12055);
+#12051 = LINE('',#12052,#12053);
+#12052 = CARTESIAN_POINT('',(0.,0.));
+#12053 = VECTOR('',#12054,1.);
+#12054 = DIRECTION('',(1.,0.));
+#12055 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12056 = PCURVE('',#11899,#12057);
+#12057 = DEFINITIONAL_REPRESENTATION('',(#12058),#12062);
+#12058 = LINE('',#12059,#12060);
+#12059 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#12060 = VECTOR('',#12061,1.);
+#12061 = DIRECTION('',(0.707106781187,-0.707106781187));
+#12062 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12063 = ADVANCED_FACE('',(#12064),#11762,.T.);
+#12064 = FACE_BOUND('',#12065,.T.);
+#12065 = EDGE_LOOP('',(#12066,#12067,#12068,#12091,#12114,#12137,#12160)
+ );
+#12066 = ORIENTED_EDGE('',*,*,#11746,.T.);
+#12067 = ORIENTED_EDGE('',*,*,#11968,.T.);
+#12068 = ORIENTED_EDGE('',*,*,#12069,.T.);
+#12069 = EDGE_CURVE('',#11969,#12070,#12072,.T.);
+#12070 = VERTEX_POINT('',#12071);
+#12071 = CARTESIAN_POINT('',(-3.175,-3.26,2.56));
+#12072 = SURFACE_CURVE('',#12073,(#12077,#12084),.PCURVE_S1.);
+#12073 = LINE('',#12074,#12075);
+#12074 = CARTESIAN_POINT('',(-3.6725,-3.26,2.56));
+#12075 = VECTOR('',#12076,1.);
+#12076 = DIRECTION('',(1.,0.,0.));
+#12077 = PCURVE('',#11762,#12078);
+#12078 = DEFINITIONAL_REPRESENTATION('',(#12079),#12083);
+#12079 = LINE('',#12080,#12081);
+#12080 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#12081 = VECTOR('',#12082,1.);
+#12082 = DIRECTION('',(1.,-6.050792998522E-59));
+#12083 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12084 = PCURVE('',#11821,#12085);
+#12085 = DEFINITIONAL_REPRESENTATION('',(#12086),#12090);
+#12086 = LINE('',#12087,#12088);
+#12087 = CARTESIAN_POINT('',(0.55,0.11125));
+#12088 = VECTOR('',#12089,1.);
+#12089 = DIRECTION('',(0.,-1.));
+#12090 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12091 = ORIENTED_EDGE('',*,*,#12092,.F.);
+#12092 = EDGE_CURVE('',#12093,#12070,#12095,.T.);
+#12093 = VERTEX_POINT('',#12094);
+#12094 = CARTESIAN_POINT('',(-3.175,-3.26,2.285));
+#12095 = SURFACE_CURVE('',#12096,(#12100,#12107),.PCURVE_S1.);
+#12096 = LINE('',#12097,#12098);
+#12097 = CARTESIAN_POINT('',(-3.175,-3.26,2.285));
+#12098 = VECTOR('',#12099,1.);
+#12099 = DIRECTION('',(0.,0.,1.));
+#12100 = PCURVE('',#11762,#12101);
+#12101 = DEFINITIONAL_REPRESENTATION('',(#12102),#12106);
+#12102 = LINE('',#12103,#12104);
+#12103 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#12104 = VECTOR('',#12105,1.);
+#12105 = DIRECTION('',(0.,-1.));
+#12106 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12107 = PCURVE('',#11953,#12108);
+#12108 = DEFINITIONAL_REPRESENTATION('',(#12109),#12113);
+#12109 = LINE('',#12110,#12111);
+#12110 = CARTESIAN_POINT('',(0.,-1.1));
+#12111 = VECTOR('',#12112,1.);
+#12112 = DIRECTION('',(1.,0.));
+#12113 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12114 = ORIENTED_EDGE('',*,*,#12115,.F.);
+#12115 = EDGE_CURVE('',#12116,#12093,#12118,.T.);
+#12116 = VERTEX_POINT('',#12117);
+#12117 = CARTESIAN_POINT('',(-3.6725,-3.26,2.285));
+#12118 = SURFACE_CURVE('',#12119,(#12123,#12130),.PCURVE_S1.);
+#12119 = LINE('',#12120,#12121);
+#12120 = CARTESIAN_POINT('',(-3.6725,-3.26,2.285));
+#12121 = VECTOR('',#12122,1.);
+#12122 = DIRECTION('',(1.,0.,0.));
+#12123 = PCURVE('',#11762,#12124);
+#12124 = DEFINITIONAL_REPRESENTATION('',(#12125),#12129);
+#12125 = LINE('',#12126,#12127);
+#12126 = CARTESIAN_POINT('',(5.227820932134E-02,-0.703971790679));
+#12127 = VECTOR('',#12128,1.);
+#12128 = DIRECTION('',(1.,-6.050792998522E-59));
+#12129 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12130 = PCURVE('',#11927,#12131);
+#12131 = DEFINITIONAL_REPRESENTATION('',(#12132),#12136);
+#12132 = LINE('',#12133,#12134);
+#12133 = CARTESIAN_POINT('',(0.,1.1));
+#12134 = VECTOR('',#12135,1.);
+#12135 = DIRECTION('',(1.,0.));
+#12136 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12137 = ORIENTED_EDGE('',*,*,#12138,.F.);
+#12138 = EDGE_CURVE('',#12139,#12116,#12141,.T.);
+#12139 = VERTEX_POINT('',#12140);
+#12140 = CARTESIAN_POINT('',(-3.6725,-3.26,0.275));
+#12141 = SURFACE_CURVE('',#12142,(#12146,#12153),.PCURVE_S1.);
+#12142 = LINE('',#12143,#12144);
+#12143 = CARTESIAN_POINT('',(-3.6725,-3.26,0.275));
+#12144 = VECTOR('',#12145,1.);
+#12145 = DIRECTION('',(0.,0.,1.));
+#12146 = PCURVE('',#11762,#12147);
+#12147 = DEFINITIONAL_REPRESENTATION('',(#12148),#12152);
+#12148 = LINE('',#12149,#12150);
+#12149 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#12150 = VECTOR('',#12151,1.);
+#12151 = DIRECTION('',(0.,-1.));
+#12152 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12153 = PCURVE('',#11899,#12154);
+#12154 = DEFINITIONAL_REPRESENTATION('',(#12155),#12159);
+#12155 = LINE('',#12156,#12157);
+#12156 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#12157 = VECTOR('',#12158,1.);
+#12158 = DIRECTION('',(0.,1.));
+#12159 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12160 = ORIENTED_EDGE('',*,*,#12161,.T.);
+#12161 = EDGE_CURVE('',#12139,#11719,#12162,.T.);
+#12162 = SURFACE_CURVE('',#12163,(#12167,#12174),.PCURVE_S1.);
+#12163 = LINE('',#12164,#12165);
+#12164 = CARTESIAN_POINT('',(-3.6725,-3.26,0.275));
+#12165 = VECTOR('',#12166,1.);
+#12166 = DIRECTION('',(-1.,0.,0.));
+#12167 = PCURVE('',#11762,#12168);
+#12168 = DEFINITIONAL_REPRESENTATION('',(#12169),#12173);
+#12169 = LINE('',#12170,#12171);
+#12170 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#12171 = VECTOR('',#12172,1.);
+#12172 = DIRECTION('',(-1.,6.050792998522E-59));
+#12173 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12174 = PCURVE('',#11734,#12175);
+#12175 = DEFINITIONAL_REPRESENTATION('',(#12176),#12180);
+#12176 = LINE('',#12177,#12178);
+#12177 = CARTESIAN_POINT('',(0.388908729653,0.));
+#12178 = VECTOR('',#12179,1.);
+#12179 = DIRECTION('',(0.,-1.));
+#12180 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12181 = ADVANCED_FACE('',(#12182),#11650,.T.);
+#12182 = FACE_BOUND('',#12183,.T.);
+#12183 = EDGE_LOOP('',(#12184,#12185,#12186,#12209));
+#12184 = ORIENTED_EDGE('',*,*,#12020,.T.);
+#12185 = ORIENTED_EDGE('',*,*,#11634,.T.);
+#12186 = ORIENTED_EDGE('',*,*,#12187,.F.);
+#12187 = EDGE_CURVE('',#12188,#11635,#12190,.T.);
+#12188 = VERTEX_POINT('',#12189);
+#12189 = CARTESIAN_POINT('',(-3.6725,-4.085,-3.5));
+#12190 = SURFACE_CURVE('',#12191,(#12195,#12202),.PCURVE_S1.);
+#12191 = LINE('',#12192,#12193);
+#12192 = CARTESIAN_POINT('',(-3.6725,-4.085,-3.5));
+#12193 = VECTOR('',#12194,1.);
+#12194 = DIRECTION('',(-1.,0.,0.));
+#12195 = PCURVE('',#11650,#12196);
+#12196 = DEFINITIONAL_REPRESENTATION('',(#12197),#12201);
+#12197 = LINE('',#12198,#12199);
+#12198 = CARTESIAN_POINT('',(3.5,0.));
+#12199 = VECTOR('',#12200,1.);
+#12200 = DIRECTION('',(0.,-1.));
+#12201 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12202 = PCURVE('',#11678,#12203);
+#12203 = DEFINITIONAL_REPRESENTATION('',(#12204),#12208);
+#12204 = LINE('',#12205,#12206);
+#12205 = CARTESIAN_POINT('',(3.330669073875E-16,0.));
+#12206 = VECTOR('',#12207,1.);
+#12207 = DIRECTION('',(0.,-1.));
+#12208 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12209 = ORIENTED_EDGE('',*,*,#12210,.F.);
+#12210 = EDGE_CURVE('',#12021,#12188,#12211,.T.);
+#12211 = SURFACE_CURVE('',#12212,(#12216,#12223),.PCURVE_S1.);
+#12212 = LINE('',#12213,#12214);
+#12213 = CARTESIAN_POINT('',(-3.6725,-4.085,0.));
+#12214 = VECTOR('',#12215,1.);
+#12215 = DIRECTION('',(0.,0.,-1.));
+#12216 = PCURVE('',#11650,#12217);
+#12217 = DEFINITIONAL_REPRESENTATION('',(#12218),#12222);
+#12218 = LINE('',#12219,#12220);
+#12219 = CARTESIAN_POINT('',(0.,0.));
+#12220 = VECTOR('',#12221,1.);
+#12221 = DIRECTION('',(1.,0.));
+#12222 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12223 = PCURVE('',#11899,#12224);
+#12224 = DEFINITIONAL_REPRESENTATION('',(#12225),#12229);
+#12225 = LINE('',#12226,#12227);
+#12226 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#12227 = VECTOR('',#12228,1.);
+#12228 = DIRECTION('',(0.,-1.));
+#12229 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12230 = ADVANCED_FACE('',(#12231),#11734,.T.);
+#12231 = FACE_BOUND('',#12232,.T.);
+#12232 = EDGE_LOOP('',(#12233,#12256,#12257,#12258));
+#12233 = ORIENTED_EDGE('',*,*,#12234,.T.);
+#12234 = EDGE_CURVE('',#12235,#11691,#12237,.T.);
+#12235 = VERTEX_POINT('',#12236);
+#12236 = CARTESIAN_POINT('',(-3.6725,-3.535,0.));
+#12237 = SURFACE_CURVE('',#12238,(#12242,#12249),.PCURVE_S1.);
+#12238 = LINE('',#12239,#12240);
+#12239 = CARTESIAN_POINT('',(-3.6725,-3.535,0.));
+#12240 = VECTOR('',#12241,1.);
+#12241 = DIRECTION('',(-1.,0.,0.));
+#12242 = PCURVE('',#11734,#12243);
+#12243 = DEFINITIONAL_REPRESENTATION('',(#12244),#12248);
+#12244 = LINE('',#12245,#12246);
+#12245 = CARTESIAN_POINT('',(-6.280369834735E-16,0.));
+#12246 = VECTOR('',#12247,1.);
+#12247 = DIRECTION('',(0.,-1.));
+#12248 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12249 = PCURVE('',#11706,#12250);
+#12250 = DEFINITIONAL_REPRESENTATION('',(#12251),#12255);
+#12251 = LINE('',#12252,#12253);
+#12252 = CARTESIAN_POINT('',(3.5,0.));
+#12253 = VECTOR('',#12254,1.);
+#12254 = DIRECTION('',(0.,-1.));
+#12255 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12256 = ORIENTED_EDGE('',*,*,#11718,.T.);
+#12257 = ORIENTED_EDGE('',*,*,#12161,.F.);
+#12258 = ORIENTED_EDGE('',*,*,#12259,.F.);
+#12259 = EDGE_CURVE('',#12235,#12139,#12260,.T.);
+#12260 = SURFACE_CURVE('',#12261,(#12265,#12272),.PCURVE_S1.);
+#12261 = LINE('',#12262,#12263);
+#12262 = CARTESIAN_POINT('',(-3.6725,-3.535,0.));
+#12263 = VECTOR('',#12264,1.);
+#12264 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#12265 = PCURVE('',#11734,#12266);
+#12266 = DEFINITIONAL_REPRESENTATION('',(#12267),#12271);
+#12267 = LINE('',#12268,#12269);
+#12268 = CARTESIAN_POINT('',(0.,0.));
+#12269 = VECTOR('',#12270,1.);
+#12270 = DIRECTION('',(1.,0.));
+#12271 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12272 = PCURVE('',#11899,#12273);
+#12273 = DEFINITIONAL_REPRESENTATION('',(#12274),#12278);
+#12274 = LINE('',#12275,#12276);
+#12275 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#12276 = VECTOR('',#12277,1.);
+#12277 = DIRECTION('',(0.707106781187,0.707106781187));
+#12278 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12279 = ADVANCED_FACE('',(#12280),#11678,.T.);
+#12280 = FACE_BOUND('',#12281,.T.);
+#12281 = EDGE_LOOP('',(#12282,#12283,#12284,#12307));
+#12282 = ORIENTED_EDGE('',*,*,#12187,.T.);
+#12283 = ORIENTED_EDGE('',*,*,#11662,.T.);
+#12284 = ORIENTED_EDGE('',*,*,#12285,.F.);
+#12285 = EDGE_CURVE('',#12286,#11663,#12288,.T.);
+#12286 = VERTEX_POINT('',#12287);
+#12287 = CARTESIAN_POINT('',(-3.6725,-3.535,-3.5));
+#12288 = SURFACE_CURVE('',#12289,(#12293,#12300),.PCURVE_S1.);
+#12289 = LINE('',#12290,#12291);
+#12290 = CARTESIAN_POINT('',(-3.6725,-3.535,-3.5));
+#12291 = VECTOR('',#12292,1.);
+#12292 = DIRECTION('',(-1.,0.,0.));
+#12293 = PCURVE('',#11678,#12294);
+#12294 = DEFINITIONAL_REPRESENTATION('',(#12295),#12299);
+#12295 = LINE('',#12296,#12297);
+#12296 = CARTESIAN_POINT('',(0.55,0.));
+#12297 = VECTOR('',#12298,1.);
+#12298 = DIRECTION('',(0.,-1.));
+#12299 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12300 = PCURVE('',#11706,#12301);
+#12301 = DEFINITIONAL_REPRESENTATION('',(#12302),#12306);
+#12302 = LINE('',#12303,#12304);
+#12303 = CARTESIAN_POINT('',(0.,0.));
+#12304 = VECTOR('',#12305,1.);
+#12305 = DIRECTION('',(0.,-1.));
+#12306 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12307 = ORIENTED_EDGE('',*,*,#12308,.F.);
+#12308 = EDGE_CURVE('',#12188,#12286,#12309,.T.);
+#12309 = SURFACE_CURVE('',#12310,(#12314,#12321),.PCURVE_S1.);
+#12310 = LINE('',#12311,#12312);
+#12311 = CARTESIAN_POINT('',(-3.6725,-4.085,-3.5));
+#12312 = VECTOR('',#12313,1.);
+#12313 = DIRECTION('',(0.,1.,0.));
+#12314 = PCURVE('',#11678,#12315);
+#12315 = DEFINITIONAL_REPRESENTATION('',(#12316),#12320);
+#12316 = LINE('',#12317,#12318);
+#12317 = CARTESIAN_POINT('',(0.,0.));
+#12318 = VECTOR('',#12319,1.);
+#12319 = DIRECTION('',(1.,0.));
+#12320 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12321 = PCURVE('',#11899,#12322);
+#12322 = DEFINITIONAL_REPRESENTATION('',(#12323),#12327);
+#12323 = LINE('',#12324,#12325);
+#12324 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#12325 = VECTOR('',#12326,1.);
+#12326 = DIRECTION('',(1.,-2.226071387182E-62));
+#12327 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12328 = ADVANCED_FACE('',(#12329),#11706,.T.);
+#12329 = FACE_BOUND('',#12330,.T.);
+#12330 = EDGE_LOOP('',(#12331,#12332,#12333,#12334));
+#12331 = ORIENTED_EDGE('',*,*,#12285,.T.);
+#12332 = ORIENTED_EDGE('',*,*,#11690,.T.);
+#12333 = ORIENTED_EDGE('',*,*,#12234,.F.);
+#12334 = ORIENTED_EDGE('',*,*,#12335,.F.);
+#12335 = EDGE_CURVE('',#12286,#12235,#12336,.T.);
+#12336 = SURFACE_CURVE('',#12337,(#12341,#12348),.PCURVE_S1.);
+#12337 = LINE('',#12338,#12339);
+#12338 = CARTESIAN_POINT('',(-3.6725,-3.535,-3.5));
+#12339 = VECTOR('',#12340,1.);
+#12340 = DIRECTION('',(0.,0.,1.));
+#12341 = PCURVE('',#11706,#12342);
+#12342 = DEFINITIONAL_REPRESENTATION('',(#12343),#12347);
+#12343 = LINE('',#12344,#12345);
+#12344 = CARTESIAN_POINT('',(0.,0.));
+#12345 = VECTOR('',#12346,1.);
+#12346 = DIRECTION('',(1.,0.));
+#12347 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12348 = PCURVE('',#11899,#12349);
+#12349 = DEFINITIONAL_REPRESENTATION('',(#12350),#12354);
+#12350 = LINE('',#12351,#12352);
+#12351 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#12352 = VECTOR('',#12353,1.);
+#12353 = DIRECTION('',(0.,1.));
+#12354 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12355 = ADVANCED_FACE('',(#12356),#11821,.T.);
+#12356 = FACE_BOUND('',#12357,.T.);
+#12357 = EDGE_LOOP('',(#12358,#12359,#12380,#12381));
+#12358 = ORIENTED_EDGE('',*,*,#11803,.F.);
+#12359 = ORIENTED_EDGE('',*,*,#12360,.T.);
+#12360 = EDGE_CURVE('',#11804,#12070,#12361,.T.);
+#12361 = SURFACE_CURVE('',#12362,(#12366,#12373),.PCURVE_S1.);
+#12362 = LINE('',#12363,#12364);
+#12363 = CARTESIAN_POINT('',(-3.175,-4.36,2.56));
+#12364 = VECTOR('',#12365,1.);
+#12365 = DIRECTION('',(0.,1.,0.));
+#12366 = PCURVE('',#11821,#12367);
+#12367 = DEFINITIONAL_REPRESENTATION('',(#12368),#12372);
+#12368 = LINE('',#12369,#12370);
+#12369 = CARTESIAN_POINT('',(-0.55,-0.38625));
+#12370 = VECTOR('',#12371,1.);
+#12371 = DIRECTION('',(1.,6.285707653525E-60));
+#12372 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12373 = PCURVE('',#11953,#12374);
+#12374 = DEFINITIONAL_REPRESENTATION('',(#12375),#12379);
+#12375 = LINE('',#12376,#12377);
+#12376 = CARTESIAN_POINT('',(0.275,0.));
+#12377 = VECTOR('',#12378,1.);
+#12378 = DIRECTION('',(0.,-1.));
+#12379 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12380 = ORIENTED_EDGE('',*,*,#12069,.F.);
+#12381 = ORIENTED_EDGE('',*,*,#11992,.T.);
+#12382 = ADVANCED_FACE('',(#12383),#11953,.T.);
+#12383 = FACE_BOUND('',#12384,.T.);
+#12384 = EDGE_LOOP('',(#12385,#12386,#12407,#12408));
+#12385 = ORIENTED_EDGE('',*,*,#11939,.F.);
+#12386 = ORIENTED_EDGE('',*,*,#12387,.T.);
+#12387 = EDGE_CURVE('',#11912,#12093,#12388,.T.);
+#12388 = SURFACE_CURVE('',#12389,(#12393,#12400),.PCURVE_S1.);
+#12389 = LINE('',#12390,#12391);
+#12390 = CARTESIAN_POINT('',(-3.175,-4.36,2.285));
+#12391 = VECTOR('',#12392,1.);
+#12392 = DIRECTION('',(0.,1.,0.));
+#12393 = PCURVE('',#11953,#12394);
+#12394 = DEFINITIONAL_REPRESENTATION('',(#12395),#12399);
+#12395 = LINE('',#12396,#12397);
+#12396 = CARTESIAN_POINT('',(0.,0.));
+#12397 = VECTOR('',#12398,1.);
+#12398 = DIRECTION('',(0.,-1.));
+#12399 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12400 = PCURVE('',#11927,#12401);
+#12401 = DEFINITIONAL_REPRESENTATION('',(#12402),#12406);
+#12402 = LINE('',#12403,#12404);
+#12403 = CARTESIAN_POINT('',(0.4975,0.));
+#12404 = VECTOR('',#12405,1.);
+#12405 = DIRECTION('',(0.,1.));
+#12406 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12407 = ORIENTED_EDGE('',*,*,#12092,.T.);
+#12408 = ORIENTED_EDGE('',*,*,#12360,.F.);
+#12409 = ADVANCED_FACE('',(#12410),#11927,.F.);
+#12410 = FACE_BOUND('',#12411,.F.);
+#12411 = EDGE_LOOP('',(#12412,#12433,#12434,#12435));
+#12412 = ORIENTED_EDGE('',*,*,#12413,.F.);
+#12413 = EDGE_CURVE('',#11884,#12116,#12414,.T.);
+#12414 = SURFACE_CURVE('',#12415,(#12419,#12426),.PCURVE_S1.);
+#12415 = LINE('',#12416,#12417);
+#12416 = CARTESIAN_POINT('',(-3.6725,-4.36,2.285));
+#12417 = VECTOR('',#12418,1.);
+#12418 = DIRECTION('',(0.,1.,0.));
+#12419 = PCURVE('',#11927,#12420);
+#12420 = DEFINITIONAL_REPRESENTATION('',(#12421),#12425);
+#12421 = LINE('',#12422,#12423);
+#12422 = CARTESIAN_POINT('',(0.,0.));
+#12423 = VECTOR('',#12424,1.);
+#12424 = DIRECTION('',(0.,1.));
+#12425 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12426 = PCURVE('',#11899,#12427);
+#12427 = DEFINITIONAL_REPRESENTATION('',(#12428),#12432);
+#12428 = LINE('',#12429,#12430);
+#12429 = CARTESIAN_POINT('',(-0.55,2.62605853382));
+#12430 = VECTOR('',#12431,1.);
+#12431 = DIRECTION('',(1.,-2.226071387182E-62));
+#12432 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12433 = ORIENTED_EDGE('',*,*,#11911,.T.);
+#12434 = ORIENTED_EDGE('',*,*,#12387,.T.);
+#12435 = ORIENTED_EDGE('',*,*,#12115,.F.);
+#12436 = ADVANCED_FACE('',(#12437),#11899,.T.);
+#12437 = FACE_BOUND('',#12438,.T.);
+#12438 = EDGE_LOOP('',(#12439,#12440,#12441,#12442,#12443,#12444,#12445,
+ #12446));
+#12439 = ORIENTED_EDGE('',*,*,#12138,.T.);
+#12440 = ORIENTED_EDGE('',*,*,#12413,.F.);
+#12441 = ORIENTED_EDGE('',*,*,#11883,.T.);
+#12442 = ORIENTED_EDGE('',*,*,#12043,.T.);
+#12443 = ORIENTED_EDGE('',*,*,#12210,.T.);
+#12444 = ORIENTED_EDGE('',*,*,#12308,.T.);
+#12445 = ORIENTED_EDGE('',*,*,#12335,.T.);
+#12446 = ORIENTED_EDGE('',*,*,#12259,.T.);
+#12447 = MANIFOLD_SOLID_BREP('',#12448);
+#12448 = CLOSED_SHELL('',(#12449,#12681,#12846,#12896,#12945,#13063,
+ #13112,#13161,#13210,#13237,#13264,#13291,#13318));
+#12449 = ADVANCED_FACE('',(#12450),#12464,.F.);
+#12450 = FACE_BOUND('',#12451,.F.);
+#12451 = EDGE_LOOP('',(#12452,#12487,#12515,#12543,#12571,#12599,#12627,
+ #12655));
+#12452 = ORIENTED_EDGE('',*,*,#12453,.T.);
+#12453 = EDGE_CURVE('',#12454,#12456,#12458,.T.);
+#12454 = VERTEX_POINT('',#12455);
+#12455 = CARTESIAN_POINT('',(3.9475,-3.26,2.4225));
+#12456 = VERTEX_POINT('',#12457);
+#12457 = CARTESIAN_POINT('',(3.9475,-3.26,0.275));
+#12458 = SURFACE_CURVE('',#12459,(#12463,#12475),.PCURVE_S1.);
+#12459 = LINE('',#12460,#12461);
+#12460 = CARTESIAN_POINT('',(3.9475,-3.26,2.56));
+#12461 = VECTOR('',#12462,1.);
+#12462 = DIRECTION('',(0.,0.,-1.));
+#12463 = PCURVE('',#12464,#12469);
+#12464 = PLANE('',#12465);
+#12465 = AXIS2_PLACEMENT_3D('',#12466,#12467,#12468);
+#12466 = CARTESIAN_POINT('',(3.9475,-3.81,-0.34105853382));
+#12467 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#12468 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#12469 = DEFINITIONAL_REPRESENTATION('',(#12470),#12474);
+#12470 = LINE('',#12471,#12472);
+#12471 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#12472 = VECTOR('',#12473,1.);
+#12473 = DIRECTION('',(0.,-1.));
+#12474 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12475 = PCURVE('',#12476,#12481);
+#12476 = PLANE('',#12477);
+#12477 = AXIS2_PLACEMENT_3D('',#12478,#12479,#12480);
+#12478 = CARTESIAN_POINT('',(3.724778209321,-3.26,1.581028209321));
+#12479 = DIRECTION('',(3.17453643318E-29,1.,2.111838454822E-30));
+#12480 = DIRECTION('',(1.,-3.17453643318E-29,0.));
+#12481 = DEFINITIONAL_REPRESENTATION('',(#12482),#12486);
+#12482 = LINE('',#12483,#12484);
+#12483 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#12484 = VECTOR('',#12485,1.);
+#12485 = DIRECTION('',(0.,1.));
+#12486 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12487 = ORIENTED_EDGE('',*,*,#12488,.T.);
+#12488 = EDGE_CURVE('',#12456,#12489,#12491,.T.);
+#12489 = VERTEX_POINT('',#12490);
+#12490 = CARTESIAN_POINT('',(3.9475,-3.535,0.));
+#12491 = SURFACE_CURVE('',#12492,(#12496,#12503),.PCURVE_S1.);
+#12492 = LINE('',#12493,#12494);
+#12493 = CARTESIAN_POINT('',(3.9475,-3.26,0.275));
+#12494 = VECTOR('',#12495,1.);
+#12495 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#12496 = PCURVE('',#12464,#12497);
+#12497 = DEFINITIONAL_REPRESENTATION('',(#12498),#12502);
+#12498 = LINE('',#12499,#12500);
+#12499 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#12500 = VECTOR('',#12501,1.);
+#12501 = DIRECTION('',(0.707106781187,-0.707106781187));
+#12502 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12503 = PCURVE('',#12504,#12509);
+#12504 = PLANE('',#12505);
+#12505 = AXIS2_PLACEMENT_3D('',#12506,#12507,#12508);
+#12506 = CARTESIAN_POINT('',(3.6725,-3.26,0.275));
+#12507 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#12508 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#12509 = DEFINITIONAL_REPRESENTATION('',(#12510),#12514);
+#12510 = LINE('',#12511,#12512);
+#12511 = CARTESIAN_POINT('',(0.,-0.275));
+#12512 = VECTOR('',#12513,1.);
+#12513 = DIRECTION('',(1.,0.));
+#12514 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12515 = ORIENTED_EDGE('',*,*,#12516,.T.);
+#12516 = EDGE_CURVE('',#12489,#12517,#12519,.T.);
+#12517 = VERTEX_POINT('',#12518);
+#12518 = CARTESIAN_POINT('',(3.9475,-3.535,-3.5));
+#12519 = SURFACE_CURVE('',#12520,(#12524,#12531),.PCURVE_S1.);
+#12520 = LINE('',#12521,#12522);
+#12521 = CARTESIAN_POINT('',(3.9475,-3.535,0.));
+#12522 = VECTOR('',#12523,1.);
+#12523 = DIRECTION('',(0.,0.,-1.));
+#12524 = PCURVE('',#12464,#12525);
+#12525 = DEFINITIONAL_REPRESENTATION('',(#12526),#12530);
+#12526 = LINE('',#12527,#12528);
+#12527 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#12528 = VECTOR('',#12529,1.);
+#12529 = DIRECTION('',(0.,-1.));
+#12530 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12531 = PCURVE('',#12532,#12537);
+#12532 = PLANE('',#12533);
+#12533 = AXIS2_PLACEMENT_3D('',#12534,#12535,#12536);
+#12534 = CARTESIAN_POINT('',(3.6725,-3.535,0.));
+#12535 = DIRECTION('',(0.,1.,0.));
+#12536 = DIRECTION('',(0.,0.,-1.));
+#12537 = DEFINITIONAL_REPRESENTATION('',(#12538),#12542);
+#12538 = LINE('',#12539,#12540);
+#12539 = CARTESIAN_POINT('',(0.,-0.275));
+#12540 = VECTOR('',#12541,1.);
+#12541 = DIRECTION('',(1.,0.));
+#12542 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12543 = ORIENTED_EDGE('',*,*,#12544,.T.);
+#12544 = EDGE_CURVE('',#12517,#12545,#12547,.T.);
+#12545 = VERTEX_POINT('',#12546);
+#12546 = CARTESIAN_POINT('',(3.9475,-4.085,-3.5));
+#12547 = SURFACE_CURVE('',#12548,(#12552,#12559),.PCURVE_S1.);
+#12548 = LINE('',#12549,#12550);
+#12549 = CARTESIAN_POINT('',(3.9475,-3.535,-3.5));
+#12550 = VECTOR('',#12551,1.);
+#12551 = DIRECTION('',(0.,-1.,0.));
+#12552 = PCURVE('',#12464,#12553);
+#12553 = DEFINITIONAL_REPRESENTATION('',(#12554),#12558);
+#12554 = LINE('',#12555,#12556);
+#12555 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#12556 = VECTOR('',#12557,1.);
+#12557 = DIRECTION('',(1.,2.226071387182E-62));
+#12558 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12559 = PCURVE('',#12560,#12565);
+#12560 = PLANE('',#12561);
+#12561 = AXIS2_PLACEMENT_3D('',#12562,#12563,#12564);
+#12562 = CARTESIAN_POINT('',(3.6725,-3.535,-3.5));
+#12563 = DIRECTION('',(0.,0.,-1.));
+#12564 = DIRECTION('',(0.,-1.,0.));
+#12565 = DEFINITIONAL_REPRESENTATION('',(#12566),#12570);
+#12566 = LINE('',#12567,#12568);
+#12567 = CARTESIAN_POINT('',(0.,-0.275));
+#12568 = VECTOR('',#12569,1.);
+#12569 = DIRECTION('',(1.,0.));
+#12570 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12571 = ORIENTED_EDGE('',*,*,#12572,.T.);
+#12572 = EDGE_CURVE('',#12545,#12573,#12575,.T.);
+#12573 = VERTEX_POINT('',#12574);
+#12574 = CARTESIAN_POINT('',(3.9475,-4.085,0.));
+#12575 = SURFACE_CURVE('',#12576,(#12580,#12587),.PCURVE_S1.);
+#12576 = LINE('',#12577,#12578);
+#12577 = CARTESIAN_POINT('',(3.9475,-4.085,-3.5));
+#12578 = VECTOR('',#12579,1.);
+#12579 = DIRECTION('',(0.,0.,1.));
+#12580 = PCURVE('',#12464,#12581);
+#12581 = DEFINITIONAL_REPRESENTATION('',(#12582),#12586);
+#12582 = LINE('',#12583,#12584);
+#12583 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#12584 = VECTOR('',#12585,1.);
+#12585 = DIRECTION('',(0.,1.));
+#12586 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12587 = PCURVE('',#12588,#12593);
+#12588 = PLANE('',#12589);
+#12589 = AXIS2_PLACEMENT_3D('',#12590,#12591,#12592);
+#12590 = CARTESIAN_POINT('',(3.6725,-4.085,-3.5));
+#12591 = DIRECTION('',(0.,-1.,0.));
+#12592 = DIRECTION('',(0.,0.,1.));
+#12593 = DEFINITIONAL_REPRESENTATION('',(#12594),#12598);
+#12594 = LINE('',#12595,#12596);
+#12595 = CARTESIAN_POINT('',(0.,-0.275));
+#12596 = VECTOR('',#12597,1.);
+#12597 = DIRECTION('',(1.,0.));
+#12598 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12599 = ORIENTED_EDGE('',*,*,#12600,.T.);
+#12600 = EDGE_CURVE('',#12573,#12601,#12603,.T.);
+#12601 = VERTEX_POINT('',#12602);
+#12602 = CARTESIAN_POINT('',(3.9475,-4.36,0.275));
+#12603 = SURFACE_CURVE('',#12604,(#12608,#12615),.PCURVE_S1.);
+#12604 = LINE('',#12605,#12606);
+#12605 = CARTESIAN_POINT('',(3.9475,-4.085,0.));
+#12606 = VECTOR('',#12607,1.);
+#12607 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#12608 = PCURVE('',#12464,#12609);
+#12609 = DEFINITIONAL_REPRESENTATION('',(#12610),#12614);
+#12610 = LINE('',#12611,#12612);
+#12611 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#12612 = VECTOR('',#12613,1.);
+#12613 = DIRECTION('',(0.707106781187,0.707106781187));
+#12614 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12615 = PCURVE('',#12616,#12621);
+#12616 = PLANE('',#12617);
+#12617 = AXIS2_PLACEMENT_3D('',#12618,#12619,#12620);
+#12618 = CARTESIAN_POINT('',(3.6725,-4.085,0.));
+#12619 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#12620 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#12621 = DEFINITIONAL_REPRESENTATION('',(#12622),#12626);
+#12622 = LINE('',#12623,#12624);
+#12623 = CARTESIAN_POINT('',(0.,-0.275));
+#12624 = VECTOR('',#12625,1.);
+#12625 = DIRECTION('',(1.,0.));
+#12626 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12627 = ORIENTED_EDGE('',*,*,#12628,.T.);
+#12628 = EDGE_CURVE('',#12601,#12629,#12631,.T.);
+#12629 = VERTEX_POINT('',#12630);
+#12630 = CARTESIAN_POINT('',(3.9475,-4.36,2.4225));
+#12631 = SURFACE_CURVE('',#12632,(#12636,#12643),.PCURVE_S1.);
+#12632 = LINE('',#12633,#12634);
+#12633 = CARTESIAN_POINT('',(3.9475,-4.36,0.275));
+#12634 = VECTOR('',#12635,1.);
+#12635 = DIRECTION('',(0.,0.,1.));
+#12636 = PCURVE('',#12464,#12637);
+#12637 = DEFINITIONAL_REPRESENTATION('',(#12638),#12642);
+#12638 = LINE('',#12639,#12640);
+#12639 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#12640 = VECTOR('',#12641,1.);
+#12641 = DIRECTION('',(0.,1.));
+#12642 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12643 = PCURVE('',#12644,#12649);
+#12644 = PLANE('',#12645);
+#12645 = AXIS2_PLACEMENT_3D('',#12646,#12647,#12648);
+#12646 = CARTESIAN_POINT('',(3.724778209321,-4.36,1.581028209321));
+#12647 = DIRECTION('',(1.308440111004E-29,-1.,1.156108129756E-30));
+#12648 = DIRECTION('',(-1.,-1.308440111004E-29,0.));
+#12649 = DEFINITIONAL_REPRESENTATION('',(#12650),#12654);
+#12650 = LINE('',#12651,#12652);
+#12651 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#12652 = VECTOR('',#12653,1.);
+#12653 = DIRECTION('',(0.,-1.));
+#12654 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12655 = ORIENTED_EDGE('',*,*,#12656,.T.);
+#12656 = EDGE_CURVE('',#12629,#12454,#12657,.T.);
+#12657 = SURFACE_CURVE('',#12658,(#12662,#12669),.PCURVE_S1.);
+#12658 = LINE('',#12659,#12660);
+#12659 = CARTESIAN_POINT('',(3.9475,-4.36,2.4225));
+#12660 = VECTOR('',#12661,1.);
+#12661 = DIRECTION('',(0.,1.,0.));
+#12662 = PCURVE('',#12464,#12663);
+#12663 = DEFINITIONAL_REPRESENTATION('',(#12664),#12668);
+#12664 = LINE('',#12665,#12666);
+#12665 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#12666 = VECTOR('',#12667,1.);
+#12667 = DIRECTION('',(-1.,-2.226071387182E-62));
+#12668 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12669 = PCURVE('',#12670,#12675);
+#12670 = CYLINDRICAL_SURFACE('',#12671,0.1375);
+#12671 = AXIS2_PLACEMENT_3D('',#12672,#12673,#12674);
+#12672 = CARTESIAN_POINT('',(3.81,-4.36,2.4225));
+#12673 = DIRECTION('',(0.,1.,0.));
+#12674 = DIRECTION('',(1.,0.,-9.8088568672E-33));
+#12675 = DEFINITIONAL_REPRESENTATION('',(#12676),#12680);
+#12676 = LINE('',#12677,#12678);
+#12677 = CARTESIAN_POINT('',(-0.,0.));
+#12678 = VECTOR('',#12679,1.);
+#12679 = DIRECTION('',(-0.,1.));
+#12680 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12681 = ADVANCED_FACE('',(#12682),#12476,.T.);
+#12682 = FACE_BOUND('',#12683,.T.);
+#12683 = EDGE_LOOP('',(#12684,#12714,#12740,#12741,#12764,#12792,#12820)
+ );
+#12684 = ORIENTED_EDGE('',*,*,#12685,.T.);
+#12685 = EDGE_CURVE('',#12686,#12688,#12690,.T.);
+#12686 = VERTEX_POINT('',#12687);
+#12687 = CARTESIAN_POINT('',(3.175,-3.26,2.56));
+#12688 = VERTEX_POINT('',#12689);
+#12689 = CARTESIAN_POINT('',(3.81,-3.26,2.56));
+#12690 = SURFACE_CURVE('',#12691,(#12695,#12702),.PCURVE_S1.);
+#12691 = LINE('',#12692,#12693);
+#12692 = CARTESIAN_POINT('',(3.6725,-3.26,2.56));
+#12693 = VECTOR('',#12694,1.);
+#12694 = DIRECTION('',(1.,0.,0.));
+#12695 = PCURVE('',#12476,#12696);
+#12696 = DEFINITIONAL_REPRESENTATION('',(#12697),#12701);
+#12697 = LINE('',#12698,#12699);
+#12698 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#12699 = VECTOR('',#12700,1.);
+#12700 = DIRECTION('',(1.,6.704108115824E-59));
+#12701 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12702 = PCURVE('',#12703,#12708);
+#12703 = PLANE('',#12704);
+#12704 = AXIS2_PLACEMENT_3D('',#12705,#12706,#12707);
+#12705 = CARTESIAN_POINT('',(3.56125,-3.81,2.56));
+#12706 = DIRECTION('',(-1.657312278749E-30,-1.304555144269E-30,1.));
+#12707 = DIRECTION('',(1.,0.,1.657312278749E-30));
+#12708 = DEFINITIONAL_REPRESENTATION('',(#12709),#12713);
+#12709 = LINE('',#12710,#12711);
+#12710 = CARTESIAN_POINT('',(0.11125,0.55));
+#12711 = VECTOR('',#12712,1.);
+#12712 = DIRECTION('',(1.,-2.162055258902E-60));
+#12713 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12714 = ORIENTED_EDGE('',*,*,#12715,.F.);
+#12715 = EDGE_CURVE('',#12454,#12688,#12716,.T.);
+#12716 = SURFACE_CURVE('',#12717,(#12722,#12733),.PCURVE_S1.);
+#12717 = CIRCLE('',#12718,0.1375);
+#12718 = AXIS2_PLACEMENT_3D('',#12719,#12720,#12721);
+#12719 = CARTESIAN_POINT('',(3.81,-3.26,2.4225));
+#12720 = DIRECTION('',(0.,-1.,0.));
+#12721 = DIRECTION('',(0.,0.,1.));
+#12722 = PCURVE('',#12476,#12723);
+#12723 = DEFINITIONAL_REPRESENTATION('',(#12724),#12732);
+#12724 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#12725,#12726,#12727,#12728
+ ,#12729,#12730,#12731),.UNSPECIFIED.,.F.,.F.)
+B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),(-2.094395102393,0.,
+ 2.094395102393,4.188790204786,6.28318530718,8.377580409573),
+.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM()
+RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM(
+ '') );
+#12725 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#12726 = CARTESIAN_POINT('',(-0.152935195362,-0.978971790679));
+#12727 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.772721790679));
+#12728 = CARTESIAN_POINT('',(8.522179067866E-02,-0.566471790679));
+#12729 = CARTESIAN_POINT('',(0.204300283699,-0.772721790679));
+#12730 = CARTESIAN_POINT('',(0.323378776719,-0.978971790679));
+#12731 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#12732 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12733 = PCURVE('',#12670,#12734);
+#12734 = DEFINITIONAL_REPRESENTATION('',(#12735),#12739);
+#12735 = LINE('',#12736,#12737);
+#12736 = CARTESIAN_POINT('',(4.712388980385,1.1));
+#12737 = VECTOR('',#12738,1.);
+#12738 = DIRECTION('',(-1.,0.));
+#12739 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12740 = ORIENTED_EDGE('',*,*,#12453,.T.);
+#12741 = ORIENTED_EDGE('',*,*,#12742,.F.);
+#12742 = EDGE_CURVE('',#12743,#12456,#12745,.T.);
+#12743 = VERTEX_POINT('',#12744);
+#12744 = CARTESIAN_POINT('',(3.6725,-3.26,0.275));
+#12745 = SURFACE_CURVE('',#12746,(#12750,#12757),.PCURVE_S1.);
+#12746 = LINE('',#12747,#12748);
+#12747 = CARTESIAN_POINT('',(3.6725,-3.26,0.275));
+#12748 = VECTOR('',#12749,1.);
+#12749 = DIRECTION('',(1.,0.,0.));
+#12750 = PCURVE('',#12476,#12751);
+#12751 = DEFINITIONAL_REPRESENTATION('',(#12752),#12756);
+#12752 = LINE('',#12753,#12754);
+#12753 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#12754 = VECTOR('',#12755,1.);
+#12755 = DIRECTION('',(1.,6.704108115824E-59));
+#12756 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12757 = PCURVE('',#12504,#12758);
+#12758 = DEFINITIONAL_REPRESENTATION('',(#12759),#12763);
+#12759 = LINE('',#12760,#12761);
+#12760 = CARTESIAN_POINT('',(4.710277376051E-16,0.));
+#12761 = VECTOR('',#12762,1.);
+#12762 = DIRECTION('',(0.,-1.));
+#12763 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12764 = ORIENTED_EDGE('',*,*,#12765,.F.);
+#12765 = EDGE_CURVE('',#12766,#12743,#12768,.T.);
+#12766 = VERTEX_POINT('',#12767);
+#12767 = CARTESIAN_POINT('',(3.6725,-3.26,2.285));
+#12768 = SURFACE_CURVE('',#12769,(#12773,#12780),.PCURVE_S1.);
+#12769 = LINE('',#12770,#12771);
+#12770 = CARTESIAN_POINT('',(3.6725,-3.26,2.56));
+#12771 = VECTOR('',#12772,1.);
+#12772 = DIRECTION('',(0.,0.,-1.));
+#12773 = PCURVE('',#12476,#12774);
+#12774 = DEFINITIONAL_REPRESENTATION('',(#12775),#12779);
+#12775 = LINE('',#12776,#12777);
+#12776 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#12777 = VECTOR('',#12778,1.);
+#12778 = DIRECTION('',(0.,1.));
+#12779 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12780 = PCURVE('',#12781,#12786);
+#12781 = PLANE('',#12782);
+#12782 = AXIS2_PLACEMENT_3D('',#12783,#12784,#12785);
+#12783 = CARTESIAN_POINT('',(3.6725,-3.81,-0.34105853382));
+#12784 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#12785 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#12786 = DEFINITIONAL_REPRESENTATION('',(#12787),#12791);
+#12787 = LINE('',#12788,#12789);
+#12788 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#12789 = VECTOR('',#12790,1.);
+#12790 = DIRECTION('',(0.,-1.));
+#12791 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12792 = ORIENTED_EDGE('',*,*,#12793,.F.);
+#12793 = EDGE_CURVE('',#12794,#12766,#12796,.T.);
+#12794 = VERTEX_POINT('',#12795);
+#12795 = CARTESIAN_POINT('',(3.175,-3.26,2.285));
+#12796 = SURFACE_CURVE('',#12797,(#12801,#12808),.PCURVE_S1.);
+#12797 = LINE('',#12798,#12799);
+#12798 = CARTESIAN_POINT('',(3.175,-3.26,2.285));
+#12799 = VECTOR('',#12800,1.);
+#12800 = DIRECTION('',(1.,0.,0.));
+#12801 = PCURVE('',#12476,#12802);
+#12802 = DEFINITIONAL_REPRESENTATION('',(#12803),#12807);
+#12803 = LINE('',#12804,#12805);
+#12804 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#12805 = VECTOR('',#12806,1.);
+#12806 = DIRECTION('',(1.,6.704108115824E-59));
+#12807 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12808 = PCURVE('',#12809,#12814);
+#12809 = PLANE('',#12810);
+#12810 = AXIS2_PLACEMENT_3D('',#12811,#12812,#12813);
+#12811 = CARTESIAN_POINT('',(3.175,-4.36,2.285));
+#12812 = DIRECTION('',(0.,0.,1.));
+#12813 = DIRECTION('',(1.,0.,0.));
+#12814 = DEFINITIONAL_REPRESENTATION('',(#12815),#12819);
+#12815 = LINE('',#12816,#12817);
+#12816 = CARTESIAN_POINT('',(0.,1.1));
+#12817 = VECTOR('',#12818,1.);
+#12818 = DIRECTION('',(1.,0.));
+#12819 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12820 = ORIENTED_EDGE('',*,*,#12821,.T.);
+#12821 = EDGE_CURVE('',#12794,#12686,#12822,.T.);
+#12822 = SURFACE_CURVE('',#12823,(#12827,#12834),.PCURVE_S1.);
+#12823 = LINE('',#12824,#12825);
+#12824 = CARTESIAN_POINT('',(3.175,-3.26,2.285));
+#12825 = VECTOR('',#12826,1.);
+#12826 = DIRECTION('',(0.,0.,1.));
+#12827 = PCURVE('',#12476,#12828);
+#12828 = DEFINITIONAL_REPRESENTATION('',(#12829),#12833);
+#12829 = LINE('',#12830,#12831);
+#12830 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#12831 = VECTOR('',#12832,1.);
+#12832 = DIRECTION('',(0.,-1.));
+#12833 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12834 = PCURVE('',#12835,#12840);
+#12835 = PLANE('',#12836);
+#12836 = AXIS2_PLACEMENT_3D('',#12837,#12838,#12839);
+#12837 = CARTESIAN_POINT('',(3.175,-4.36,2.285));
+#12838 = DIRECTION('',(1.,0.,0.));
+#12839 = DIRECTION('',(0.,0.,1.));
+#12840 = DEFINITIONAL_REPRESENTATION('',(#12841),#12845);
+#12841 = LINE('',#12842,#12843);
+#12842 = CARTESIAN_POINT('',(0.,-1.1));
+#12843 = VECTOR('',#12844,1.);
+#12844 = DIRECTION('',(1.,0.));
+#12845 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12846 = ADVANCED_FACE('',(#12847),#12670,.T.);
+#12847 = FACE_BOUND('',#12848,.F.);
+#12848 = EDGE_LOOP('',(#12849,#12873,#12894,#12895));
+#12849 = ORIENTED_EDGE('',*,*,#12850,.T.);
+#12850 = EDGE_CURVE('',#12629,#12851,#12853,.T.);
+#12851 = VERTEX_POINT('',#12852);
+#12852 = CARTESIAN_POINT('',(3.81,-4.36,2.56));
+#12853 = SURFACE_CURVE('',#12854,(#12859,#12866),.PCURVE_S1.);
+#12854 = CIRCLE('',#12855,0.1375);
+#12855 = AXIS2_PLACEMENT_3D('',#12856,#12857,#12858);
+#12856 = CARTESIAN_POINT('',(3.81,-4.36,2.4225));
+#12857 = DIRECTION('',(0.,-1.,0.));
+#12858 = DIRECTION('',(0.,0.,1.));
+#12859 = PCURVE('',#12670,#12860);
+#12860 = DEFINITIONAL_REPRESENTATION('',(#12861),#12865);
+#12861 = LINE('',#12862,#12863);
+#12862 = CARTESIAN_POINT('',(4.712388980385,-1.7763568394E-15));
+#12863 = VECTOR('',#12864,1.);
+#12864 = DIRECTION('',(-1.,0.));
+#12865 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12866 = PCURVE('',#12644,#12867);
+#12867 = DEFINITIONAL_REPRESENTATION('',(#12868),#12872);
+#12868 = CIRCLE('',#12869,0.1375);
+#12869 = AXIS2_PLACEMENT_2D('',#12870,#12871);
+#12870 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#12871 = DIRECTION('',(0.,-1.));
+#12872 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12873 = ORIENTED_EDGE('',*,*,#12874,.T.);
+#12874 = EDGE_CURVE('',#12851,#12688,#12875,.T.);
+#12875 = SURFACE_CURVE('',#12876,(#12880,#12887),.PCURVE_S1.);
+#12876 = LINE('',#12877,#12878);
+#12877 = CARTESIAN_POINT('',(3.81,-4.36,2.56));
+#12878 = VECTOR('',#12879,1.);
+#12879 = DIRECTION('',(0.,1.,0.));
+#12880 = PCURVE('',#12670,#12881);
+#12881 = DEFINITIONAL_REPRESENTATION('',(#12882),#12886);
+#12882 = LINE('',#12883,#12884);
+#12883 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#12884 = VECTOR('',#12885,1.);
+#12885 = DIRECTION('',(-0.,1.));
+#12886 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12887 = PCURVE('',#12703,#12888);
+#12888 = DEFINITIONAL_REPRESENTATION('',(#12889),#12893);
+#12889 = LINE('',#12890,#12891);
+#12890 = CARTESIAN_POINT('',(0.24875,-0.55));
+#12891 = VECTOR('',#12892,1.);
+#12892 = DIRECTION('',(0.,1.));
+#12893 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12894 = ORIENTED_EDGE('',*,*,#12715,.F.);
+#12895 = ORIENTED_EDGE('',*,*,#12656,.F.);
+#12896 = ADVANCED_FACE('',(#12897),#12504,.T.);
+#12897 = FACE_BOUND('',#12898,.T.);
+#12898 = EDGE_LOOP('',(#12899,#12900,#12901,#12924));
+#12899 = ORIENTED_EDGE('',*,*,#12742,.T.);
+#12900 = ORIENTED_EDGE('',*,*,#12488,.T.);
+#12901 = ORIENTED_EDGE('',*,*,#12902,.F.);
+#12902 = EDGE_CURVE('',#12903,#12489,#12905,.T.);
+#12903 = VERTEX_POINT('',#12904);
+#12904 = CARTESIAN_POINT('',(3.6725,-3.535,0.));
+#12905 = SURFACE_CURVE('',#12906,(#12910,#12917),.PCURVE_S1.);
+#12906 = LINE('',#12907,#12908);
+#12907 = CARTESIAN_POINT('',(3.6725,-3.535,0.));
+#12908 = VECTOR('',#12909,1.);
+#12909 = DIRECTION('',(1.,0.,0.));
+#12910 = PCURVE('',#12504,#12911);
+#12911 = DEFINITIONAL_REPRESENTATION('',(#12912),#12916);
+#12912 = LINE('',#12913,#12914);
+#12913 = CARTESIAN_POINT('',(0.388908729653,0.));
+#12914 = VECTOR('',#12915,1.);
+#12915 = DIRECTION('',(0.,-1.));
+#12916 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12917 = PCURVE('',#12532,#12918);
+#12918 = DEFINITIONAL_REPRESENTATION('',(#12919),#12923);
+#12919 = LINE('',#12920,#12921);
+#12920 = CARTESIAN_POINT('',(0.,0.));
+#12921 = VECTOR('',#12922,1.);
+#12922 = DIRECTION('',(0.,-1.));
+#12923 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12924 = ORIENTED_EDGE('',*,*,#12925,.F.);
+#12925 = EDGE_CURVE('',#12743,#12903,#12926,.T.);
+#12926 = SURFACE_CURVE('',#12927,(#12931,#12938),.PCURVE_S1.);
+#12927 = LINE('',#12928,#12929);
+#12928 = CARTESIAN_POINT('',(3.6725,-3.26,0.275));
+#12929 = VECTOR('',#12930,1.);
+#12930 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#12931 = PCURVE('',#12504,#12932);
+#12932 = DEFINITIONAL_REPRESENTATION('',(#12933),#12937);
+#12933 = LINE('',#12934,#12935);
+#12934 = CARTESIAN_POINT('',(0.,0.));
+#12935 = VECTOR('',#12936,1.);
+#12936 = DIRECTION('',(1.,0.));
+#12937 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12938 = PCURVE('',#12781,#12939);
+#12939 = DEFINITIONAL_REPRESENTATION('',(#12940),#12944);
+#12940 = LINE('',#12941,#12942);
+#12941 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#12942 = VECTOR('',#12943,1.);
+#12943 = DIRECTION('',(0.707106781187,-0.707106781187));
+#12944 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12945 = ADVANCED_FACE('',(#12946),#12644,.T.);
+#12946 = FACE_BOUND('',#12947,.T.);
+#12947 = EDGE_LOOP('',(#12948,#12949,#12950,#12973,#12996,#13019,#13042)
+ );
+#12948 = ORIENTED_EDGE('',*,*,#12628,.T.);
+#12949 = ORIENTED_EDGE('',*,*,#12850,.T.);
+#12950 = ORIENTED_EDGE('',*,*,#12951,.F.);
+#12951 = EDGE_CURVE('',#12952,#12851,#12954,.T.);
+#12952 = VERTEX_POINT('',#12953);
+#12953 = CARTESIAN_POINT('',(3.175,-4.36,2.56));
+#12954 = SURFACE_CURVE('',#12955,(#12959,#12966),.PCURVE_S1.);
+#12955 = LINE('',#12956,#12957);
+#12956 = CARTESIAN_POINT('',(3.6725,-4.36,2.56));
+#12957 = VECTOR('',#12958,1.);
+#12958 = DIRECTION('',(1.,0.,0.));
+#12959 = PCURVE('',#12644,#12960);
+#12960 = DEFINITIONAL_REPRESENTATION('',(#12961),#12965);
+#12961 = LINE('',#12962,#12963);
+#12962 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#12963 = VECTOR('',#12964,1.);
+#12964 = DIRECTION('',(-1.,1.51269824963E-59));
+#12965 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12966 = PCURVE('',#12703,#12967);
+#12967 = DEFINITIONAL_REPRESENTATION('',(#12968),#12972);
+#12968 = LINE('',#12969,#12970);
+#12969 = CARTESIAN_POINT('',(0.11125,-0.55));
+#12970 = VECTOR('',#12971,1.);
+#12971 = DIRECTION('',(1.,-2.162055258902E-60));
+#12972 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12973 = ORIENTED_EDGE('',*,*,#12974,.F.);
+#12974 = EDGE_CURVE('',#12975,#12952,#12977,.T.);
+#12975 = VERTEX_POINT('',#12976);
+#12976 = CARTESIAN_POINT('',(3.175,-4.36,2.285));
+#12977 = SURFACE_CURVE('',#12978,(#12982,#12989),.PCURVE_S1.);
+#12978 = LINE('',#12979,#12980);
+#12979 = CARTESIAN_POINT('',(3.175,-4.36,2.285));
+#12980 = VECTOR('',#12981,1.);
+#12981 = DIRECTION('',(0.,0.,1.));
+#12982 = PCURVE('',#12644,#12983);
+#12983 = DEFINITIONAL_REPRESENTATION('',(#12984),#12988);
+#12984 = LINE('',#12985,#12986);
+#12985 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#12986 = VECTOR('',#12987,1.);
+#12987 = DIRECTION('',(0.,-1.));
+#12988 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12989 = PCURVE('',#12835,#12990);
+#12990 = DEFINITIONAL_REPRESENTATION('',(#12991),#12995);
+#12991 = LINE('',#12992,#12993);
+#12992 = CARTESIAN_POINT('',(0.,0.));
+#12993 = VECTOR('',#12994,1.);
+#12994 = DIRECTION('',(1.,0.));
+#12995 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#12996 = ORIENTED_EDGE('',*,*,#12997,.T.);
+#12997 = EDGE_CURVE('',#12975,#12998,#13000,.T.);
+#12998 = VERTEX_POINT('',#12999);
+#12999 = CARTESIAN_POINT('',(3.6725,-4.36,2.285));
+#13000 = SURFACE_CURVE('',#13001,(#13005,#13012),.PCURVE_S1.);
+#13001 = LINE('',#13002,#13003);
+#13002 = CARTESIAN_POINT('',(3.175,-4.36,2.285));
+#13003 = VECTOR('',#13004,1.);
+#13004 = DIRECTION('',(1.,0.,0.));
+#13005 = PCURVE('',#12644,#13006);
+#13006 = DEFINITIONAL_REPRESENTATION('',(#13007),#13011);
+#13007 = LINE('',#13008,#13009);
+#13008 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#13009 = VECTOR('',#13010,1.);
+#13010 = DIRECTION('',(-1.,1.51269824963E-59));
+#13011 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13012 = PCURVE('',#12809,#13013);
+#13013 = DEFINITIONAL_REPRESENTATION('',(#13014),#13018);
+#13014 = LINE('',#13015,#13016);
+#13015 = CARTESIAN_POINT('',(0.,0.));
+#13016 = VECTOR('',#13017,1.);
+#13017 = DIRECTION('',(1.,0.));
+#13018 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13019 = ORIENTED_EDGE('',*,*,#13020,.F.);
+#13020 = EDGE_CURVE('',#13021,#12998,#13023,.T.);
+#13021 = VERTEX_POINT('',#13022);
+#13022 = CARTESIAN_POINT('',(3.6725,-4.36,0.275));
+#13023 = SURFACE_CURVE('',#13024,(#13028,#13035),.PCURVE_S1.);
+#13024 = LINE('',#13025,#13026);
+#13025 = CARTESIAN_POINT('',(3.6725,-4.36,0.275));
+#13026 = VECTOR('',#13027,1.);
+#13027 = DIRECTION('',(0.,0.,1.));
+#13028 = PCURVE('',#12644,#13029);
+#13029 = DEFINITIONAL_REPRESENTATION('',(#13030),#13034);
+#13030 = LINE('',#13031,#13032);
+#13031 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#13032 = VECTOR('',#13033,1.);
+#13033 = DIRECTION('',(0.,-1.));
+#13034 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13035 = PCURVE('',#12781,#13036);
+#13036 = DEFINITIONAL_REPRESENTATION('',(#13037),#13041);
+#13037 = LINE('',#13038,#13039);
+#13038 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#13039 = VECTOR('',#13040,1.);
+#13040 = DIRECTION('',(0.,1.));
+#13041 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13042 = ORIENTED_EDGE('',*,*,#13043,.T.);
+#13043 = EDGE_CURVE('',#13021,#12601,#13044,.T.);
+#13044 = SURFACE_CURVE('',#13045,(#13049,#13056),.PCURVE_S1.);
+#13045 = LINE('',#13046,#13047);
+#13046 = CARTESIAN_POINT('',(3.6725,-4.36,0.275));
+#13047 = VECTOR('',#13048,1.);
+#13048 = DIRECTION('',(1.,0.,0.));
+#13049 = PCURVE('',#12644,#13050);
+#13050 = DEFINITIONAL_REPRESENTATION('',(#13051),#13055);
+#13051 = LINE('',#13052,#13053);
+#13052 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#13053 = VECTOR('',#13054,1.);
+#13054 = DIRECTION('',(-1.,1.51269824963E-59));
+#13055 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13056 = PCURVE('',#12616,#13057);
+#13057 = DEFINITIONAL_REPRESENTATION('',(#13058),#13062);
+#13058 = LINE('',#13059,#13060);
+#13059 = CARTESIAN_POINT('',(0.388908729653,0.));
+#13060 = VECTOR('',#13061,1.);
+#13061 = DIRECTION('',(0.,-1.));
+#13062 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13063 = ADVANCED_FACE('',(#13064),#12532,.T.);
+#13064 = FACE_BOUND('',#13065,.T.);
+#13065 = EDGE_LOOP('',(#13066,#13067,#13068,#13091));
+#13066 = ORIENTED_EDGE('',*,*,#12902,.T.);
+#13067 = ORIENTED_EDGE('',*,*,#12516,.T.);
+#13068 = ORIENTED_EDGE('',*,*,#13069,.F.);
+#13069 = EDGE_CURVE('',#13070,#12517,#13072,.T.);
+#13070 = VERTEX_POINT('',#13071);
+#13071 = CARTESIAN_POINT('',(3.6725,-3.535,-3.5));
+#13072 = SURFACE_CURVE('',#13073,(#13077,#13084),.PCURVE_S1.);
+#13073 = LINE('',#13074,#13075);
+#13074 = CARTESIAN_POINT('',(3.6725,-3.535,-3.5));
+#13075 = VECTOR('',#13076,1.);
+#13076 = DIRECTION('',(1.,0.,0.));
+#13077 = PCURVE('',#12532,#13078);
+#13078 = DEFINITIONAL_REPRESENTATION('',(#13079),#13083);
+#13079 = LINE('',#13080,#13081);
+#13080 = CARTESIAN_POINT('',(3.5,0.));
+#13081 = VECTOR('',#13082,1.);
+#13082 = DIRECTION('',(0.,-1.));
+#13083 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13084 = PCURVE('',#12560,#13085);
+#13085 = DEFINITIONAL_REPRESENTATION('',(#13086),#13090);
+#13086 = LINE('',#13087,#13088);
+#13087 = CARTESIAN_POINT('',(7.771561172376E-16,0.));
+#13088 = VECTOR('',#13089,1.);
+#13089 = DIRECTION('',(0.,-1.));
+#13090 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13091 = ORIENTED_EDGE('',*,*,#13092,.F.);
+#13092 = EDGE_CURVE('',#12903,#13070,#13093,.T.);
+#13093 = SURFACE_CURVE('',#13094,(#13098,#13105),.PCURVE_S1.);
+#13094 = LINE('',#13095,#13096);
+#13095 = CARTESIAN_POINT('',(3.6725,-3.535,0.));
+#13096 = VECTOR('',#13097,1.);
+#13097 = DIRECTION('',(0.,0.,-1.));
+#13098 = PCURVE('',#12532,#13099);
+#13099 = DEFINITIONAL_REPRESENTATION('',(#13100),#13104);
+#13100 = LINE('',#13101,#13102);
+#13101 = CARTESIAN_POINT('',(0.,0.));
+#13102 = VECTOR('',#13103,1.);
+#13103 = DIRECTION('',(1.,0.));
+#13104 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13105 = PCURVE('',#12781,#13106);
+#13106 = DEFINITIONAL_REPRESENTATION('',(#13107),#13111);
+#13107 = LINE('',#13108,#13109);
+#13108 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#13109 = VECTOR('',#13110,1.);
+#13110 = DIRECTION('',(0.,-1.));
+#13111 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13112 = ADVANCED_FACE('',(#13113),#12616,.T.);
+#13113 = FACE_BOUND('',#13114,.T.);
+#13114 = EDGE_LOOP('',(#13115,#13138,#13139,#13140));
+#13115 = ORIENTED_EDGE('',*,*,#13116,.T.);
+#13116 = EDGE_CURVE('',#13117,#12573,#13119,.T.);
+#13117 = VERTEX_POINT('',#13118);
+#13118 = CARTESIAN_POINT('',(3.6725,-4.085,0.));
+#13119 = SURFACE_CURVE('',#13120,(#13124,#13131),.PCURVE_S1.);
+#13120 = LINE('',#13121,#13122);
+#13121 = CARTESIAN_POINT('',(3.6725,-4.085,0.));
+#13122 = VECTOR('',#13123,1.);
+#13123 = DIRECTION('',(1.,0.,0.));
+#13124 = PCURVE('',#12616,#13125);
+#13125 = DEFINITIONAL_REPRESENTATION('',(#13126),#13130);
+#13126 = LINE('',#13127,#13128);
+#13127 = CARTESIAN_POINT('',(-1.177569344013E-16,0.));
+#13128 = VECTOR('',#13129,1.);
+#13129 = DIRECTION('',(0.,-1.));
+#13130 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13131 = PCURVE('',#12588,#13132);
+#13132 = DEFINITIONAL_REPRESENTATION('',(#13133),#13137);
+#13133 = LINE('',#13134,#13135);
+#13134 = CARTESIAN_POINT('',(3.5,0.));
+#13135 = VECTOR('',#13136,1.);
+#13136 = DIRECTION('',(0.,-1.));
+#13137 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13138 = ORIENTED_EDGE('',*,*,#12600,.T.);
+#13139 = ORIENTED_EDGE('',*,*,#13043,.F.);
+#13140 = ORIENTED_EDGE('',*,*,#13141,.F.);
+#13141 = EDGE_CURVE('',#13117,#13021,#13142,.T.);
+#13142 = SURFACE_CURVE('',#13143,(#13147,#13154),.PCURVE_S1.);
+#13143 = LINE('',#13144,#13145);
+#13144 = CARTESIAN_POINT('',(3.6725,-4.085,0.));
+#13145 = VECTOR('',#13146,1.);
+#13146 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#13147 = PCURVE('',#12616,#13148);
+#13148 = DEFINITIONAL_REPRESENTATION('',(#13149),#13153);
+#13149 = LINE('',#13150,#13151);
+#13150 = CARTESIAN_POINT('',(0.,0.));
+#13151 = VECTOR('',#13152,1.);
+#13152 = DIRECTION('',(1.,0.));
+#13153 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13154 = PCURVE('',#12781,#13155);
+#13155 = DEFINITIONAL_REPRESENTATION('',(#13156),#13160);
+#13156 = LINE('',#13157,#13158);
+#13157 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#13158 = VECTOR('',#13159,1.);
+#13159 = DIRECTION('',(0.707106781187,0.707106781187));
+#13160 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13161 = ADVANCED_FACE('',(#13162),#12560,.T.);
+#13162 = FACE_BOUND('',#13163,.T.);
+#13163 = EDGE_LOOP('',(#13164,#13165,#13166,#13189));
+#13164 = ORIENTED_EDGE('',*,*,#13069,.T.);
+#13165 = ORIENTED_EDGE('',*,*,#12544,.T.);
+#13166 = ORIENTED_EDGE('',*,*,#13167,.F.);
+#13167 = EDGE_CURVE('',#13168,#12545,#13170,.T.);
+#13168 = VERTEX_POINT('',#13169);
+#13169 = CARTESIAN_POINT('',(3.6725,-4.085,-3.5));
+#13170 = SURFACE_CURVE('',#13171,(#13175,#13182),.PCURVE_S1.);
+#13171 = LINE('',#13172,#13173);
+#13172 = CARTESIAN_POINT('',(3.6725,-4.085,-3.5));
+#13173 = VECTOR('',#13174,1.);
+#13174 = DIRECTION('',(1.,0.,0.));
+#13175 = PCURVE('',#12560,#13176);
+#13176 = DEFINITIONAL_REPRESENTATION('',(#13177),#13181);
+#13177 = LINE('',#13178,#13179);
+#13178 = CARTESIAN_POINT('',(0.55,0.));
+#13179 = VECTOR('',#13180,1.);
+#13180 = DIRECTION('',(0.,-1.));
+#13181 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13182 = PCURVE('',#12588,#13183);
+#13183 = DEFINITIONAL_REPRESENTATION('',(#13184),#13188);
+#13184 = LINE('',#13185,#13186);
+#13185 = CARTESIAN_POINT('',(0.,0.));
+#13186 = VECTOR('',#13187,1.);
+#13187 = DIRECTION('',(0.,-1.));
+#13188 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13189 = ORIENTED_EDGE('',*,*,#13190,.F.);
+#13190 = EDGE_CURVE('',#13070,#13168,#13191,.T.);
+#13191 = SURFACE_CURVE('',#13192,(#13196,#13203),.PCURVE_S1.);
+#13192 = LINE('',#13193,#13194);
+#13193 = CARTESIAN_POINT('',(3.6725,-3.535,-3.5));
+#13194 = VECTOR('',#13195,1.);
+#13195 = DIRECTION('',(0.,-1.,0.));
+#13196 = PCURVE('',#12560,#13197);
+#13197 = DEFINITIONAL_REPRESENTATION('',(#13198),#13202);
+#13198 = LINE('',#13199,#13200);
+#13199 = CARTESIAN_POINT('',(0.,-0.));
+#13200 = VECTOR('',#13201,1.);
+#13201 = DIRECTION('',(1.,0.));
+#13202 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13203 = PCURVE('',#12781,#13204);
+#13204 = DEFINITIONAL_REPRESENTATION('',(#13205),#13209);
+#13205 = LINE('',#13206,#13207);
+#13206 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#13207 = VECTOR('',#13208,1.);
+#13208 = DIRECTION('',(1.,2.226071387182E-62));
+#13209 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13210 = ADVANCED_FACE('',(#13211),#12588,.T.);
+#13211 = FACE_BOUND('',#13212,.T.);
+#13212 = EDGE_LOOP('',(#13213,#13214,#13215,#13216));
+#13213 = ORIENTED_EDGE('',*,*,#13167,.T.);
+#13214 = ORIENTED_EDGE('',*,*,#12572,.T.);
+#13215 = ORIENTED_EDGE('',*,*,#13116,.F.);
+#13216 = ORIENTED_EDGE('',*,*,#13217,.F.);
+#13217 = EDGE_CURVE('',#13168,#13117,#13218,.T.);
+#13218 = SURFACE_CURVE('',#13219,(#13223,#13230),.PCURVE_S1.);
+#13219 = LINE('',#13220,#13221);
+#13220 = CARTESIAN_POINT('',(3.6725,-4.085,-3.5));
+#13221 = VECTOR('',#13222,1.);
+#13222 = DIRECTION('',(0.,0.,1.));
+#13223 = PCURVE('',#12588,#13224);
+#13224 = DEFINITIONAL_REPRESENTATION('',(#13225),#13229);
+#13225 = LINE('',#13226,#13227);
+#13226 = CARTESIAN_POINT('',(0.,0.));
+#13227 = VECTOR('',#13228,1.);
+#13228 = DIRECTION('',(1.,0.));
+#13229 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13230 = PCURVE('',#12781,#13231);
+#13231 = DEFINITIONAL_REPRESENTATION('',(#13232),#13236);
+#13232 = LINE('',#13233,#13234);
+#13233 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#13234 = VECTOR('',#13235,1.);
+#13235 = DIRECTION('',(0.,1.));
+#13236 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13237 = ADVANCED_FACE('',(#13238),#12703,.T.);
+#13238 = FACE_BOUND('',#13239,.T.);
+#13239 = EDGE_LOOP('',(#13240,#13241,#13242,#13243));
+#13240 = ORIENTED_EDGE('',*,*,#12951,.T.);
+#13241 = ORIENTED_EDGE('',*,*,#12874,.T.);
+#13242 = ORIENTED_EDGE('',*,*,#12685,.F.);
+#13243 = ORIENTED_EDGE('',*,*,#13244,.F.);
+#13244 = EDGE_CURVE('',#12952,#12686,#13245,.T.);
+#13245 = SURFACE_CURVE('',#13246,(#13250,#13257),.PCURVE_S1.);
+#13246 = LINE('',#13247,#13248);
+#13247 = CARTESIAN_POINT('',(3.175,-4.36,2.56));
+#13248 = VECTOR('',#13249,1.);
+#13249 = DIRECTION('',(0.,1.,0.));
+#13250 = PCURVE('',#12703,#13251);
+#13251 = DEFINITIONAL_REPRESENTATION('',(#13252),#13256);
+#13252 = LINE('',#13253,#13254);
+#13253 = CARTESIAN_POINT('',(-0.38625,-0.55));
+#13254 = VECTOR('',#13255,1.);
+#13255 = DIRECTION('',(0.,1.));
+#13256 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13257 = PCURVE('',#12835,#13258);
+#13258 = DEFINITIONAL_REPRESENTATION('',(#13259),#13263);
+#13259 = LINE('',#13260,#13261);
+#13260 = CARTESIAN_POINT('',(0.275,0.));
+#13261 = VECTOR('',#13262,1.);
+#13262 = DIRECTION('',(0.,-1.));
+#13263 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13264 = ADVANCED_FACE('',(#13265),#12835,.F.);
+#13265 = FACE_BOUND('',#13266,.F.);
+#13266 = EDGE_LOOP('',(#13267,#13268,#13289,#13290));
+#13267 = ORIENTED_EDGE('',*,*,#12974,.F.);
+#13268 = ORIENTED_EDGE('',*,*,#13269,.T.);
+#13269 = EDGE_CURVE('',#12975,#12794,#13270,.T.);
+#13270 = SURFACE_CURVE('',#13271,(#13275,#13282),.PCURVE_S1.);
+#13271 = LINE('',#13272,#13273);
+#13272 = CARTESIAN_POINT('',(3.175,-4.36,2.285));
+#13273 = VECTOR('',#13274,1.);
+#13274 = DIRECTION('',(0.,1.,0.));
+#13275 = PCURVE('',#12835,#13276);
+#13276 = DEFINITIONAL_REPRESENTATION('',(#13277),#13281);
+#13277 = LINE('',#13278,#13279);
+#13278 = CARTESIAN_POINT('',(0.,0.));
+#13279 = VECTOR('',#13280,1.);
+#13280 = DIRECTION('',(0.,-1.));
+#13281 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13282 = PCURVE('',#12809,#13283);
+#13283 = DEFINITIONAL_REPRESENTATION('',(#13284),#13288);
+#13284 = LINE('',#13285,#13286);
+#13285 = CARTESIAN_POINT('',(0.,0.));
+#13286 = VECTOR('',#13287,1.);
+#13287 = DIRECTION('',(0.,1.));
+#13288 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13289 = ORIENTED_EDGE('',*,*,#12821,.T.);
+#13290 = ORIENTED_EDGE('',*,*,#13244,.F.);
+#13291 = ADVANCED_FACE('',(#13292),#12809,.F.);
+#13292 = FACE_BOUND('',#13293,.F.);
+#13293 = EDGE_LOOP('',(#13294,#13295,#13296,#13317));
+#13294 = ORIENTED_EDGE('',*,*,#13269,.F.);
+#13295 = ORIENTED_EDGE('',*,*,#12997,.T.);
+#13296 = ORIENTED_EDGE('',*,*,#13297,.T.);
+#13297 = EDGE_CURVE('',#12998,#12766,#13298,.T.);
+#13298 = SURFACE_CURVE('',#13299,(#13303,#13310),.PCURVE_S1.);
+#13299 = LINE('',#13300,#13301);
+#13300 = CARTESIAN_POINT('',(3.6725,-4.36,2.285));
+#13301 = VECTOR('',#13302,1.);
+#13302 = DIRECTION('',(0.,1.,0.));
+#13303 = PCURVE('',#12809,#13304);
+#13304 = DEFINITIONAL_REPRESENTATION('',(#13305),#13309);
+#13305 = LINE('',#13306,#13307);
+#13306 = CARTESIAN_POINT('',(0.4975,0.));
+#13307 = VECTOR('',#13308,1.);
+#13308 = DIRECTION('',(0.,1.));
+#13309 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13310 = PCURVE('',#12781,#13311);
+#13311 = DEFINITIONAL_REPRESENTATION('',(#13312),#13316);
+#13312 = LINE('',#13313,#13314);
+#13313 = CARTESIAN_POINT('',(0.55,2.62605853382));
+#13314 = VECTOR('',#13315,1.);
+#13315 = DIRECTION('',(-1.,-2.226071387182E-62));
+#13316 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13317 = ORIENTED_EDGE('',*,*,#12793,.F.);
+#13318 = ADVANCED_FACE('',(#13319),#12781,.T.);
+#13319 = FACE_BOUND('',#13320,.T.);
+#13320 = EDGE_LOOP('',(#13321,#13322,#13323,#13324,#13325,#13326,#13327,
+ #13328));
+#13321 = ORIENTED_EDGE('',*,*,#13020,.T.);
+#13322 = ORIENTED_EDGE('',*,*,#13297,.T.);
+#13323 = ORIENTED_EDGE('',*,*,#12765,.T.);
+#13324 = ORIENTED_EDGE('',*,*,#12925,.T.);
+#13325 = ORIENTED_EDGE('',*,*,#13092,.T.);
+#13326 = ORIENTED_EDGE('',*,*,#13190,.T.);
+#13327 = ORIENTED_EDGE('',*,*,#13217,.T.);
+#13328 = ORIENTED_EDGE('',*,*,#13141,.T.);
+#13329 = MANIFOLD_SOLID_BREP('',#13330);
+#13330 = CLOSED_SHELL('',(#13331,#13563,#13728,#13778,#13827,#13945,
+ #13994,#14043,#14092,#14119,#14146,#14173,#14200));
+#13331 = ADVANCED_FACE('',(#13332),#13346,.F.);
+#13332 = FACE_BOUND('',#13333,.F.);
+#13333 = EDGE_LOOP('',(#13334,#13369,#13397,#13425,#13453,#13481,#13509,
+ #13537));
+#13334 = ORIENTED_EDGE('',*,*,#13335,.T.);
+#13335 = EDGE_CURVE('',#13336,#13338,#13340,.T.);
+#13336 = VERTEX_POINT('',#13337);
+#13337 = CARTESIAN_POINT('',(-3.9475,-6.9,2.4225));
+#13338 = VERTEX_POINT('',#13339);
+#13339 = CARTESIAN_POINT('',(-3.9475,-6.9,0.275));
+#13340 = SURFACE_CURVE('',#13341,(#13345,#13357),.PCURVE_S1.);
+#13341 = LINE('',#13342,#13343);
+#13342 = CARTESIAN_POINT('',(-3.9475,-6.9,2.56));
+#13343 = VECTOR('',#13344,1.);
+#13344 = DIRECTION('',(0.,0.,-1.));
+#13345 = PCURVE('',#13346,#13351);
+#13346 = PLANE('',#13347);
+#13347 = AXIS2_PLACEMENT_3D('',#13348,#13349,#13350);
+#13348 = CARTESIAN_POINT('',(-3.9475,-6.35,-0.34105853382));
+#13349 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#13350 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#13351 = DEFINITIONAL_REPRESENTATION('',(#13352),#13356);
+#13352 = LINE('',#13353,#13354);
+#13353 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#13354 = VECTOR('',#13355,1.);
+#13355 = DIRECTION('',(0.,-1.));
+#13356 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13357 = PCURVE('',#13358,#13363);
+#13358 = PLANE('',#13359);
+#13359 = AXIS2_PLACEMENT_3D('',#13360,#13361,#13362);
+#13360 = CARTESIAN_POINT('',(-3.724778209321,-6.9,1.581028209321));
+#13361 = DIRECTION('',(1.58726821659E-29,-1.,-1.055919227411E-30));
+#13362 = DIRECTION('',(-1.,-1.58726821659E-29,0.));
+#13363 = DEFINITIONAL_REPRESENTATION('',(#13364),#13368);
+#13364 = LINE('',#13365,#13366);
+#13365 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#13366 = VECTOR('',#13367,1.);
+#13367 = DIRECTION('',(0.,1.));
+#13368 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13369 = ORIENTED_EDGE('',*,*,#13370,.T.);
+#13370 = EDGE_CURVE('',#13338,#13371,#13373,.T.);
+#13371 = VERTEX_POINT('',#13372);
+#13372 = CARTESIAN_POINT('',(-3.9475,-6.625,0.));
+#13373 = SURFACE_CURVE('',#13374,(#13378,#13385),.PCURVE_S1.);
+#13374 = LINE('',#13375,#13376);
+#13375 = CARTESIAN_POINT('',(-3.9475,-6.9,0.275));
+#13376 = VECTOR('',#13377,1.);
+#13377 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#13378 = PCURVE('',#13346,#13379);
+#13379 = DEFINITIONAL_REPRESENTATION('',(#13380),#13384);
+#13380 = LINE('',#13381,#13382);
+#13381 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#13382 = VECTOR('',#13383,1.);
+#13383 = DIRECTION('',(0.707106781187,-0.707106781187));
+#13384 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13385 = PCURVE('',#13386,#13391);
+#13386 = PLANE('',#13387);
+#13387 = AXIS2_PLACEMENT_3D('',#13388,#13389,#13390);
+#13388 = CARTESIAN_POINT('',(-3.6725,-6.9,0.275));
+#13389 = DIRECTION('',(-0.,-0.707106781187,-0.707106781187));
+#13390 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#13391 = DEFINITIONAL_REPRESENTATION('',(#13392),#13396);
+#13392 = LINE('',#13393,#13394);
+#13393 = CARTESIAN_POINT('',(0.,-0.275));
+#13394 = VECTOR('',#13395,1.);
+#13395 = DIRECTION('',(1.,0.));
+#13396 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13397 = ORIENTED_EDGE('',*,*,#13398,.T.);
+#13398 = EDGE_CURVE('',#13371,#13399,#13401,.T.);
+#13399 = VERTEX_POINT('',#13400);
+#13400 = CARTESIAN_POINT('',(-3.9475,-6.625,-3.5));
+#13401 = SURFACE_CURVE('',#13402,(#13406,#13413),.PCURVE_S1.);
+#13402 = LINE('',#13403,#13404);
+#13403 = CARTESIAN_POINT('',(-3.9475,-6.625,0.));
+#13404 = VECTOR('',#13405,1.);
+#13405 = DIRECTION('',(0.,0.,-1.));
+#13406 = PCURVE('',#13346,#13407);
+#13407 = DEFINITIONAL_REPRESENTATION('',(#13408),#13412);
+#13408 = LINE('',#13409,#13410);
+#13409 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#13410 = VECTOR('',#13411,1.);
+#13411 = DIRECTION('',(0.,-1.));
+#13412 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13413 = PCURVE('',#13414,#13419);
+#13414 = PLANE('',#13415);
+#13415 = AXIS2_PLACEMENT_3D('',#13416,#13417,#13418);
+#13416 = CARTESIAN_POINT('',(-3.6725,-6.625,0.));
+#13417 = DIRECTION('',(-0.,-1.,-0.));
+#13418 = DIRECTION('',(0.,0.,-1.));
+#13419 = DEFINITIONAL_REPRESENTATION('',(#13420),#13424);
+#13420 = LINE('',#13421,#13422);
+#13421 = CARTESIAN_POINT('',(0.,-0.275));
+#13422 = VECTOR('',#13423,1.);
+#13423 = DIRECTION('',(1.,0.));
+#13424 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13425 = ORIENTED_EDGE('',*,*,#13426,.T.);
+#13426 = EDGE_CURVE('',#13399,#13427,#13429,.T.);
+#13427 = VERTEX_POINT('',#13428);
+#13428 = CARTESIAN_POINT('',(-3.9475,-6.075,-3.5));
+#13429 = SURFACE_CURVE('',#13430,(#13434,#13441),.PCURVE_S1.);
+#13430 = LINE('',#13431,#13432);
+#13431 = CARTESIAN_POINT('',(-3.9475,-6.625,-3.5));
+#13432 = VECTOR('',#13433,1.);
+#13433 = DIRECTION('',(0.,1.,0.));
+#13434 = PCURVE('',#13346,#13435);
+#13435 = DEFINITIONAL_REPRESENTATION('',(#13436),#13440);
+#13436 = LINE('',#13437,#13438);
+#13437 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#13438 = VECTOR('',#13439,1.);
+#13439 = DIRECTION('',(1.,-2.226071387182E-62));
+#13440 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13441 = PCURVE('',#13442,#13447);
+#13442 = PLANE('',#13443);
+#13443 = AXIS2_PLACEMENT_3D('',#13444,#13445,#13446);
+#13444 = CARTESIAN_POINT('',(-3.6725,-6.625,-3.5));
+#13445 = DIRECTION('',(0.,0.,-1.));
+#13446 = DIRECTION('',(0.,1.,0.));
+#13447 = DEFINITIONAL_REPRESENTATION('',(#13448),#13452);
+#13448 = LINE('',#13449,#13450);
+#13449 = CARTESIAN_POINT('',(0.,-0.275));
+#13450 = VECTOR('',#13451,1.);
+#13451 = DIRECTION('',(1.,0.));
+#13452 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13453 = ORIENTED_EDGE('',*,*,#13454,.T.);
+#13454 = EDGE_CURVE('',#13427,#13455,#13457,.T.);
+#13455 = VERTEX_POINT('',#13456);
+#13456 = CARTESIAN_POINT('',(-3.9475,-6.075,0.));
+#13457 = SURFACE_CURVE('',#13458,(#13462,#13469),.PCURVE_S1.);
+#13458 = LINE('',#13459,#13460);
+#13459 = CARTESIAN_POINT('',(-3.9475,-6.075,-3.5));
+#13460 = VECTOR('',#13461,1.);
+#13461 = DIRECTION('',(0.,0.,1.));
+#13462 = PCURVE('',#13346,#13463);
+#13463 = DEFINITIONAL_REPRESENTATION('',(#13464),#13468);
+#13464 = LINE('',#13465,#13466);
+#13465 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#13466 = VECTOR('',#13467,1.);
+#13467 = DIRECTION('',(0.,1.));
+#13468 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13469 = PCURVE('',#13470,#13475);
+#13470 = PLANE('',#13471);
+#13471 = AXIS2_PLACEMENT_3D('',#13472,#13473,#13474);
+#13472 = CARTESIAN_POINT('',(-3.6725,-6.075,-3.5));
+#13473 = DIRECTION('',(0.,1.,0.));
+#13474 = DIRECTION('',(0.,0.,1.));
+#13475 = DEFINITIONAL_REPRESENTATION('',(#13476),#13480);
+#13476 = LINE('',#13477,#13478);
+#13477 = CARTESIAN_POINT('',(0.,-0.275));
+#13478 = VECTOR('',#13479,1.);
+#13479 = DIRECTION('',(1.,0.));
+#13480 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13481 = ORIENTED_EDGE('',*,*,#13482,.T.);
+#13482 = EDGE_CURVE('',#13455,#13483,#13485,.T.);
+#13483 = VERTEX_POINT('',#13484);
+#13484 = CARTESIAN_POINT('',(-3.9475,-5.8,0.275));
+#13485 = SURFACE_CURVE('',#13486,(#13490,#13497),.PCURVE_S1.);
+#13486 = LINE('',#13487,#13488);
+#13487 = CARTESIAN_POINT('',(-3.9475,-6.075,0.));
+#13488 = VECTOR('',#13489,1.);
+#13489 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#13490 = PCURVE('',#13346,#13491);
+#13491 = DEFINITIONAL_REPRESENTATION('',(#13492),#13496);
+#13492 = LINE('',#13493,#13494);
+#13493 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#13494 = VECTOR('',#13495,1.);
+#13495 = DIRECTION('',(0.707106781187,0.707106781187));
+#13496 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13497 = PCURVE('',#13498,#13503);
+#13498 = PLANE('',#13499);
+#13499 = AXIS2_PLACEMENT_3D('',#13500,#13501,#13502);
+#13500 = CARTESIAN_POINT('',(-3.6725,-6.075,0.));
+#13501 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#13502 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#13503 = DEFINITIONAL_REPRESENTATION('',(#13504),#13508);
+#13504 = LINE('',#13505,#13506);
+#13505 = CARTESIAN_POINT('',(0.,-0.275));
+#13506 = VECTOR('',#13507,1.);
+#13507 = DIRECTION('',(1.,0.));
+#13508 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13509 = ORIENTED_EDGE('',*,*,#13510,.T.);
+#13510 = EDGE_CURVE('',#13483,#13511,#13513,.T.);
+#13511 = VERTEX_POINT('',#13512);
+#13512 = CARTESIAN_POINT('',(-3.9475,-5.8,2.4225));
+#13513 = SURFACE_CURVE('',#13514,(#13518,#13525),.PCURVE_S1.);
+#13514 = LINE('',#13515,#13516);
+#13515 = CARTESIAN_POINT('',(-3.9475,-5.8,0.275));
+#13516 = VECTOR('',#13517,1.);
+#13517 = DIRECTION('',(0.,0.,1.));
+#13518 = PCURVE('',#13346,#13519);
+#13519 = DEFINITIONAL_REPRESENTATION('',(#13520),#13524);
+#13520 = LINE('',#13521,#13522);
+#13521 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#13522 = VECTOR('',#13523,1.);
+#13523 = DIRECTION('',(0.,1.));
+#13524 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13525 = PCURVE('',#13526,#13531);
+#13526 = PLANE('',#13527);
+#13527 = AXIS2_PLACEMENT_3D('',#13528,#13529,#13530);
+#13528 = CARTESIAN_POINT('',(-3.724778209321,-5.8,1.581028209321));
+#13529 = DIRECTION('',(2.616880222009E-29,1.,-2.312216259511E-30));
+#13530 = DIRECTION('',(1.,-2.616880222009E-29,0.));
+#13531 = DEFINITIONAL_REPRESENTATION('',(#13532),#13536);
+#13532 = LINE('',#13533,#13534);
+#13533 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#13534 = VECTOR('',#13535,1.);
+#13535 = DIRECTION('',(0.,-1.));
+#13536 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13537 = ORIENTED_EDGE('',*,*,#13538,.T.);
+#13538 = EDGE_CURVE('',#13511,#13336,#13539,.T.);
+#13539 = SURFACE_CURVE('',#13540,(#13544,#13551),.PCURVE_S1.);
+#13540 = LINE('',#13541,#13542);
+#13541 = CARTESIAN_POINT('',(-3.9475,-5.8,2.4225));
+#13542 = VECTOR('',#13543,1.);
+#13543 = DIRECTION('',(0.,-1.,0.));
+#13544 = PCURVE('',#13346,#13545);
+#13545 = DEFINITIONAL_REPRESENTATION('',(#13546),#13550);
+#13546 = LINE('',#13547,#13548);
+#13547 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#13548 = VECTOR('',#13549,1.);
+#13549 = DIRECTION('',(-1.,2.226071387182E-62));
+#13550 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13551 = PCURVE('',#13552,#13557);
+#13552 = CYLINDRICAL_SURFACE('',#13553,0.1375);
+#13553 = AXIS2_PLACEMENT_3D('',#13554,#13555,#13556);
+#13554 = CARTESIAN_POINT('',(-3.81,-5.8,2.4225));
+#13555 = DIRECTION('',(0.,-1.,0.));
+#13556 = DIRECTION('',(-1.,-0.,-9.8088568672E-33));
+#13557 = DEFINITIONAL_REPRESENTATION('',(#13558),#13562);
+#13558 = LINE('',#13559,#13560);
+#13559 = CARTESIAN_POINT('',(-0.,0.));
+#13560 = VECTOR('',#13561,1.);
+#13561 = DIRECTION('',(-0.,1.));
+#13562 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13563 = ADVANCED_FACE('',(#13564),#13358,.T.);
+#13564 = FACE_BOUND('',#13565,.T.);
+#13565 = EDGE_LOOP('',(#13566,#13596,#13622,#13623,#13646,#13674,#13702)
+ );
+#13566 = ORIENTED_EDGE('',*,*,#13567,.T.);
+#13567 = EDGE_CURVE('',#13568,#13570,#13572,.T.);
+#13568 = VERTEX_POINT('',#13569);
+#13569 = CARTESIAN_POINT('',(-3.175,-6.9,2.56));
+#13570 = VERTEX_POINT('',#13571);
+#13571 = CARTESIAN_POINT('',(-3.81,-6.9,2.56));
+#13572 = SURFACE_CURVE('',#13573,(#13577,#13584),.PCURVE_S1.);
+#13573 = LINE('',#13574,#13575);
+#13574 = CARTESIAN_POINT('',(-3.6725,-6.9,2.56));
+#13575 = VECTOR('',#13576,1.);
+#13576 = DIRECTION('',(-1.,0.,0.));
+#13577 = PCURVE('',#13358,#13578);
+#13578 = DEFINITIONAL_REPRESENTATION('',(#13579),#13583);
+#13579 = LINE('',#13580,#13581);
+#13580 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#13581 = VECTOR('',#13582,1.);
+#13582 = DIRECTION('',(1.,1.676027028956E-59));
+#13583 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13584 = PCURVE('',#13585,#13590);
+#13585 = PLANE('',#13586);
+#13586 = AXIS2_PLACEMENT_3D('',#13587,#13588,#13589);
+#13587 = CARTESIAN_POINT('',(-3.56125,-6.35,2.56));
+#13588 = DIRECTION('',(1.601195610168E-30,3.925633828627E-30,1.));
+#13589 = DIRECTION('',(0.,1.,-3.925633828627E-30));
+#13590 = DEFINITIONAL_REPRESENTATION('',(#13591),#13595);
+#13591 = LINE('',#13592,#13593);
+#13592 = CARTESIAN_POINT('',(-0.55,0.11125));
+#13593 = VECTOR('',#13594,1.);
+#13594 = DIRECTION('',(0.,1.));
+#13595 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13596 = ORIENTED_EDGE('',*,*,#13597,.F.);
+#13597 = EDGE_CURVE('',#13336,#13570,#13598,.T.);
+#13598 = SURFACE_CURVE('',#13599,(#13604,#13615),.PCURVE_S1.);
+#13599 = CIRCLE('',#13600,0.1375);
+#13600 = AXIS2_PLACEMENT_3D('',#13601,#13602,#13603);
+#13601 = CARTESIAN_POINT('',(-3.81,-6.9,2.4225));
+#13602 = DIRECTION('',(-0.,1.,0.));
+#13603 = DIRECTION('',(0.,0.,-1.));
+#13604 = PCURVE('',#13358,#13605);
+#13605 = DEFINITIONAL_REPRESENTATION('',(#13606),#13614);
+#13606 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#13607,#13608,#13609,#13610
+ ,#13611,#13612,#13613),.UNSPECIFIED.,.F.,.F.)
+B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),(-2.094395102393,0.,
+ 2.094395102393,4.188790204786,6.28318530718,8.377580409573),
+.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM()
+RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM(
+ '') );
+#13607 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#13608 = CARTESIAN_POINT('',(0.323378776719,-0.703971790679));
+#13609 = CARTESIAN_POINT('',(0.204300283699,-0.910221790679));
+#13610 = CARTESIAN_POINT('',(8.522179067866E-02,-1.116471790679));
+#13611 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.910221790679));
+#13612 = CARTESIAN_POINT('',(-0.152935195362,-0.703971790679));
+#13613 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#13614 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13615 = PCURVE('',#13552,#13616);
+#13616 = DEFINITIONAL_REPRESENTATION('',(#13617),#13621);
+#13617 = LINE('',#13618,#13619);
+#13618 = CARTESIAN_POINT('',(1.570796326795,1.1));
+#13619 = VECTOR('',#13620,1.);
+#13620 = DIRECTION('',(-1.,0.));
+#13621 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13622 = ORIENTED_EDGE('',*,*,#13335,.T.);
+#13623 = ORIENTED_EDGE('',*,*,#13624,.F.);
+#13624 = EDGE_CURVE('',#13625,#13338,#13627,.T.);
+#13625 = VERTEX_POINT('',#13626);
+#13626 = CARTESIAN_POINT('',(-3.6725,-6.9,0.275));
+#13627 = SURFACE_CURVE('',#13628,(#13632,#13639),.PCURVE_S1.);
+#13628 = LINE('',#13629,#13630);
+#13629 = CARTESIAN_POINT('',(-3.6725,-6.9,0.275));
+#13630 = VECTOR('',#13631,1.);
+#13631 = DIRECTION('',(-1.,0.,0.));
+#13632 = PCURVE('',#13358,#13633);
+#13633 = DEFINITIONAL_REPRESENTATION('',(#13634),#13638);
+#13634 = LINE('',#13635,#13636);
+#13635 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#13636 = VECTOR('',#13637,1.);
+#13637 = DIRECTION('',(1.,1.676027028956E-59));
+#13638 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13639 = PCURVE('',#13386,#13640);
+#13640 = DEFINITIONAL_REPRESENTATION('',(#13641),#13645);
+#13641 = LINE('',#13642,#13643);
+#13642 = CARTESIAN_POINT('',(0.,0.));
+#13643 = VECTOR('',#13644,1.);
+#13644 = DIRECTION('',(0.,-1.));
+#13645 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13646 = ORIENTED_EDGE('',*,*,#13647,.F.);
+#13647 = EDGE_CURVE('',#13648,#13625,#13650,.T.);
+#13648 = VERTEX_POINT('',#13649);
+#13649 = CARTESIAN_POINT('',(-3.6725,-6.9,2.285));
+#13650 = SURFACE_CURVE('',#13651,(#13655,#13662),.PCURVE_S1.);
+#13651 = LINE('',#13652,#13653);
+#13652 = CARTESIAN_POINT('',(-3.6725,-6.9,2.56));
+#13653 = VECTOR('',#13654,1.);
+#13654 = DIRECTION('',(0.,0.,-1.));
+#13655 = PCURVE('',#13358,#13656);
+#13656 = DEFINITIONAL_REPRESENTATION('',(#13657),#13661);
+#13657 = LINE('',#13658,#13659);
+#13658 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#13659 = VECTOR('',#13660,1.);
+#13660 = DIRECTION('',(0.,1.));
+#13661 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13662 = PCURVE('',#13663,#13668);
+#13663 = PLANE('',#13664);
+#13664 = AXIS2_PLACEMENT_3D('',#13665,#13666,#13667);
+#13665 = CARTESIAN_POINT('',(-3.6725,-6.35,-0.34105853382));
+#13666 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#13667 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#13668 = DEFINITIONAL_REPRESENTATION('',(#13669),#13673);
+#13669 = LINE('',#13670,#13671);
+#13670 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#13671 = VECTOR('',#13672,1.);
+#13672 = DIRECTION('',(0.,-1.));
+#13673 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13674 = ORIENTED_EDGE('',*,*,#13675,.T.);
+#13675 = EDGE_CURVE('',#13648,#13676,#13678,.T.);
+#13676 = VERTEX_POINT('',#13677);
+#13677 = CARTESIAN_POINT('',(-3.175,-6.9,2.285));
+#13678 = SURFACE_CURVE('',#13679,(#13683,#13690),.PCURVE_S1.);
+#13679 = LINE('',#13680,#13681);
+#13680 = CARTESIAN_POINT('',(-3.6725,-6.9,2.285));
+#13681 = VECTOR('',#13682,1.);
+#13682 = DIRECTION('',(1.,0.,0.));
+#13683 = PCURVE('',#13358,#13684);
+#13684 = DEFINITIONAL_REPRESENTATION('',(#13685),#13689);
+#13685 = LINE('',#13686,#13687);
+#13686 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.703971790679));
+#13687 = VECTOR('',#13688,1.);
+#13688 = DIRECTION('',(-1.,-1.676027028956E-59));
+#13689 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13690 = PCURVE('',#13691,#13696);
+#13691 = PLANE('',#13692);
+#13692 = AXIS2_PLACEMENT_3D('',#13693,#13694,#13695);
+#13693 = CARTESIAN_POINT('',(-3.6725,-6.9,2.285));
+#13694 = DIRECTION('',(0.,0.,1.));
+#13695 = DIRECTION('',(1.,0.,0.));
+#13696 = DEFINITIONAL_REPRESENTATION('',(#13697),#13701);
+#13697 = LINE('',#13698,#13699);
+#13698 = CARTESIAN_POINT('',(0.,0.));
+#13699 = VECTOR('',#13700,1.);
+#13700 = DIRECTION('',(1.,0.));
+#13701 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13702 = ORIENTED_EDGE('',*,*,#13703,.T.);
+#13703 = EDGE_CURVE('',#13676,#13568,#13704,.T.);
+#13704 = SURFACE_CURVE('',#13705,(#13709,#13716),.PCURVE_S1.);
+#13705 = LINE('',#13706,#13707);
+#13706 = CARTESIAN_POINT('',(-3.175,-6.9,2.285));
+#13707 = VECTOR('',#13708,1.);
+#13708 = DIRECTION('',(0.,0.,1.));
+#13709 = PCURVE('',#13358,#13710);
+#13710 = DEFINITIONAL_REPRESENTATION('',(#13711),#13715);
+#13711 = LINE('',#13712,#13713);
+#13712 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#13713 = VECTOR('',#13714,1.);
+#13714 = DIRECTION('',(0.,-1.));
+#13715 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13716 = PCURVE('',#13717,#13722);
+#13717 = PLANE('',#13718);
+#13718 = AXIS2_PLACEMENT_3D('',#13719,#13720,#13721);
+#13719 = CARTESIAN_POINT('',(-3.175,-6.9,2.285));
+#13720 = DIRECTION('',(1.,0.,0.));
+#13721 = DIRECTION('',(0.,0.,1.));
+#13722 = DEFINITIONAL_REPRESENTATION('',(#13723),#13727);
+#13723 = LINE('',#13724,#13725);
+#13724 = CARTESIAN_POINT('',(0.,0.));
+#13725 = VECTOR('',#13726,1.);
+#13726 = DIRECTION('',(1.,0.));
+#13727 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13728 = ADVANCED_FACE('',(#13729),#13552,.T.);
+#13729 = FACE_BOUND('',#13730,.F.);
+#13730 = EDGE_LOOP('',(#13731,#13755,#13776,#13777));
+#13731 = ORIENTED_EDGE('',*,*,#13732,.T.);
+#13732 = EDGE_CURVE('',#13511,#13733,#13735,.T.);
+#13733 = VERTEX_POINT('',#13734);
+#13734 = CARTESIAN_POINT('',(-3.81,-5.8,2.56));
+#13735 = SURFACE_CURVE('',#13736,(#13741,#13748),.PCURVE_S1.);
+#13736 = CIRCLE('',#13737,0.1375);
+#13737 = AXIS2_PLACEMENT_3D('',#13738,#13739,#13740);
+#13738 = CARTESIAN_POINT('',(-3.81,-5.8,2.4225));
+#13739 = DIRECTION('',(-0.,1.,0.));
+#13740 = DIRECTION('',(0.,0.,-1.));
+#13741 = PCURVE('',#13552,#13742);
+#13742 = DEFINITIONAL_REPRESENTATION('',(#13743),#13747);
+#13743 = LINE('',#13744,#13745);
+#13744 = CARTESIAN_POINT('',(1.570796326795,3.552713678801E-15));
+#13745 = VECTOR('',#13746,1.);
+#13746 = DIRECTION('',(-1.,0.));
+#13747 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13748 = PCURVE('',#13526,#13749);
+#13749 = DEFINITIONAL_REPRESENTATION('',(#13750),#13754);
+#13750 = CIRCLE('',#13751,0.1375);
+#13751 = AXIS2_PLACEMENT_2D('',#13752,#13753);
+#13752 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#13753 = DIRECTION('',(0.,1.));
+#13754 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13755 = ORIENTED_EDGE('',*,*,#13756,.T.);
+#13756 = EDGE_CURVE('',#13733,#13570,#13757,.T.);
+#13757 = SURFACE_CURVE('',#13758,(#13762,#13769),.PCURVE_S1.);
+#13758 = LINE('',#13759,#13760);
+#13759 = CARTESIAN_POINT('',(-3.81,-5.8,2.56));
+#13760 = VECTOR('',#13761,1.);
+#13761 = DIRECTION('',(0.,-1.,0.));
+#13762 = PCURVE('',#13552,#13763);
+#13763 = DEFINITIONAL_REPRESENTATION('',(#13764),#13768);
+#13764 = LINE('',#13765,#13766);
+#13765 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#13766 = VECTOR('',#13767,1.);
+#13767 = DIRECTION('',(-0.,1.));
+#13768 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13769 = PCURVE('',#13585,#13770);
+#13770 = DEFINITIONAL_REPRESENTATION('',(#13771),#13775);
+#13771 = LINE('',#13772,#13773);
+#13772 = CARTESIAN_POINT('',(0.55,0.24875));
+#13773 = VECTOR('',#13774,1.);
+#13774 = DIRECTION('',(-1.,-6.285707653525E-60));
+#13775 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13776 = ORIENTED_EDGE('',*,*,#13597,.F.);
+#13777 = ORIENTED_EDGE('',*,*,#13538,.F.);
+#13778 = ADVANCED_FACE('',(#13779),#13386,.T.);
+#13779 = FACE_BOUND('',#13780,.T.);
+#13780 = EDGE_LOOP('',(#13781,#13782,#13783,#13806));
+#13781 = ORIENTED_EDGE('',*,*,#13624,.T.);
+#13782 = ORIENTED_EDGE('',*,*,#13370,.T.);
+#13783 = ORIENTED_EDGE('',*,*,#13784,.F.);
+#13784 = EDGE_CURVE('',#13785,#13371,#13787,.T.);
+#13785 = VERTEX_POINT('',#13786);
+#13786 = CARTESIAN_POINT('',(-3.6725,-6.625,0.));
+#13787 = SURFACE_CURVE('',#13788,(#13792,#13799),.PCURVE_S1.);
+#13788 = LINE('',#13789,#13790);
+#13789 = CARTESIAN_POINT('',(-3.6725,-6.625,0.));
+#13790 = VECTOR('',#13791,1.);
+#13791 = DIRECTION('',(-1.,0.,0.));
+#13792 = PCURVE('',#13386,#13793);
+#13793 = DEFINITIONAL_REPRESENTATION('',(#13794),#13798);
+#13794 = LINE('',#13795,#13796);
+#13795 = CARTESIAN_POINT('',(0.388908729653,0.));
+#13796 = VECTOR('',#13797,1.);
+#13797 = DIRECTION('',(0.,-1.));
+#13798 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13799 = PCURVE('',#13414,#13800);
+#13800 = DEFINITIONAL_REPRESENTATION('',(#13801),#13805);
+#13801 = LINE('',#13802,#13803);
+#13802 = CARTESIAN_POINT('',(0.,0.));
+#13803 = VECTOR('',#13804,1.);
+#13804 = DIRECTION('',(0.,-1.));
+#13805 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13806 = ORIENTED_EDGE('',*,*,#13807,.F.);
+#13807 = EDGE_CURVE('',#13625,#13785,#13808,.T.);
+#13808 = SURFACE_CURVE('',#13809,(#13813,#13820),.PCURVE_S1.);
+#13809 = LINE('',#13810,#13811);
+#13810 = CARTESIAN_POINT('',(-3.6725,-6.9,0.275));
+#13811 = VECTOR('',#13812,1.);
+#13812 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#13813 = PCURVE('',#13386,#13814);
+#13814 = DEFINITIONAL_REPRESENTATION('',(#13815),#13819);
+#13815 = LINE('',#13816,#13817);
+#13816 = CARTESIAN_POINT('',(0.,0.));
+#13817 = VECTOR('',#13818,1.);
+#13818 = DIRECTION('',(1.,0.));
+#13819 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13820 = PCURVE('',#13663,#13821);
+#13821 = DEFINITIONAL_REPRESENTATION('',(#13822),#13826);
+#13822 = LINE('',#13823,#13824);
+#13823 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#13824 = VECTOR('',#13825,1.);
+#13825 = DIRECTION('',(0.707106781187,-0.707106781187));
+#13826 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13827 = ADVANCED_FACE('',(#13828),#13526,.T.);
+#13828 = FACE_BOUND('',#13829,.T.);
+#13829 = EDGE_LOOP('',(#13830,#13831,#13832,#13855,#13878,#13901,#13924)
+ );
+#13830 = ORIENTED_EDGE('',*,*,#13510,.T.);
+#13831 = ORIENTED_EDGE('',*,*,#13732,.T.);
+#13832 = ORIENTED_EDGE('',*,*,#13833,.T.);
+#13833 = EDGE_CURVE('',#13733,#13834,#13836,.T.);
+#13834 = VERTEX_POINT('',#13835);
+#13835 = CARTESIAN_POINT('',(-3.175,-5.8,2.56));
+#13836 = SURFACE_CURVE('',#13837,(#13841,#13848),.PCURVE_S1.);
+#13837 = LINE('',#13838,#13839);
+#13838 = CARTESIAN_POINT('',(-3.6725,-5.8,2.56));
+#13839 = VECTOR('',#13840,1.);
+#13840 = DIRECTION('',(1.,0.,0.));
+#13841 = PCURVE('',#13526,#13842);
+#13842 = DEFINITIONAL_REPRESENTATION('',(#13843),#13847);
+#13843 = LINE('',#13844,#13845);
+#13844 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#13845 = VECTOR('',#13846,1.);
+#13846 = DIRECTION('',(1.,-6.050792998522E-59));
+#13847 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13848 = PCURVE('',#13585,#13849);
+#13849 = DEFINITIONAL_REPRESENTATION('',(#13850),#13854);
+#13850 = LINE('',#13851,#13852);
+#13851 = CARTESIAN_POINT('',(0.55,0.11125));
+#13852 = VECTOR('',#13853,1.);
+#13853 = DIRECTION('',(0.,-1.));
+#13854 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13855 = ORIENTED_EDGE('',*,*,#13856,.F.);
+#13856 = EDGE_CURVE('',#13857,#13834,#13859,.T.);
+#13857 = VERTEX_POINT('',#13858);
+#13858 = CARTESIAN_POINT('',(-3.175,-5.8,2.285));
+#13859 = SURFACE_CURVE('',#13860,(#13864,#13871),.PCURVE_S1.);
+#13860 = LINE('',#13861,#13862);
+#13861 = CARTESIAN_POINT('',(-3.175,-5.8,2.285));
+#13862 = VECTOR('',#13863,1.);
+#13863 = DIRECTION('',(0.,0.,1.));
+#13864 = PCURVE('',#13526,#13865);
+#13865 = DEFINITIONAL_REPRESENTATION('',(#13866),#13870);
+#13866 = LINE('',#13867,#13868);
+#13867 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#13868 = VECTOR('',#13869,1.);
+#13869 = DIRECTION('',(0.,-1.));
+#13870 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13871 = PCURVE('',#13717,#13872);
+#13872 = DEFINITIONAL_REPRESENTATION('',(#13873),#13877);
+#13873 = LINE('',#13874,#13875);
+#13874 = CARTESIAN_POINT('',(0.,-1.1));
+#13875 = VECTOR('',#13876,1.);
+#13876 = DIRECTION('',(1.,0.));
+#13877 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13878 = ORIENTED_EDGE('',*,*,#13879,.F.);
+#13879 = EDGE_CURVE('',#13880,#13857,#13882,.T.);
+#13880 = VERTEX_POINT('',#13881);
+#13881 = CARTESIAN_POINT('',(-3.6725,-5.8,2.285));
+#13882 = SURFACE_CURVE('',#13883,(#13887,#13894),.PCURVE_S1.);
+#13883 = LINE('',#13884,#13885);
+#13884 = CARTESIAN_POINT('',(-3.6725,-5.8,2.285));
+#13885 = VECTOR('',#13886,1.);
+#13886 = DIRECTION('',(1.,0.,0.));
+#13887 = PCURVE('',#13526,#13888);
+#13888 = DEFINITIONAL_REPRESENTATION('',(#13889),#13893);
+#13889 = LINE('',#13890,#13891);
+#13890 = CARTESIAN_POINT('',(5.227820932134E-02,-0.703971790679));
+#13891 = VECTOR('',#13892,1.);
+#13892 = DIRECTION('',(1.,-6.050792998522E-59));
+#13893 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13894 = PCURVE('',#13691,#13895);
+#13895 = DEFINITIONAL_REPRESENTATION('',(#13896),#13900);
+#13896 = LINE('',#13897,#13898);
+#13897 = CARTESIAN_POINT('',(0.,1.1));
+#13898 = VECTOR('',#13899,1.);
+#13899 = DIRECTION('',(1.,0.));
+#13900 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13901 = ORIENTED_EDGE('',*,*,#13902,.F.);
+#13902 = EDGE_CURVE('',#13903,#13880,#13905,.T.);
+#13903 = VERTEX_POINT('',#13904);
+#13904 = CARTESIAN_POINT('',(-3.6725,-5.8,0.275));
+#13905 = SURFACE_CURVE('',#13906,(#13910,#13917),.PCURVE_S1.);
+#13906 = LINE('',#13907,#13908);
+#13907 = CARTESIAN_POINT('',(-3.6725,-5.8,0.275));
+#13908 = VECTOR('',#13909,1.);
+#13909 = DIRECTION('',(0.,0.,1.));
+#13910 = PCURVE('',#13526,#13911);
+#13911 = DEFINITIONAL_REPRESENTATION('',(#13912),#13916);
+#13912 = LINE('',#13913,#13914);
+#13913 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#13914 = VECTOR('',#13915,1.);
+#13915 = DIRECTION('',(0.,-1.));
+#13916 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13917 = PCURVE('',#13663,#13918);
+#13918 = DEFINITIONAL_REPRESENTATION('',(#13919),#13923);
+#13919 = LINE('',#13920,#13921);
+#13920 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#13921 = VECTOR('',#13922,1.);
+#13922 = DIRECTION('',(0.,1.));
+#13923 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13924 = ORIENTED_EDGE('',*,*,#13925,.T.);
+#13925 = EDGE_CURVE('',#13903,#13483,#13926,.T.);
+#13926 = SURFACE_CURVE('',#13927,(#13931,#13938),.PCURVE_S1.);
+#13927 = LINE('',#13928,#13929);
+#13928 = CARTESIAN_POINT('',(-3.6725,-5.8,0.275));
+#13929 = VECTOR('',#13930,1.);
+#13930 = DIRECTION('',(-1.,0.,0.));
+#13931 = PCURVE('',#13526,#13932);
+#13932 = DEFINITIONAL_REPRESENTATION('',(#13933),#13937);
+#13933 = LINE('',#13934,#13935);
+#13934 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#13935 = VECTOR('',#13936,1.);
+#13936 = DIRECTION('',(-1.,6.050792998522E-59));
+#13937 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13938 = PCURVE('',#13498,#13939);
+#13939 = DEFINITIONAL_REPRESENTATION('',(#13940),#13944);
+#13940 = LINE('',#13941,#13942);
+#13941 = CARTESIAN_POINT('',(0.388908729653,0.));
+#13942 = VECTOR('',#13943,1.);
+#13943 = DIRECTION('',(0.,-1.));
+#13944 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13945 = ADVANCED_FACE('',(#13946),#13414,.T.);
+#13946 = FACE_BOUND('',#13947,.T.);
+#13947 = EDGE_LOOP('',(#13948,#13949,#13950,#13973));
+#13948 = ORIENTED_EDGE('',*,*,#13784,.T.);
+#13949 = ORIENTED_EDGE('',*,*,#13398,.T.);
+#13950 = ORIENTED_EDGE('',*,*,#13951,.F.);
+#13951 = EDGE_CURVE('',#13952,#13399,#13954,.T.);
+#13952 = VERTEX_POINT('',#13953);
+#13953 = CARTESIAN_POINT('',(-3.6725,-6.625,-3.5));
+#13954 = SURFACE_CURVE('',#13955,(#13959,#13966),.PCURVE_S1.);
+#13955 = LINE('',#13956,#13957);
+#13956 = CARTESIAN_POINT('',(-3.6725,-6.625,-3.5));
+#13957 = VECTOR('',#13958,1.);
+#13958 = DIRECTION('',(-1.,0.,0.));
+#13959 = PCURVE('',#13414,#13960);
+#13960 = DEFINITIONAL_REPRESENTATION('',(#13961),#13965);
+#13961 = LINE('',#13962,#13963);
+#13962 = CARTESIAN_POINT('',(3.5,0.));
+#13963 = VECTOR('',#13964,1.);
+#13964 = DIRECTION('',(0.,-1.));
+#13965 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13966 = PCURVE('',#13442,#13967);
+#13967 = DEFINITIONAL_REPRESENTATION('',(#13968),#13972);
+#13968 = LINE('',#13969,#13970);
+#13969 = CARTESIAN_POINT('',(3.330669073875E-16,0.));
+#13970 = VECTOR('',#13971,1.);
+#13971 = DIRECTION('',(0.,-1.));
+#13972 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13973 = ORIENTED_EDGE('',*,*,#13974,.F.);
+#13974 = EDGE_CURVE('',#13785,#13952,#13975,.T.);
+#13975 = SURFACE_CURVE('',#13976,(#13980,#13987),.PCURVE_S1.);
+#13976 = LINE('',#13977,#13978);
+#13977 = CARTESIAN_POINT('',(-3.6725,-6.625,0.));
+#13978 = VECTOR('',#13979,1.);
+#13979 = DIRECTION('',(0.,0.,-1.));
+#13980 = PCURVE('',#13414,#13981);
+#13981 = DEFINITIONAL_REPRESENTATION('',(#13982),#13986);
+#13982 = LINE('',#13983,#13984);
+#13983 = CARTESIAN_POINT('',(0.,0.));
+#13984 = VECTOR('',#13985,1.);
+#13985 = DIRECTION('',(1.,0.));
+#13986 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13987 = PCURVE('',#13663,#13988);
+#13988 = DEFINITIONAL_REPRESENTATION('',(#13989),#13993);
+#13989 = LINE('',#13990,#13991);
+#13990 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#13991 = VECTOR('',#13992,1.);
+#13992 = DIRECTION('',(0.,-1.));
+#13993 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#13994 = ADVANCED_FACE('',(#13995),#13498,.T.);
+#13995 = FACE_BOUND('',#13996,.T.);
+#13996 = EDGE_LOOP('',(#13997,#14020,#14021,#14022));
+#13997 = ORIENTED_EDGE('',*,*,#13998,.T.);
+#13998 = EDGE_CURVE('',#13999,#13455,#14001,.T.);
+#13999 = VERTEX_POINT('',#14000);
+#14000 = CARTESIAN_POINT('',(-3.6725,-6.075,0.));
+#14001 = SURFACE_CURVE('',#14002,(#14006,#14013),.PCURVE_S1.);
+#14002 = LINE('',#14003,#14004);
+#14003 = CARTESIAN_POINT('',(-3.6725,-6.075,0.));
+#14004 = VECTOR('',#14005,1.);
+#14005 = DIRECTION('',(-1.,0.,0.));
+#14006 = PCURVE('',#13498,#14007);
+#14007 = DEFINITIONAL_REPRESENTATION('',(#14008),#14012);
+#14008 = LINE('',#14009,#14010);
+#14009 = CARTESIAN_POINT('',(-6.280369834735E-16,0.));
+#14010 = VECTOR('',#14011,1.);
+#14011 = DIRECTION('',(0.,-1.));
+#14012 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14013 = PCURVE('',#13470,#14014);
+#14014 = DEFINITIONAL_REPRESENTATION('',(#14015),#14019);
+#14015 = LINE('',#14016,#14017);
+#14016 = CARTESIAN_POINT('',(3.5,0.));
+#14017 = VECTOR('',#14018,1.);
+#14018 = DIRECTION('',(0.,-1.));
+#14019 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14020 = ORIENTED_EDGE('',*,*,#13482,.T.);
+#14021 = ORIENTED_EDGE('',*,*,#13925,.F.);
+#14022 = ORIENTED_EDGE('',*,*,#14023,.F.);
+#14023 = EDGE_CURVE('',#13999,#13903,#14024,.T.);
+#14024 = SURFACE_CURVE('',#14025,(#14029,#14036),.PCURVE_S1.);
+#14025 = LINE('',#14026,#14027);
+#14026 = CARTESIAN_POINT('',(-3.6725,-6.075,0.));
+#14027 = VECTOR('',#14028,1.);
+#14028 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#14029 = PCURVE('',#13498,#14030);
+#14030 = DEFINITIONAL_REPRESENTATION('',(#14031),#14035);
+#14031 = LINE('',#14032,#14033);
+#14032 = CARTESIAN_POINT('',(0.,0.));
+#14033 = VECTOR('',#14034,1.);
+#14034 = DIRECTION('',(1.,0.));
+#14035 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14036 = PCURVE('',#13663,#14037);
+#14037 = DEFINITIONAL_REPRESENTATION('',(#14038),#14042);
+#14038 = LINE('',#14039,#14040);
+#14039 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#14040 = VECTOR('',#14041,1.);
+#14041 = DIRECTION('',(0.707106781187,0.707106781187));
+#14042 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14043 = ADVANCED_FACE('',(#14044),#13442,.T.);
+#14044 = FACE_BOUND('',#14045,.T.);
+#14045 = EDGE_LOOP('',(#14046,#14047,#14048,#14071));
+#14046 = ORIENTED_EDGE('',*,*,#13951,.T.);
+#14047 = ORIENTED_EDGE('',*,*,#13426,.T.);
+#14048 = ORIENTED_EDGE('',*,*,#14049,.F.);
+#14049 = EDGE_CURVE('',#14050,#13427,#14052,.T.);
+#14050 = VERTEX_POINT('',#14051);
+#14051 = CARTESIAN_POINT('',(-3.6725,-6.075,-3.5));
+#14052 = SURFACE_CURVE('',#14053,(#14057,#14064),.PCURVE_S1.);
+#14053 = LINE('',#14054,#14055);
+#14054 = CARTESIAN_POINT('',(-3.6725,-6.075,-3.5));
+#14055 = VECTOR('',#14056,1.);
+#14056 = DIRECTION('',(-1.,0.,0.));
+#14057 = PCURVE('',#13442,#14058);
+#14058 = DEFINITIONAL_REPRESENTATION('',(#14059),#14063);
+#14059 = LINE('',#14060,#14061);
+#14060 = CARTESIAN_POINT('',(0.55,0.));
+#14061 = VECTOR('',#14062,1.);
+#14062 = DIRECTION('',(0.,-1.));
+#14063 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14064 = PCURVE('',#13470,#14065);
+#14065 = DEFINITIONAL_REPRESENTATION('',(#14066),#14070);
+#14066 = LINE('',#14067,#14068);
+#14067 = CARTESIAN_POINT('',(0.,0.));
+#14068 = VECTOR('',#14069,1.);
+#14069 = DIRECTION('',(0.,-1.));
+#14070 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14071 = ORIENTED_EDGE('',*,*,#14072,.F.);
+#14072 = EDGE_CURVE('',#13952,#14050,#14073,.T.);
+#14073 = SURFACE_CURVE('',#14074,(#14078,#14085),.PCURVE_S1.);
+#14074 = LINE('',#14075,#14076);
+#14075 = CARTESIAN_POINT('',(-3.6725,-6.625,-3.5));
+#14076 = VECTOR('',#14077,1.);
+#14077 = DIRECTION('',(0.,1.,0.));
+#14078 = PCURVE('',#13442,#14079);
+#14079 = DEFINITIONAL_REPRESENTATION('',(#14080),#14084);
+#14080 = LINE('',#14081,#14082);
+#14081 = CARTESIAN_POINT('',(0.,0.));
+#14082 = VECTOR('',#14083,1.);
+#14083 = DIRECTION('',(1.,0.));
+#14084 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14085 = PCURVE('',#13663,#14086);
+#14086 = DEFINITIONAL_REPRESENTATION('',(#14087),#14091);
+#14087 = LINE('',#14088,#14089);
+#14088 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#14089 = VECTOR('',#14090,1.);
+#14090 = DIRECTION('',(1.,-2.226071387182E-62));
+#14091 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14092 = ADVANCED_FACE('',(#14093),#13470,.T.);
+#14093 = FACE_BOUND('',#14094,.T.);
+#14094 = EDGE_LOOP('',(#14095,#14096,#14097,#14098));
+#14095 = ORIENTED_EDGE('',*,*,#14049,.T.);
+#14096 = ORIENTED_EDGE('',*,*,#13454,.T.);
+#14097 = ORIENTED_EDGE('',*,*,#13998,.F.);
+#14098 = ORIENTED_EDGE('',*,*,#14099,.F.);
+#14099 = EDGE_CURVE('',#14050,#13999,#14100,.T.);
+#14100 = SURFACE_CURVE('',#14101,(#14105,#14112),.PCURVE_S1.);
+#14101 = LINE('',#14102,#14103);
+#14102 = CARTESIAN_POINT('',(-3.6725,-6.075,-3.5));
+#14103 = VECTOR('',#14104,1.);
+#14104 = DIRECTION('',(0.,0.,1.));
+#14105 = PCURVE('',#13470,#14106);
+#14106 = DEFINITIONAL_REPRESENTATION('',(#14107),#14111);
+#14107 = LINE('',#14108,#14109);
+#14108 = CARTESIAN_POINT('',(0.,0.));
+#14109 = VECTOR('',#14110,1.);
+#14110 = DIRECTION('',(1.,0.));
+#14111 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14112 = PCURVE('',#13663,#14113);
+#14113 = DEFINITIONAL_REPRESENTATION('',(#14114),#14118);
+#14114 = LINE('',#14115,#14116);
+#14115 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#14116 = VECTOR('',#14117,1.);
+#14117 = DIRECTION('',(0.,1.));
+#14118 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14119 = ADVANCED_FACE('',(#14120),#13585,.T.);
+#14120 = FACE_BOUND('',#14121,.T.);
+#14121 = EDGE_LOOP('',(#14122,#14123,#14144,#14145));
+#14122 = ORIENTED_EDGE('',*,*,#13567,.F.);
+#14123 = ORIENTED_EDGE('',*,*,#14124,.T.);
+#14124 = EDGE_CURVE('',#13568,#13834,#14125,.T.);
+#14125 = SURFACE_CURVE('',#14126,(#14130,#14137),.PCURVE_S1.);
+#14126 = LINE('',#14127,#14128);
+#14127 = CARTESIAN_POINT('',(-3.175,-6.9,2.56));
+#14128 = VECTOR('',#14129,1.);
+#14129 = DIRECTION('',(0.,1.,0.));
+#14130 = PCURVE('',#13585,#14131);
+#14131 = DEFINITIONAL_REPRESENTATION('',(#14132),#14136);
+#14132 = LINE('',#14133,#14134);
+#14133 = CARTESIAN_POINT('',(-0.55,-0.38625));
+#14134 = VECTOR('',#14135,1.);
+#14135 = DIRECTION('',(1.,6.285707653525E-60));
+#14136 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14137 = PCURVE('',#13717,#14138);
+#14138 = DEFINITIONAL_REPRESENTATION('',(#14139),#14143);
+#14139 = LINE('',#14140,#14141);
+#14140 = CARTESIAN_POINT('',(0.275,0.));
+#14141 = VECTOR('',#14142,1.);
+#14142 = DIRECTION('',(0.,-1.));
+#14143 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14144 = ORIENTED_EDGE('',*,*,#13833,.F.);
+#14145 = ORIENTED_EDGE('',*,*,#13756,.T.);
+#14146 = ADVANCED_FACE('',(#14147),#13717,.T.);
+#14147 = FACE_BOUND('',#14148,.T.);
+#14148 = EDGE_LOOP('',(#14149,#14150,#14171,#14172));
+#14149 = ORIENTED_EDGE('',*,*,#13703,.F.);
+#14150 = ORIENTED_EDGE('',*,*,#14151,.T.);
+#14151 = EDGE_CURVE('',#13676,#13857,#14152,.T.);
+#14152 = SURFACE_CURVE('',#14153,(#14157,#14164),.PCURVE_S1.);
+#14153 = LINE('',#14154,#14155);
+#14154 = CARTESIAN_POINT('',(-3.175,-6.9,2.285));
+#14155 = VECTOR('',#14156,1.);
+#14156 = DIRECTION('',(0.,1.,0.));
+#14157 = PCURVE('',#13717,#14158);
+#14158 = DEFINITIONAL_REPRESENTATION('',(#14159),#14163);
+#14159 = LINE('',#14160,#14161);
+#14160 = CARTESIAN_POINT('',(0.,0.));
+#14161 = VECTOR('',#14162,1.);
+#14162 = DIRECTION('',(0.,-1.));
+#14163 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14164 = PCURVE('',#13691,#14165);
+#14165 = DEFINITIONAL_REPRESENTATION('',(#14166),#14170);
+#14166 = LINE('',#14167,#14168);
+#14167 = CARTESIAN_POINT('',(0.4975,0.));
+#14168 = VECTOR('',#14169,1.);
+#14169 = DIRECTION('',(0.,1.));
+#14170 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14171 = ORIENTED_EDGE('',*,*,#13856,.T.);
+#14172 = ORIENTED_EDGE('',*,*,#14124,.F.);
+#14173 = ADVANCED_FACE('',(#14174),#13691,.F.);
+#14174 = FACE_BOUND('',#14175,.F.);
+#14175 = EDGE_LOOP('',(#14176,#14197,#14198,#14199));
+#14176 = ORIENTED_EDGE('',*,*,#14177,.F.);
+#14177 = EDGE_CURVE('',#13648,#13880,#14178,.T.);
+#14178 = SURFACE_CURVE('',#14179,(#14183,#14190),.PCURVE_S1.);
+#14179 = LINE('',#14180,#14181);
+#14180 = CARTESIAN_POINT('',(-3.6725,-6.9,2.285));
+#14181 = VECTOR('',#14182,1.);
+#14182 = DIRECTION('',(0.,1.,0.));
+#14183 = PCURVE('',#13691,#14184);
+#14184 = DEFINITIONAL_REPRESENTATION('',(#14185),#14189);
+#14185 = LINE('',#14186,#14187);
+#14186 = CARTESIAN_POINT('',(0.,0.));
+#14187 = VECTOR('',#14188,1.);
+#14188 = DIRECTION('',(0.,1.));
+#14189 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14190 = PCURVE('',#13663,#14191);
+#14191 = DEFINITIONAL_REPRESENTATION('',(#14192),#14196);
+#14192 = LINE('',#14193,#14194);
+#14193 = CARTESIAN_POINT('',(-0.55,2.62605853382));
+#14194 = VECTOR('',#14195,1.);
+#14195 = DIRECTION('',(1.,-2.226071387182E-62));
+#14196 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14197 = ORIENTED_EDGE('',*,*,#13675,.T.);
+#14198 = ORIENTED_EDGE('',*,*,#14151,.T.);
+#14199 = ORIENTED_EDGE('',*,*,#13879,.F.);
+#14200 = ADVANCED_FACE('',(#14201),#13663,.T.);
+#14201 = FACE_BOUND('',#14202,.T.);
+#14202 = EDGE_LOOP('',(#14203,#14204,#14205,#14206,#14207,#14208,#14209,
+ #14210));
+#14203 = ORIENTED_EDGE('',*,*,#13902,.T.);
+#14204 = ORIENTED_EDGE('',*,*,#14177,.F.);
+#14205 = ORIENTED_EDGE('',*,*,#13647,.T.);
+#14206 = ORIENTED_EDGE('',*,*,#13807,.T.);
+#14207 = ORIENTED_EDGE('',*,*,#13974,.T.);
+#14208 = ORIENTED_EDGE('',*,*,#14072,.T.);
+#14209 = ORIENTED_EDGE('',*,*,#14099,.T.);
+#14210 = ORIENTED_EDGE('',*,*,#14023,.T.);
+#14211 = MANIFOLD_SOLID_BREP('',#14212);
+#14212 = CLOSED_SHELL('',(#14213,#14445,#14610,#14660,#14709,#14827,
+ #14876,#14925,#14974,#15001,#15028,#15055,#15082));
+#14213 = ADVANCED_FACE('',(#14214),#14228,.F.);
+#14214 = FACE_BOUND('',#14215,.F.);
+#14215 = EDGE_LOOP('',(#14216,#14251,#14279,#14307,#14335,#14363,#14391,
+ #14419));
+#14216 = ORIENTED_EDGE('',*,*,#14217,.T.);
+#14217 = EDGE_CURVE('',#14218,#14220,#14222,.T.);
+#14218 = VERTEX_POINT('',#14219);
+#14219 = CARTESIAN_POINT('',(3.9475,-5.8,2.4225));
+#14220 = VERTEX_POINT('',#14221);
+#14221 = CARTESIAN_POINT('',(3.9475,-5.8,0.275));
+#14222 = SURFACE_CURVE('',#14223,(#14227,#14239),.PCURVE_S1.);
+#14223 = LINE('',#14224,#14225);
+#14224 = CARTESIAN_POINT('',(3.9475,-5.8,2.56));
+#14225 = VECTOR('',#14226,1.);
+#14226 = DIRECTION('',(0.,0.,-1.));
+#14227 = PCURVE('',#14228,#14233);
+#14228 = PLANE('',#14229);
+#14229 = AXIS2_PLACEMENT_3D('',#14230,#14231,#14232);
+#14230 = CARTESIAN_POINT('',(3.9475,-6.35,-0.34105853382));
+#14231 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#14232 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#14233 = DEFINITIONAL_REPRESENTATION('',(#14234),#14238);
+#14234 = LINE('',#14235,#14236);
+#14235 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#14236 = VECTOR('',#14237,1.);
+#14237 = DIRECTION('',(0.,-1.));
+#14238 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14239 = PCURVE('',#14240,#14245);
+#14240 = PLANE('',#14241);
+#14241 = AXIS2_PLACEMENT_3D('',#14242,#14243,#14244);
+#14242 = CARTESIAN_POINT('',(3.724778209321,-5.8,1.581028209321));
+#14243 = DIRECTION('',(3.17453643318E-29,1.,2.111838454822E-30));
+#14244 = DIRECTION('',(1.,-3.17453643318E-29,0.));
+#14245 = DEFINITIONAL_REPRESENTATION('',(#14246),#14250);
+#14246 = LINE('',#14247,#14248);
+#14247 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#14248 = VECTOR('',#14249,1.);
+#14249 = DIRECTION('',(0.,1.));
+#14250 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14251 = ORIENTED_EDGE('',*,*,#14252,.T.);
+#14252 = EDGE_CURVE('',#14220,#14253,#14255,.T.);
+#14253 = VERTEX_POINT('',#14254);
+#14254 = CARTESIAN_POINT('',(3.9475,-6.075,0.));
+#14255 = SURFACE_CURVE('',#14256,(#14260,#14267),.PCURVE_S1.);
+#14256 = LINE('',#14257,#14258);
+#14257 = CARTESIAN_POINT('',(3.9475,-5.8,0.275));
+#14258 = VECTOR('',#14259,1.);
+#14259 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#14260 = PCURVE('',#14228,#14261);
+#14261 = DEFINITIONAL_REPRESENTATION('',(#14262),#14266);
+#14262 = LINE('',#14263,#14264);
+#14263 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#14264 = VECTOR('',#14265,1.);
+#14265 = DIRECTION('',(0.707106781187,-0.707106781187));
+#14266 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14267 = PCURVE('',#14268,#14273);
+#14268 = PLANE('',#14269);
+#14269 = AXIS2_PLACEMENT_3D('',#14270,#14271,#14272);
+#14270 = CARTESIAN_POINT('',(3.6725,-5.8,0.275));
+#14271 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#14272 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#14273 = DEFINITIONAL_REPRESENTATION('',(#14274),#14278);
+#14274 = LINE('',#14275,#14276);
+#14275 = CARTESIAN_POINT('',(0.,-0.275));
+#14276 = VECTOR('',#14277,1.);
+#14277 = DIRECTION('',(1.,0.));
+#14278 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14279 = ORIENTED_EDGE('',*,*,#14280,.T.);
+#14280 = EDGE_CURVE('',#14253,#14281,#14283,.T.);
+#14281 = VERTEX_POINT('',#14282);
+#14282 = CARTESIAN_POINT('',(3.9475,-6.075,-3.5));
+#14283 = SURFACE_CURVE('',#14284,(#14288,#14295),.PCURVE_S1.);
+#14284 = LINE('',#14285,#14286);
+#14285 = CARTESIAN_POINT('',(3.9475,-6.075,0.));
+#14286 = VECTOR('',#14287,1.);
+#14287 = DIRECTION('',(0.,0.,-1.));
+#14288 = PCURVE('',#14228,#14289);
+#14289 = DEFINITIONAL_REPRESENTATION('',(#14290),#14294);
+#14290 = LINE('',#14291,#14292);
+#14291 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#14292 = VECTOR('',#14293,1.);
+#14293 = DIRECTION('',(0.,-1.));
+#14294 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14295 = PCURVE('',#14296,#14301);
+#14296 = PLANE('',#14297);
+#14297 = AXIS2_PLACEMENT_3D('',#14298,#14299,#14300);
+#14298 = CARTESIAN_POINT('',(3.6725,-6.075,0.));
+#14299 = DIRECTION('',(0.,1.,0.));
+#14300 = DIRECTION('',(0.,0.,-1.));
+#14301 = DEFINITIONAL_REPRESENTATION('',(#14302),#14306);
+#14302 = LINE('',#14303,#14304);
+#14303 = CARTESIAN_POINT('',(0.,-0.275));
+#14304 = VECTOR('',#14305,1.);
+#14305 = DIRECTION('',(1.,0.));
+#14306 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14307 = ORIENTED_EDGE('',*,*,#14308,.T.);
+#14308 = EDGE_CURVE('',#14281,#14309,#14311,.T.);
+#14309 = VERTEX_POINT('',#14310);
+#14310 = CARTESIAN_POINT('',(3.9475,-6.625,-3.5));
+#14311 = SURFACE_CURVE('',#14312,(#14316,#14323),.PCURVE_S1.);
+#14312 = LINE('',#14313,#14314);
+#14313 = CARTESIAN_POINT('',(3.9475,-6.075,-3.5));
+#14314 = VECTOR('',#14315,1.);
+#14315 = DIRECTION('',(0.,-1.,0.));
+#14316 = PCURVE('',#14228,#14317);
+#14317 = DEFINITIONAL_REPRESENTATION('',(#14318),#14322);
+#14318 = LINE('',#14319,#14320);
+#14319 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#14320 = VECTOR('',#14321,1.);
+#14321 = DIRECTION('',(1.,2.226071387182E-62));
+#14322 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14323 = PCURVE('',#14324,#14329);
+#14324 = PLANE('',#14325);
+#14325 = AXIS2_PLACEMENT_3D('',#14326,#14327,#14328);
+#14326 = CARTESIAN_POINT('',(3.6725,-6.075,-3.5));
+#14327 = DIRECTION('',(0.,0.,-1.));
+#14328 = DIRECTION('',(0.,-1.,0.));
+#14329 = DEFINITIONAL_REPRESENTATION('',(#14330),#14334);
+#14330 = LINE('',#14331,#14332);
+#14331 = CARTESIAN_POINT('',(0.,-0.275));
+#14332 = VECTOR('',#14333,1.);
+#14333 = DIRECTION('',(1.,0.));
+#14334 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14335 = ORIENTED_EDGE('',*,*,#14336,.T.);
+#14336 = EDGE_CURVE('',#14309,#14337,#14339,.T.);
+#14337 = VERTEX_POINT('',#14338);
+#14338 = CARTESIAN_POINT('',(3.9475,-6.625,0.));
+#14339 = SURFACE_CURVE('',#14340,(#14344,#14351),.PCURVE_S1.);
+#14340 = LINE('',#14341,#14342);
+#14341 = CARTESIAN_POINT('',(3.9475,-6.625,-3.5));
+#14342 = VECTOR('',#14343,1.);
+#14343 = DIRECTION('',(0.,0.,1.));
+#14344 = PCURVE('',#14228,#14345);
+#14345 = DEFINITIONAL_REPRESENTATION('',(#14346),#14350);
+#14346 = LINE('',#14347,#14348);
+#14347 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#14348 = VECTOR('',#14349,1.);
+#14349 = DIRECTION('',(0.,1.));
+#14350 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14351 = PCURVE('',#14352,#14357);
+#14352 = PLANE('',#14353);
+#14353 = AXIS2_PLACEMENT_3D('',#14354,#14355,#14356);
+#14354 = CARTESIAN_POINT('',(3.6725,-6.625,-3.5));
+#14355 = DIRECTION('',(0.,-1.,0.));
+#14356 = DIRECTION('',(0.,0.,1.));
+#14357 = DEFINITIONAL_REPRESENTATION('',(#14358),#14362);
+#14358 = LINE('',#14359,#14360);
+#14359 = CARTESIAN_POINT('',(0.,-0.275));
+#14360 = VECTOR('',#14361,1.);
+#14361 = DIRECTION('',(1.,0.));
+#14362 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14363 = ORIENTED_EDGE('',*,*,#14364,.T.);
+#14364 = EDGE_CURVE('',#14337,#14365,#14367,.T.);
+#14365 = VERTEX_POINT('',#14366);
+#14366 = CARTESIAN_POINT('',(3.9475,-6.9,0.275));
+#14367 = SURFACE_CURVE('',#14368,(#14372,#14379),.PCURVE_S1.);
+#14368 = LINE('',#14369,#14370);
+#14369 = CARTESIAN_POINT('',(3.9475,-6.625,0.));
+#14370 = VECTOR('',#14371,1.);
+#14371 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#14372 = PCURVE('',#14228,#14373);
+#14373 = DEFINITIONAL_REPRESENTATION('',(#14374),#14378);
+#14374 = LINE('',#14375,#14376);
+#14375 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#14376 = VECTOR('',#14377,1.);
+#14377 = DIRECTION('',(0.707106781187,0.707106781187));
+#14378 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14379 = PCURVE('',#14380,#14385);
+#14380 = PLANE('',#14381);
+#14381 = AXIS2_PLACEMENT_3D('',#14382,#14383,#14384);
+#14382 = CARTESIAN_POINT('',(3.6725,-6.625,0.));
+#14383 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#14384 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#14385 = DEFINITIONAL_REPRESENTATION('',(#14386),#14390);
+#14386 = LINE('',#14387,#14388);
+#14387 = CARTESIAN_POINT('',(0.,-0.275));
+#14388 = VECTOR('',#14389,1.);
+#14389 = DIRECTION('',(1.,0.));
+#14390 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14391 = ORIENTED_EDGE('',*,*,#14392,.T.);
+#14392 = EDGE_CURVE('',#14365,#14393,#14395,.T.);
+#14393 = VERTEX_POINT('',#14394);
+#14394 = CARTESIAN_POINT('',(3.9475,-6.9,2.4225));
+#14395 = SURFACE_CURVE('',#14396,(#14400,#14407),.PCURVE_S1.);
+#14396 = LINE('',#14397,#14398);
+#14397 = CARTESIAN_POINT('',(3.9475,-6.9,0.275));
+#14398 = VECTOR('',#14399,1.);
+#14399 = DIRECTION('',(0.,0.,1.));
+#14400 = PCURVE('',#14228,#14401);
+#14401 = DEFINITIONAL_REPRESENTATION('',(#14402),#14406);
+#14402 = LINE('',#14403,#14404);
+#14403 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#14404 = VECTOR('',#14405,1.);
+#14405 = DIRECTION('',(0.,1.));
+#14406 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14407 = PCURVE('',#14408,#14413);
+#14408 = PLANE('',#14409);
+#14409 = AXIS2_PLACEMENT_3D('',#14410,#14411,#14412);
+#14410 = CARTESIAN_POINT('',(3.724778209321,-6.9,1.581028209321));
+#14411 = DIRECTION('',(1.308440111004E-29,-1.,1.156108129756E-30));
+#14412 = DIRECTION('',(-1.,-1.308440111004E-29,0.));
+#14413 = DEFINITIONAL_REPRESENTATION('',(#14414),#14418);
+#14414 = LINE('',#14415,#14416);
+#14415 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#14416 = VECTOR('',#14417,1.);
+#14417 = DIRECTION('',(0.,-1.));
+#14418 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14419 = ORIENTED_EDGE('',*,*,#14420,.T.);
+#14420 = EDGE_CURVE('',#14393,#14218,#14421,.T.);
+#14421 = SURFACE_CURVE('',#14422,(#14426,#14433),.PCURVE_S1.);
+#14422 = LINE('',#14423,#14424);
+#14423 = CARTESIAN_POINT('',(3.9475,-6.9,2.4225));
+#14424 = VECTOR('',#14425,1.);
+#14425 = DIRECTION('',(0.,1.,0.));
+#14426 = PCURVE('',#14228,#14427);
+#14427 = DEFINITIONAL_REPRESENTATION('',(#14428),#14432);
+#14428 = LINE('',#14429,#14430);
+#14429 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#14430 = VECTOR('',#14431,1.);
+#14431 = DIRECTION('',(-1.,-2.226071387182E-62));
+#14432 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14433 = PCURVE('',#14434,#14439);
+#14434 = CYLINDRICAL_SURFACE('',#14435,0.1375);
+#14435 = AXIS2_PLACEMENT_3D('',#14436,#14437,#14438);
+#14436 = CARTESIAN_POINT('',(3.81,-6.9,2.4225));
+#14437 = DIRECTION('',(0.,1.,0.));
+#14438 = DIRECTION('',(1.,0.,-9.8088568672E-33));
+#14439 = DEFINITIONAL_REPRESENTATION('',(#14440),#14444);
+#14440 = LINE('',#14441,#14442);
+#14441 = CARTESIAN_POINT('',(-0.,0.));
+#14442 = VECTOR('',#14443,1.);
+#14443 = DIRECTION('',(-0.,1.));
+#14444 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14445 = ADVANCED_FACE('',(#14446),#14240,.T.);
+#14446 = FACE_BOUND('',#14447,.T.);
+#14447 = EDGE_LOOP('',(#14448,#14478,#14504,#14505,#14528,#14556,#14584)
+ );
+#14448 = ORIENTED_EDGE('',*,*,#14449,.T.);
+#14449 = EDGE_CURVE('',#14450,#14452,#14454,.T.);
+#14450 = VERTEX_POINT('',#14451);
+#14451 = CARTESIAN_POINT('',(3.175,-5.8,2.56));
+#14452 = VERTEX_POINT('',#14453);
+#14453 = CARTESIAN_POINT('',(3.81,-5.8,2.56));
+#14454 = SURFACE_CURVE('',#14455,(#14459,#14466),.PCURVE_S1.);
+#14455 = LINE('',#14456,#14457);
+#14456 = CARTESIAN_POINT('',(3.6725,-5.8,2.56));
+#14457 = VECTOR('',#14458,1.);
+#14458 = DIRECTION('',(1.,0.,0.));
+#14459 = PCURVE('',#14240,#14460);
+#14460 = DEFINITIONAL_REPRESENTATION('',(#14461),#14465);
+#14461 = LINE('',#14462,#14463);
+#14462 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#14463 = VECTOR('',#14464,1.);
+#14464 = DIRECTION('',(1.,6.704108115824E-59));
+#14465 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14466 = PCURVE('',#14467,#14472);
+#14467 = PLANE('',#14468);
+#14468 = AXIS2_PLACEMENT_3D('',#14469,#14470,#14471);
+#14469 = CARTESIAN_POINT('',(3.56125,-6.35,2.56));
+#14470 = DIRECTION('',(-1.657312278749E-30,-1.304555144269E-30,1.));
+#14471 = DIRECTION('',(1.,0.,1.657312278749E-30));
+#14472 = DEFINITIONAL_REPRESENTATION('',(#14473),#14477);
+#14473 = LINE('',#14474,#14475);
+#14474 = CARTESIAN_POINT('',(0.11125,0.55));
+#14475 = VECTOR('',#14476,1.);
+#14476 = DIRECTION('',(1.,-2.162055258902E-60));
+#14477 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14478 = ORIENTED_EDGE('',*,*,#14479,.F.);
+#14479 = EDGE_CURVE('',#14218,#14452,#14480,.T.);
+#14480 = SURFACE_CURVE('',#14481,(#14486,#14497),.PCURVE_S1.);
+#14481 = CIRCLE('',#14482,0.1375);
+#14482 = AXIS2_PLACEMENT_3D('',#14483,#14484,#14485);
+#14483 = CARTESIAN_POINT('',(3.81,-5.8,2.4225));
+#14484 = DIRECTION('',(0.,-1.,0.));
+#14485 = DIRECTION('',(0.,0.,1.));
+#14486 = PCURVE('',#14240,#14487);
+#14487 = DEFINITIONAL_REPRESENTATION('',(#14488),#14496);
+#14488 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#14489,#14490,#14491,#14492
+ ,#14493,#14494,#14495),.UNSPECIFIED.,.F.,.F.)
+B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),(-2.094395102393,0.,
+ 2.094395102393,4.188790204786,6.28318530718,8.377580409573),
+.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM()
+RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM(
+ '') );
+#14489 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#14490 = CARTESIAN_POINT('',(-0.152935195362,-0.978971790679));
+#14491 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.772721790679));
+#14492 = CARTESIAN_POINT('',(8.522179067866E-02,-0.566471790679));
+#14493 = CARTESIAN_POINT('',(0.204300283699,-0.772721790679));
+#14494 = CARTESIAN_POINT('',(0.323378776719,-0.978971790679));
+#14495 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#14496 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14497 = PCURVE('',#14434,#14498);
+#14498 = DEFINITIONAL_REPRESENTATION('',(#14499),#14503);
+#14499 = LINE('',#14500,#14501);
+#14500 = CARTESIAN_POINT('',(4.712388980385,1.1));
+#14501 = VECTOR('',#14502,1.);
+#14502 = DIRECTION('',(-1.,0.));
+#14503 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14504 = ORIENTED_EDGE('',*,*,#14217,.T.);
+#14505 = ORIENTED_EDGE('',*,*,#14506,.F.);
+#14506 = EDGE_CURVE('',#14507,#14220,#14509,.T.);
+#14507 = VERTEX_POINT('',#14508);
+#14508 = CARTESIAN_POINT('',(3.6725,-5.8,0.275));
+#14509 = SURFACE_CURVE('',#14510,(#14514,#14521),.PCURVE_S1.);
+#14510 = LINE('',#14511,#14512);
+#14511 = CARTESIAN_POINT('',(3.6725,-5.8,0.275));
+#14512 = VECTOR('',#14513,1.);
+#14513 = DIRECTION('',(1.,0.,0.));
+#14514 = PCURVE('',#14240,#14515);
+#14515 = DEFINITIONAL_REPRESENTATION('',(#14516),#14520);
+#14516 = LINE('',#14517,#14518);
+#14517 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#14518 = VECTOR('',#14519,1.);
+#14519 = DIRECTION('',(1.,6.704108115824E-59));
+#14520 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14521 = PCURVE('',#14268,#14522);
+#14522 = DEFINITIONAL_REPRESENTATION('',(#14523),#14527);
+#14523 = LINE('',#14524,#14525);
+#14524 = CARTESIAN_POINT('',(4.710277376051E-16,0.));
+#14525 = VECTOR('',#14526,1.);
+#14526 = DIRECTION('',(0.,-1.));
+#14527 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14528 = ORIENTED_EDGE('',*,*,#14529,.F.);
+#14529 = EDGE_CURVE('',#14530,#14507,#14532,.T.);
+#14530 = VERTEX_POINT('',#14531);
+#14531 = CARTESIAN_POINT('',(3.6725,-5.8,2.285));
+#14532 = SURFACE_CURVE('',#14533,(#14537,#14544),.PCURVE_S1.);
+#14533 = LINE('',#14534,#14535);
+#14534 = CARTESIAN_POINT('',(3.6725,-5.8,2.56));
+#14535 = VECTOR('',#14536,1.);
+#14536 = DIRECTION('',(0.,0.,-1.));
+#14537 = PCURVE('',#14240,#14538);
+#14538 = DEFINITIONAL_REPRESENTATION('',(#14539),#14543);
+#14539 = LINE('',#14540,#14541);
+#14540 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#14541 = VECTOR('',#14542,1.);
+#14542 = DIRECTION('',(0.,1.));
+#14543 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14544 = PCURVE('',#14545,#14550);
+#14545 = PLANE('',#14546);
+#14546 = AXIS2_PLACEMENT_3D('',#14547,#14548,#14549);
+#14547 = CARTESIAN_POINT('',(3.6725,-6.35,-0.34105853382));
+#14548 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#14549 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#14550 = DEFINITIONAL_REPRESENTATION('',(#14551),#14555);
+#14551 = LINE('',#14552,#14553);
+#14552 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#14553 = VECTOR('',#14554,1.);
+#14554 = DIRECTION('',(0.,-1.));
+#14555 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14556 = ORIENTED_EDGE('',*,*,#14557,.F.);
+#14557 = EDGE_CURVE('',#14558,#14530,#14560,.T.);
+#14558 = VERTEX_POINT('',#14559);
+#14559 = CARTESIAN_POINT('',(3.175,-5.8,2.285));
+#14560 = SURFACE_CURVE('',#14561,(#14565,#14572),.PCURVE_S1.);
+#14561 = LINE('',#14562,#14563);
+#14562 = CARTESIAN_POINT('',(3.175,-5.8,2.285));
+#14563 = VECTOR('',#14564,1.);
+#14564 = DIRECTION('',(1.,0.,0.));
+#14565 = PCURVE('',#14240,#14566);
+#14566 = DEFINITIONAL_REPRESENTATION('',(#14567),#14571);
+#14567 = LINE('',#14568,#14569);
+#14568 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#14569 = VECTOR('',#14570,1.);
+#14570 = DIRECTION('',(1.,6.704108115824E-59));
+#14571 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14572 = PCURVE('',#14573,#14578);
+#14573 = PLANE('',#14574);
+#14574 = AXIS2_PLACEMENT_3D('',#14575,#14576,#14577);
+#14575 = CARTESIAN_POINT('',(3.175,-6.9,2.285));
+#14576 = DIRECTION('',(0.,0.,1.));
+#14577 = DIRECTION('',(1.,0.,0.));
+#14578 = DEFINITIONAL_REPRESENTATION('',(#14579),#14583);
+#14579 = LINE('',#14580,#14581);
+#14580 = CARTESIAN_POINT('',(0.,1.1));
+#14581 = VECTOR('',#14582,1.);
+#14582 = DIRECTION('',(1.,0.));
+#14583 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14584 = ORIENTED_EDGE('',*,*,#14585,.T.);
+#14585 = EDGE_CURVE('',#14558,#14450,#14586,.T.);
+#14586 = SURFACE_CURVE('',#14587,(#14591,#14598),.PCURVE_S1.);
+#14587 = LINE('',#14588,#14589);
+#14588 = CARTESIAN_POINT('',(3.175,-5.8,2.285));
+#14589 = VECTOR('',#14590,1.);
+#14590 = DIRECTION('',(0.,0.,1.));
+#14591 = PCURVE('',#14240,#14592);
+#14592 = DEFINITIONAL_REPRESENTATION('',(#14593),#14597);
+#14593 = LINE('',#14594,#14595);
+#14594 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#14595 = VECTOR('',#14596,1.);
+#14596 = DIRECTION('',(0.,-1.));
+#14597 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14598 = PCURVE('',#14599,#14604);
+#14599 = PLANE('',#14600);
+#14600 = AXIS2_PLACEMENT_3D('',#14601,#14602,#14603);
+#14601 = CARTESIAN_POINT('',(3.175,-6.9,2.285));
+#14602 = DIRECTION('',(1.,0.,0.));
+#14603 = DIRECTION('',(0.,0.,1.));
+#14604 = DEFINITIONAL_REPRESENTATION('',(#14605),#14609);
+#14605 = LINE('',#14606,#14607);
+#14606 = CARTESIAN_POINT('',(0.,-1.1));
+#14607 = VECTOR('',#14608,1.);
+#14608 = DIRECTION('',(1.,0.));
+#14609 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14610 = ADVANCED_FACE('',(#14611),#14434,.T.);
+#14611 = FACE_BOUND('',#14612,.F.);
+#14612 = EDGE_LOOP('',(#14613,#14637,#14658,#14659));
+#14613 = ORIENTED_EDGE('',*,*,#14614,.T.);
+#14614 = EDGE_CURVE('',#14393,#14615,#14617,.T.);
+#14615 = VERTEX_POINT('',#14616);
+#14616 = CARTESIAN_POINT('',(3.81,-6.9,2.56));
+#14617 = SURFACE_CURVE('',#14618,(#14623,#14630),.PCURVE_S1.);
+#14618 = CIRCLE('',#14619,0.1375);
+#14619 = AXIS2_PLACEMENT_3D('',#14620,#14621,#14622);
+#14620 = CARTESIAN_POINT('',(3.81,-6.9,2.4225));
+#14621 = DIRECTION('',(0.,-1.,0.));
+#14622 = DIRECTION('',(0.,0.,1.));
+#14623 = PCURVE('',#14434,#14624);
+#14624 = DEFINITIONAL_REPRESENTATION('',(#14625),#14629);
+#14625 = LINE('',#14626,#14627);
+#14626 = CARTESIAN_POINT('',(4.712388980385,-1.7763568394E-15));
+#14627 = VECTOR('',#14628,1.);
+#14628 = DIRECTION('',(-1.,0.));
+#14629 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14630 = PCURVE('',#14408,#14631);
+#14631 = DEFINITIONAL_REPRESENTATION('',(#14632),#14636);
+#14632 = CIRCLE('',#14633,0.1375);
+#14633 = AXIS2_PLACEMENT_2D('',#14634,#14635);
+#14634 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#14635 = DIRECTION('',(0.,-1.));
+#14636 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14637 = ORIENTED_EDGE('',*,*,#14638,.T.);
+#14638 = EDGE_CURVE('',#14615,#14452,#14639,.T.);
+#14639 = SURFACE_CURVE('',#14640,(#14644,#14651),.PCURVE_S1.);
+#14640 = LINE('',#14641,#14642);
+#14641 = CARTESIAN_POINT('',(3.81,-6.9,2.56));
+#14642 = VECTOR('',#14643,1.);
+#14643 = DIRECTION('',(0.,1.,0.));
+#14644 = PCURVE('',#14434,#14645);
+#14645 = DEFINITIONAL_REPRESENTATION('',(#14646),#14650);
+#14646 = LINE('',#14647,#14648);
+#14647 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#14648 = VECTOR('',#14649,1.);
+#14649 = DIRECTION('',(-0.,1.));
+#14650 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14651 = PCURVE('',#14467,#14652);
+#14652 = DEFINITIONAL_REPRESENTATION('',(#14653),#14657);
+#14653 = LINE('',#14654,#14655);
+#14654 = CARTESIAN_POINT('',(0.24875,-0.55));
+#14655 = VECTOR('',#14656,1.);
+#14656 = DIRECTION('',(0.,1.));
+#14657 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14658 = ORIENTED_EDGE('',*,*,#14479,.F.);
+#14659 = ORIENTED_EDGE('',*,*,#14420,.F.);
+#14660 = ADVANCED_FACE('',(#14661),#14268,.T.);
+#14661 = FACE_BOUND('',#14662,.T.);
+#14662 = EDGE_LOOP('',(#14663,#14664,#14665,#14688));
+#14663 = ORIENTED_EDGE('',*,*,#14506,.T.);
+#14664 = ORIENTED_EDGE('',*,*,#14252,.T.);
+#14665 = ORIENTED_EDGE('',*,*,#14666,.F.);
+#14666 = EDGE_CURVE('',#14667,#14253,#14669,.T.);
+#14667 = VERTEX_POINT('',#14668);
+#14668 = CARTESIAN_POINT('',(3.6725,-6.075,0.));
+#14669 = SURFACE_CURVE('',#14670,(#14674,#14681),.PCURVE_S1.);
+#14670 = LINE('',#14671,#14672);
+#14671 = CARTESIAN_POINT('',(3.6725,-6.075,0.));
+#14672 = VECTOR('',#14673,1.);
+#14673 = DIRECTION('',(1.,0.,0.));
+#14674 = PCURVE('',#14268,#14675);
+#14675 = DEFINITIONAL_REPRESENTATION('',(#14676),#14680);
+#14676 = LINE('',#14677,#14678);
+#14677 = CARTESIAN_POINT('',(0.388908729653,0.));
+#14678 = VECTOR('',#14679,1.);
+#14679 = DIRECTION('',(0.,-1.));
+#14680 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14681 = PCURVE('',#14296,#14682);
+#14682 = DEFINITIONAL_REPRESENTATION('',(#14683),#14687);
+#14683 = LINE('',#14684,#14685);
+#14684 = CARTESIAN_POINT('',(0.,0.));
+#14685 = VECTOR('',#14686,1.);
+#14686 = DIRECTION('',(0.,-1.));
+#14687 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14688 = ORIENTED_EDGE('',*,*,#14689,.F.);
+#14689 = EDGE_CURVE('',#14507,#14667,#14690,.T.);
+#14690 = SURFACE_CURVE('',#14691,(#14695,#14702),.PCURVE_S1.);
+#14691 = LINE('',#14692,#14693);
+#14692 = CARTESIAN_POINT('',(3.6725,-5.8,0.275));
+#14693 = VECTOR('',#14694,1.);
+#14694 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#14695 = PCURVE('',#14268,#14696);
+#14696 = DEFINITIONAL_REPRESENTATION('',(#14697),#14701);
+#14697 = LINE('',#14698,#14699);
+#14698 = CARTESIAN_POINT('',(0.,0.));
+#14699 = VECTOR('',#14700,1.);
+#14700 = DIRECTION('',(1.,0.));
+#14701 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14702 = PCURVE('',#14545,#14703);
+#14703 = DEFINITIONAL_REPRESENTATION('',(#14704),#14708);
+#14704 = LINE('',#14705,#14706);
+#14705 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#14706 = VECTOR('',#14707,1.);
+#14707 = DIRECTION('',(0.707106781187,-0.707106781187));
+#14708 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14709 = ADVANCED_FACE('',(#14710),#14408,.T.);
+#14710 = FACE_BOUND('',#14711,.T.);
+#14711 = EDGE_LOOP('',(#14712,#14713,#14714,#14737,#14760,#14783,#14806)
+ );
+#14712 = ORIENTED_EDGE('',*,*,#14392,.T.);
+#14713 = ORIENTED_EDGE('',*,*,#14614,.T.);
+#14714 = ORIENTED_EDGE('',*,*,#14715,.F.);
+#14715 = EDGE_CURVE('',#14716,#14615,#14718,.T.);
+#14716 = VERTEX_POINT('',#14717);
+#14717 = CARTESIAN_POINT('',(3.175,-6.9,2.56));
+#14718 = SURFACE_CURVE('',#14719,(#14723,#14730),.PCURVE_S1.);
+#14719 = LINE('',#14720,#14721);
+#14720 = CARTESIAN_POINT('',(3.6725,-6.9,2.56));
+#14721 = VECTOR('',#14722,1.);
+#14722 = DIRECTION('',(1.,0.,0.));
+#14723 = PCURVE('',#14408,#14724);
+#14724 = DEFINITIONAL_REPRESENTATION('',(#14725),#14729);
+#14725 = LINE('',#14726,#14727);
+#14726 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#14727 = VECTOR('',#14728,1.);
+#14728 = DIRECTION('',(-1.,1.51269824963E-59));
+#14729 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14730 = PCURVE('',#14467,#14731);
+#14731 = DEFINITIONAL_REPRESENTATION('',(#14732),#14736);
+#14732 = LINE('',#14733,#14734);
+#14733 = CARTESIAN_POINT('',(0.11125,-0.55));
+#14734 = VECTOR('',#14735,1.);
+#14735 = DIRECTION('',(1.,-2.162055258902E-60));
+#14736 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14737 = ORIENTED_EDGE('',*,*,#14738,.F.);
+#14738 = EDGE_CURVE('',#14739,#14716,#14741,.T.);
+#14739 = VERTEX_POINT('',#14740);
+#14740 = CARTESIAN_POINT('',(3.175,-6.9,2.285));
+#14741 = SURFACE_CURVE('',#14742,(#14746,#14753),.PCURVE_S1.);
+#14742 = LINE('',#14743,#14744);
+#14743 = CARTESIAN_POINT('',(3.175,-6.9,2.285));
+#14744 = VECTOR('',#14745,1.);
+#14745 = DIRECTION('',(0.,0.,1.));
+#14746 = PCURVE('',#14408,#14747);
+#14747 = DEFINITIONAL_REPRESENTATION('',(#14748),#14752);
+#14748 = LINE('',#14749,#14750);
+#14749 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#14750 = VECTOR('',#14751,1.);
+#14751 = DIRECTION('',(0.,-1.));
+#14752 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14753 = PCURVE('',#14599,#14754);
+#14754 = DEFINITIONAL_REPRESENTATION('',(#14755),#14759);
+#14755 = LINE('',#14756,#14757);
+#14756 = CARTESIAN_POINT('',(0.,0.));
+#14757 = VECTOR('',#14758,1.);
+#14758 = DIRECTION('',(1.,0.));
+#14759 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14760 = ORIENTED_EDGE('',*,*,#14761,.T.);
+#14761 = EDGE_CURVE('',#14739,#14762,#14764,.T.);
+#14762 = VERTEX_POINT('',#14763);
+#14763 = CARTESIAN_POINT('',(3.6725,-6.9,2.285));
+#14764 = SURFACE_CURVE('',#14765,(#14769,#14776),.PCURVE_S1.);
+#14765 = LINE('',#14766,#14767);
+#14766 = CARTESIAN_POINT('',(3.175,-6.9,2.285));
+#14767 = VECTOR('',#14768,1.);
+#14768 = DIRECTION('',(1.,0.,0.));
+#14769 = PCURVE('',#14408,#14770);
+#14770 = DEFINITIONAL_REPRESENTATION('',(#14771),#14775);
+#14771 = LINE('',#14772,#14773);
+#14772 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#14773 = VECTOR('',#14774,1.);
+#14774 = DIRECTION('',(-1.,1.51269824963E-59));
+#14775 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14776 = PCURVE('',#14573,#14777);
+#14777 = DEFINITIONAL_REPRESENTATION('',(#14778),#14782);
+#14778 = LINE('',#14779,#14780);
+#14779 = CARTESIAN_POINT('',(0.,0.));
+#14780 = VECTOR('',#14781,1.);
+#14781 = DIRECTION('',(1.,0.));
+#14782 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14783 = ORIENTED_EDGE('',*,*,#14784,.F.);
+#14784 = EDGE_CURVE('',#14785,#14762,#14787,.T.);
+#14785 = VERTEX_POINT('',#14786);
+#14786 = CARTESIAN_POINT('',(3.6725,-6.9,0.275));
+#14787 = SURFACE_CURVE('',#14788,(#14792,#14799),.PCURVE_S1.);
+#14788 = LINE('',#14789,#14790);
+#14789 = CARTESIAN_POINT('',(3.6725,-6.9,0.275));
+#14790 = VECTOR('',#14791,1.);
+#14791 = DIRECTION('',(0.,0.,1.));
+#14792 = PCURVE('',#14408,#14793);
+#14793 = DEFINITIONAL_REPRESENTATION('',(#14794),#14798);
+#14794 = LINE('',#14795,#14796);
+#14795 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#14796 = VECTOR('',#14797,1.);
+#14797 = DIRECTION('',(0.,-1.));
+#14798 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14799 = PCURVE('',#14545,#14800);
+#14800 = DEFINITIONAL_REPRESENTATION('',(#14801),#14805);
+#14801 = LINE('',#14802,#14803);
+#14802 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#14803 = VECTOR('',#14804,1.);
+#14804 = DIRECTION('',(0.,1.));
+#14805 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14806 = ORIENTED_EDGE('',*,*,#14807,.T.);
+#14807 = EDGE_CURVE('',#14785,#14365,#14808,.T.);
+#14808 = SURFACE_CURVE('',#14809,(#14813,#14820),.PCURVE_S1.);
+#14809 = LINE('',#14810,#14811);
+#14810 = CARTESIAN_POINT('',(3.6725,-6.9,0.275));
+#14811 = VECTOR('',#14812,1.);
+#14812 = DIRECTION('',(1.,0.,0.));
+#14813 = PCURVE('',#14408,#14814);
+#14814 = DEFINITIONAL_REPRESENTATION('',(#14815),#14819);
+#14815 = LINE('',#14816,#14817);
+#14816 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#14817 = VECTOR('',#14818,1.);
+#14818 = DIRECTION('',(-1.,1.51269824963E-59));
+#14819 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14820 = PCURVE('',#14380,#14821);
+#14821 = DEFINITIONAL_REPRESENTATION('',(#14822),#14826);
+#14822 = LINE('',#14823,#14824);
+#14823 = CARTESIAN_POINT('',(0.388908729653,0.));
+#14824 = VECTOR('',#14825,1.);
+#14825 = DIRECTION('',(0.,-1.));
+#14826 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14827 = ADVANCED_FACE('',(#14828),#14296,.T.);
+#14828 = FACE_BOUND('',#14829,.T.);
+#14829 = EDGE_LOOP('',(#14830,#14831,#14832,#14855));
+#14830 = ORIENTED_EDGE('',*,*,#14666,.T.);
+#14831 = ORIENTED_EDGE('',*,*,#14280,.T.);
+#14832 = ORIENTED_EDGE('',*,*,#14833,.F.);
+#14833 = EDGE_CURVE('',#14834,#14281,#14836,.T.);
+#14834 = VERTEX_POINT('',#14835);
+#14835 = CARTESIAN_POINT('',(3.6725,-6.075,-3.5));
+#14836 = SURFACE_CURVE('',#14837,(#14841,#14848),.PCURVE_S1.);
+#14837 = LINE('',#14838,#14839);
+#14838 = CARTESIAN_POINT('',(3.6725,-6.075,-3.5));
+#14839 = VECTOR('',#14840,1.);
+#14840 = DIRECTION('',(1.,0.,0.));
+#14841 = PCURVE('',#14296,#14842);
+#14842 = DEFINITIONAL_REPRESENTATION('',(#14843),#14847);
+#14843 = LINE('',#14844,#14845);
+#14844 = CARTESIAN_POINT('',(3.5,0.));
+#14845 = VECTOR('',#14846,1.);
+#14846 = DIRECTION('',(0.,-1.));
+#14847 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14848 = PCURVE('',#14324,#14849);
+#14849 = DEFINITIONAL_REPRESENTATION('',(#14850),#14854);
+#14850 = LINE('',#14851,#14852);
+#14851 = CARTESIAN_POINT('',(7.771561172376E-16,0.));
+#14852 = VECTOR('',#14853,1.);
+#14853 = DIRECTION('',(0.,-1.));
+#14854 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14855 = ORIENTED_EDGE('',*,*,#14856,.F.);
+#14856 = EDGE_CURVE('',#14667,#14834,#14857,.T.);
+#14857 = SURFACE_CURVE('',#14858,(#14862,#14869),.PCURVE_S1.);
+#14858 = LINE('',#14859,#14860);
+#14859 = CARTESIAN_POINT('',(3.6725,-6.075,0.));
+#14860 = VECTOR('',#14861,1.);
+#14861 = DIRECTION('',(0.,0.,-1.));
+#14862 = PCURVE('',#14296,#14863);
+#14863 = DEFINITIONAL_REPRESENTATION('',(#14864),#14868);
+#14864 = LINE('',#14865,#14866);
+#14865 = CARTESIAN_POINT('',(0.,0.));
+#14866 = VECTOR('',#14867,1.);
+#14867 = DIRECTION('',(1.,0.));
+#14868 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14869 = PCURVE('',#14545,#14870);
+#14870 = DEFINITIONAL_REPRESENTATION('',(#14871),#14875);
+#14871 = LINE('',#14872,#14873);
+#14872 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#14873 = VECTOR('',#14874,1.);
+#14874 = DIRECTION('',(0.,-1.));
+#14875 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14876 = ADVANCED_FACE('',(#14877),#14380,.T.);
+#14877 = FACE_BOUND('',#14878,.T.);
+#14878 = EDGE_LOOP('',(#14879,#14902,#14903,#14904));
+#14879 = ORIENTED_EDGE('',*,*,#14880,.T.);
+#14880 = EDGE_CURVE('',#14881,#14337,#14883,.T.);
+#14881 = VERTEX_POINT('',#14882);
+#14882 = CARTESIAN_POINT('',(3.6725,-6.625,0.));
+#14883 = SURFACE_CURVE('',#14884,(#14888,#14895),.PCURVE_S1.);
+#14884 = LINE('',#14885,#14886);
+#14885 = CARTESIAN_POINT('',(3.6725,-6.625,0.));
+#14886 = VECTOR('',#14887,1.);
+#14887 = DIRECTION('',(1.,0.,0.));
+#14888 = PCURVE('',#14380,#14889);
+#14889 = DEFINITIONAL_REPRESENTATION('',(#14890),#14894);
+#14890 = LINE('',#14891,#14892);
+#14891 = CARTESIAN_POINT('',(-1.177569344013E-16,0.));
+#14892 = VECTOR('',#14893,1.);
+#14893 = DIRECTION('',(0.,-1.));
+#14894 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14895 = PCURVE('',#14352,#14896);
+#14896 = DEFINITIONAL_REPRESENTATION('',(#14897),#14901);
+#14897 = LINE('',#14898,#14899);
+#14898 = CARTESIAN_POINT('',(3.5,0.));
+#14899 = VECTOR('',#14900,1.);
+#14900 = DIRECTION('',(0.,-1.));
+#14901 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14902 = ORIENTED_EDGE('',*,*,#14364,.T.);
+#14903 = ORIENTED_EDGE('',*,*,#14807,.F.);
+#14904 = ORIENTED_EDGE('',*,*,#14905,.F.);
+#14905 = EDGE_CURVE('',#14881,#14785,#14906,.T.);
+#14906 = SURFACE_CURVE('',#14907,(#14911,#14918),.PCURVE_S1.);
+#14907 = LINE('',#14908,#14909);
+#14908 = CARTESIAN_POINT('',(3.6725,-6.625,0.));
+#14909 = VECTOR('',#14910,1.);
+#14910 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#14911 = PCURVE('',#14380,#14912);
+#14912 = DEFINITIONAL_REPRESENTATION('',(#14913),#14917);
+#14913 = LINE('',#14914,#14915);
+#14914 = CARTESIAN_POINT('',(0.,0.));
+#14915 = VECTOR('',#14916,1.);
+#14916 = DIRECTION('',(1.,0.));
+#14917 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14918 = PCURVE('',#14545,#14919);
+#14919 = DEFINITIONAL_REPRESENTATION('',(#14920),#14924);
+#14920 = LINE('',#14921,#14922);
+#14921 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#14922 = VECTOR('',#14923,1.);
+#14923 = DIRECTION('',(0.707106781187,0.707106781187));
+#14924 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14925 = ADVANCED_FACE('',(#14926),#14324,.T.);
+#14926 = FACE_BOUND('',#14927,.T.);
+#14927 = EDGE_LOOP('',(#14928,#14929,#14930,#14953));
+#14928 = ORIENTED_EDGE('',*,*,#14833,.T.);
+#14929 = ORIENTED_EDGE('',*,*,#14308,.T.);
+#14930 = ORIENTED_EDGE('',*,*,#14931,.F.);
+#14931 = EDGE_CURVE('',#14932,#14309,#14934,.T.);
+#14932 = VERTEX_POINT('',#14933);
+#14933 = CARTESIAN_POINT('',(3.6725,-6.625,-3.5));
+#14934 = SURFACE_CURVE('',#14935,(#14939,#14946),.PCURVE_S1.);
+#14935 = LINE('',#14936,#14937);
+#14936 = CARTESIAN_POINT('',(3.6725,-6.625,-3.5));
+#14937 = VECTOR('',#14938,1.);
+#14938 = DIRECTION('',(1.,0.,0.));
+#14939 = PCURVE('',#14324,#14940);
+#14940 = DEFINITIONAL_REPRESENTATION('',(#14941),#14945);
+#14941 = LINE('',#14942,#14943);
+#14942 = CARTESIAN_POINT('',(0.55,0.));
+#14943 = VECTOR('',#14944,1.);
+#14944 = DIRECTION('',(0.,-1.));
+#14945 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14946 = PCURVE('',#14352,#14947);
+#14947 = DEFINITIONAL_REPRESENTATION('',(#14948),#14952);
+#14948 = LINE('',#14949,#14950);
+#14949 = CARTESIAN_POINT('',(0.,0.));
+#14950 = VECTOR('',#14951,1.);
+#14951 = DIRECTION('',(0.,-1.));
+#14952 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14953 = ORIENTED_EDGE('',*,*,#14954,.F.);
+#14954 = EDGE_CURVE('',#14834,#14932,#14955,.T.);
+#14955 = SURFACE_CURVE('',#14956,(#14960,#14967),.PCURVE_S1.);
+#14956 = LINE('',#14957,#14958);
+#14957 = CARTESIAN_POINT('',(3.6725,-6.075,-3.5));
+#14958 = VECTOR('',#14959,1.);
+#14959 = DIRECTION('',(0.,-1.,0.));
+#14960 = PCURVE('',#14324,#14961);
+#14961 = DEFINITIONAL_REPRESENTATION('',(#14962),#14966);
+#14962 = LINE('',#14963,#14964);
+#14963 = CARTESIAN_POINT('',(0.,-0.));
+#14964 = VECTOR('',#14965,1.);
+#14965 = DIRECTION('',(1.,0.));
+#14966 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14967 = PCURVE('',#14545,#14968);
+#14968 = DEFINITIONAL_REPRESENTATION('',(#14969),#14973);
+#14969 = LINE('',#14970,#14971);
+#14970 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#14971 = VECTOR('',#14972,1.);
+#14972 = DIRECTION('',(1.,2.226071387182E-62));
+#14973 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14974 = ADVANCED_FACE('',(#14975),#14352,.T.);
+#14975 = FACE_BOUND('',#14976,.T.);
+#14976 = EDGE_LOOP('',(#14977,#14978,#14979,#14980));
+#14977 = ORIENTED_EDGE('',*,*,#14931,.T.);
+#14978 = ORIENTED_EDGE('',*,*,#14336,.T.);
+#14979 = ORIENTED_EDGE('',*,*,#14880,.F.);
+#14980 = ORIENTED_EDGE('',*,*,#14981,.F.);
+#14981 = EDGE_CURVE('',#14932,#14881,#14982,.T.);
+#14982 = SURFACE_CURVE('',#14983,(#14987,#14994),.PCURVE_S1.);
+#14983 = LINE('',#14984,#14985);
+#14984 = CARTESIAN_POINT('',(3.6725,-6.625,-3.5));
+#14985 = VECTOR('',#14986,1.);
+#14986 = DIRECTION('',(0.,0.,1.));
+#14987 = PCURVE('',#14352,#14988);
+#14988 = DEFINITIONAL_REPRESENTATION('',(#14989),#14993);
+#14989 = LINE('',#14990,#14991);
+#14990 = CARTESIAN_POINT('',(0.,0.));
+#14991 = VECTOR('',#14992,1.);
+#14992 = DIRECTION('',(1.,0.));
+#14993 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#14994 = PCURVE('',#14545,#14995);
+#14995 = DEFINITIONAL_REPRESENTATION('',(#14996),#15000);
+#14996 = LINE('',#14997,#14998);
+#14997 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#14998 = VECTOR('',#14999,1.);
+#14999 = DIRECTION('',(0.,1.));
+#15000 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15001 = ADVANCED_FACE('',(#15002),#14467,.T.);
+#15002 = FACE_BOUND('',#15003,.T.);
+#15003 = EDGE_LOOP('',(#15004,#15005,#15006,#15007));
+#15004 = ORIENTED_EDGE('',*,*,#14715,.T.);
+#15005 = ORIENTED_EDGE('',*,*,#14638,.T.);
+#15006 = ORIENTED_EDGE('',*,*,#14449,.F.);
+#15007 = ORIENTED_EDGE('',*,*,#15008,.F.);
+#15008 = EDGE_CURVE('',#14716,#14450,#15009,.T.);
+#15009 = SURFACE_CURVE('',#15010,(#15014,#15021),.PCURVE_S1.);
+#15010 = LINE('',#15011,#15012);
+#15011 = CARTESIAN_POINT('',(3.175,-6.9,2.56));
+#15012 = VECTOR('',#15013,1.);
+#15013 = DIRECTION('',(0.,1.,0.));
+#15014 = PCURVE('',#14467,#15015);
+#15015 = DEFINITIONAL_REPRESENTATION('',(#15016),#15020);
+#15016 = LINE('',#15017,#15018);
+#15017 = CARTESIAN_POINT('',(-0.38625,-0.55));
+#15018 = VECTOR('',#15019,1.);
+#15019 = DIRECTION('',(0.,1.));
+#15020 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15021 = PCURVE('',#14599,#15022);
+#15022 = DEFINITIONAL_REPRESENTATION('',(#15023),#15027);
+#15023 = LINE('',#15024,#15025);
+#15024 = CARTESIAN_POINT('',(0.275,0.));
+#15025 = VECTOR('',#15026,1.);
+#15026 = DIRECTION('',(0.,-1.));
+#15027 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15028 = ADVANCED_FACE('',(#15029),#14599,.F.);
+#15029 = FACE_BOUND('',#15030,.F.);
+#15030 = EDGE_LOOP('',(#15031,#15032,#15053,#15054));
+#15031 = ORIENTED_EDGE('',*,*,#14738,.F.);
+#15032 = ORIENTED_EDGE('',*,*,#15033,.T.);
+#15033 = EDGE_CURVE('',#14739,#14558,#15034,.T.);
+#15034 = SURFACE_CURVE('',#15035,(#15039,#15046),.PCURVE_S1.);
+#15035 = LINE('',#15036,#15037);
+#15036 = CARTESIAN_POINT('',(3.175,-6.9,2.285));
+#15037 = VECTOR('',#15038,1.);
+#15038 = DIRECTION('',(0.,1.,0.));
+#15039 = PCURVE('',#14599,#15040);
+#15040 = DEFINITIONAL_REPRESENTATION('',(#15041),#15045);
+#15041 = LINE('',#15042,#15043);
+#15042 = CARTESIAN_POINT('',(0.,0.));
+#15043 = VECTOR('',#15044,1.);
+#15044 = DIRECTION('',(0.,-1.));
+#15045 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15046 = PCURVE('',#14573,#15047);
+#15047 = DEFINITIONAL_REPRESENTATION('',(#15048),#15052);
+#15048 = LINE('',#15049,#15050);
+#15049 = CARTESIAN_POINT('',(0.,0.));
+#15050 = VECTOR('',#15051,1.);
+#15051 = DIRECTION('',(0.,1.));
+#15052 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15053 = ORIENTED_EDGE('',*,*,#14585,.T.);
+#15054 = ORIENTED_EDGE('',*,*,#15008,.F.);
+#15055 = ADVANCED_FACE('',(#15056),#14573,.F.);
+#15056 = FACE_BOUND('',#15057,.F.);
+#15057 = EDGE_LOOP('',(#15058,#15059,#15060,#15081));
+#15058 = ORIENTED_EDGE('',*,*,#15033,.F.);
+#15059 = ORIENTED_EDGE('',*,*,#14761,.T.);
+#15060 = ORIENTED_EDGE('',*,*,#15061,.T.);
+#15061 = EDGE_CURVE('',#14762,#14530,#15062,.T.);
+#15062 = SURFACE_CURVE('',#15063,(#15067,#15074),.PCURVE_S1.);
+#15063 = LINE('',#15064,#15065);
+#15064 = CARTESIAN_POINT('',(3.6725,-6.9,2.285));
+#15065 = VECTOR('',#15066,1.);
+#15066 = DIRECTION('',(0.,1.,0.));
+#15067 = PCURVE('',#14573,#15068);
+#15068 = DEFINITIONAL_REPRESENTATION('',(#15069),#15073);
+#15069 = LINE('',#15070,#15071);
+#15070 = CARTESIAN_POINT('',(0.4975,0.));
+#15071 = VECTOR('',#15072,1.);
+#15072 = DIRECTION('',(0.,1.));
+#15073 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15074 = PCURVE('',#14545,#15075);
+#15075 = DEFINITIONAL_REPRESENTATION('',(#15076),#15080);
+#15076 = LINE('',#15077,#15078);
+#15077 = CARTESIAN_POINT('',(0.55,2.62605853382));
+#15078 = VECTOR('',#15079,1.);
+#15079 = DIRECTION('',(-1.,-2.226071387182E-62));
+#15080 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15081 = ORIENTED_EDGE('',*,*,#14557,.F.);
+#15082 = ADVANCED_FACE('',(#15083),#14545,.T.);
+#15083 = FACE_BOUND('',#15084,.T.);
+#15084 = EDGE_LOOP('',(#15085,#15086,#15087,#15088,#15089,#15090,#15091,
+ #15092));
+#15085 = ORIENTED_EDGE('',*,*,#14784,.T.);
+#15086 = ORIENTED_EDGE('',*,*,#15061,.T.);
+#15087 = ORIENTED_EDGE('',*,*,#14529,.T.);
+#15088 = ORIENTED_EDGE('',*,*,#14689,.T.);
+#15089 = ORIENTED_EDGE('',*,*,#14856,.T.);
+#15090 = ORIENTED_EDGE('',*,*,#14954,.T.);
+#15091 = ORIENTED_EDGE('',*,*,#14981,.T.);
+#15092 = ORIENTED_EDGE('',*,*,#14905,.T.);
+#15093 = MANIFOLD_SOLID_BREP('',#15094);
+#15094 = CLOSED_SHELL('',(#15095,#15327,#15492,#15542,#15591,#15709,
+ #15758,#15807,#15856,#15883,#15910,#15937,#15964));
+#15095 = ADVANCED_FACE('',(#15096),#15110,.F.);
+#15096 = FACE_BOUND('',#15097,.F.);
+#15097 = EDGE_LOOP('',(#15098,#15133,#15161,#15189,#15217,#15245,#15273,
+ #15301));
+#15098 = ORIENTED_EDGE('',*,*,#15099,.T.);
+#15099 = EDGE_CURVE('',#15100,#15102,#15104,.T.);
+#15100 = VERTEX_POINT('',#15101);
+#15101 = CARTESIAN_POINT('',(-3.9475,-9.44,2.4225));
+#15102 = VERTEX_POINT('',#15103);
+#15103 = CARTESIAN_POINT('',(-3.9475,-9.44,0.275));
+#15104 = SURFACE_CURVE('',#15105,(#15109,#15121),.PCURVE_S1.);
+#15105 = LINE('',#15106,#15107);
+#15106 = CARTESIAN_POINT('',(-3.9475,-9.44,2.56));
+#15107 = VECTOR('',#15108,1.);
+#15108 = DIRECTION('',(0.,0.,-1.));
+#15109 = PCURVE('',#15110,#15115);
+#15110 = PLANE('',#15111);
+#15111 = AXIS2_PLACEMENT_3D('',#15112,#15113,#15114);
+#15112 = CARTESIAN_POINT('',(-3.9475,-8.89,-0.34105853382));
+#15113 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#15114 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#15115 = DEFINITIONAL_REPRESENTATION('',(#15116),#15120);
+#15116 = LINE('',#15117,#15118);
+#15117 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#15118 = VECTOR('',#15119,1.);
+#15119 = DIRECTION('',(0.,-1.));
+#15120 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15121 = PCURVE('',#15122,#15127);
+#15122 = PLANE('',#15123);
+#15123 = AXIS2_PLACEMENT_3D('',#15124,#15125,#15126);
+#15124 = CARTESIAN_POINT('',(-3.724778209321,-9.44,1.581028209321));
+#15125 = DIRECTION('',(1.58726821659E-29,-1.,-1.055919227411E-30));
+#15126 = DIRECTION('',(-1.,-1.58726821659E-29,0.));
+#15127 = DEFINITIONAL_REPRESENTATION('',(#15128),#15132);
+#15128 = LINE('',#15129,#15130);
+#15129 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#15130 = VECTOR('',#15131,1.);
+#15131 = DIRECTION('',(0.,1.));
+#15132 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15133 = ORIENTED_EDGE('',*,*,#15134,.T.);
+#15134 = EDGE_CURVE('',#15102,#15135,#15137,.T.);
+#15135 = VERTEX_POINT('',#15136);
+#15136 = CARTESIAN_POINT('',(-3.9475,-9.165,0.));
+#15137 = SURFACE_CURVE('',#15138,(#15142,#15149),.PCURVE_S1.);
+#15138 = LINE('',#15139,#15140);
+#15139 = CARTESIAN_POINT('',(-3.9475,-9.44,0.275));
+#15140 = VECTOR('',#15141,1.);
+#15141 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#15142 = PCURVE('',#15110,#15143);
+#15143 = DEFINITIONAL_REPRESENTATION('',(#15144),#15148);
+#15144 = LINE('',#15145,#15146);
+#15145 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#15146 = VECTOR('',#15147,1.);
+#15147 = DIRECTION('',(0.707106781187,-0.707106781187));
+#15148 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15149 = PCURVE('',#15150,#15155);
+#15150 = PLANE('',#15151);
+#15151 = AXIS2_PLACEMENT_3D('',#15152,#15153,#15154);
+#15152 = CARTESIAN_POINT('',(-3.6725,-9.44,0.275));
+#15153 = DIRECTION('',(-0.,-0.707106781187,-0.707106781187));
+#15154 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#15155 = DEFINITIONAL_REPRESENTATION('',(#15156),#15160);
+#15156 = LINE('',#15157,#15158);
+#15157 = CARTESIAN_POINT('',(0.,-0.275));
+#15158 = VECTOR('',#15159,1.);
+#15159 = DIRECTION('',(1.,0.));
+#15160 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15161 = ORIENTED_EDGE('',*,*,#15162,.T.);
+#15162 = EDGE_CURVE('',#15135,#15163,#15165,.T.);
+#15163 = VERTEX_POINT('',#15164);
+#15164 = CARTESIAN_POINT('',(-3.9475,-9.165,-3.5));
+#15165 = SURFACE_CURVE('',#15166,(#15170,#15177),.PCURVE_S1.);
+#15166 = LINE('',#15167,#15168);
+#15167 = CARTESIAN_POINT('',(-3.9475,-9.165,0.));
+#15168 = VECTOR('',#15169,1.);
+#15169 = DIRECTION('',(0.,0.,-1.));
+#15170 = PCURVE('',#15110,#15171);
+#15171 = DEFINITIONAL_REPRESENTATION('',(#15172),#15176);
+#15172 = LINE('',#15173,#15174);
+#15173 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#15174 = VECTOR('',#15175,1.);
+#15175 = DIRECTION('',(0.,-1.));
+#15176 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15177 = PCURVE('',#15178,#15183);
+#15178 = PLANE('',#15179);
+#15179 = AXIS2_PLACEMENT_3D('',#15180,#15181,#15182);
+#15180 = CARTESIAN_POINT('',(-3.6725,-9.165,0.));
+#15181 = DIRECTION('',(-0.,-1.,-0.));
+#15182 = DIRECTION('',(0.,0.,-1.));
+#15183 = DEFINITIONAL_REPRESENTATION('',(#15184),#15188);
+#15184 = LINE('',#15185,#15186);
+#15185 = CARTESIAN_POINT('',(0.,-0.275));
+#15186 = VECTOR('',#15187,1.);
+#15187 = DIRECTION('',(1.,0.));
+#15188 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15189 = ORIENTED_EDGE('',*,*,#15190,.T.);
+#15190 = EDGE_CURVE('',#15163,#15191,#15193,.T.);
+#15191 = VERTEX_POINT('',#15192);
+#15192 = CARTESIAN_POINT('',(-3.9475,-8.615,-3.5));
+#15193 = SURFACE_CURVE('',#15194,(#15198,#15205),.PCURVE_S1.);
+#15194 = LINE('',#15195,#15196);
+#15195 = CARTESIAN_POINT('',(-3.9475,-9.165,-3.5));
+#15196 = VECTOR('',#15197,1.);
+#15197 = DIRECTION('',(0.,1.,0.));
+#15198 = PCURVE('',#15110,#15199);
+#15199 = DEFINITIONAL_REPRESENTATION('',(#15200),#15204);
+#15200 = LINE('',#15201,#15202);
+#15201 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#15202 = VECTOR('',#15203,1.);
+#15203 = DIRECTION('',(1.,-2.226071387182E-62));
+#15204 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15205 = PCURVE('',#15206,#15211);
+#15206 = PLANE('',#15207);
+#15207 = AXIS2_PLACEMENT_3D('',#15208,#15209,#15210);
+#15208 = CARTESIAN_POINT('',(-3.6725,-9.165,-3.5));
+#15209 = DIRECTION('',(0.,0.,-1.));
+#15210 = DIRECTION('',(0.,1.,0.));
+#15211 = DEFINITIONAL_REPRESENTATION('',(#15212),#15216);
+#15212 = LINE('',#15213,#15214);
+#15213 = CARTESIAN_POINT('',(0.,-0.275));
+#15214 = VECTOR('',#15215,1.);
+#15215 = DIRECTION('',(1.,0.));
+#15216 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15217 = ORIENTED_EDGE('',*,*,#15218,.T.);
+#15218 = EDGE_CURVE('',#15191,#15219,#15221,.T.);
+#15219 = VERTEX_POINT('',#15220);
+#15220 = CARTESIAN_POINT('',(-3.9475,-8.615,0.));
+#15221 = SURFACE_CURVE('',#15222,(#15226,#15233),.PCURVE_S1.);
+#15222 = LINE('',#15223,#15224);
+#15223 = CARTESIAN_POINT('',(-3.9475,-8.615,-3.5));
+#15224 = VECTOR('',#15225,1.);
+#15225 = DIRECTION('',(0.,0.,1.));
+#15226 = PCURVE('',#15110,#15227);
+#15227 = DEFINITIONAL_REPRESENTATION('',(#15228),#15232);
+#15228 = LINE('',#15229,#15230);
+#15229 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#15230 = VECTOR('',#15231,1.);
+#15231 = DIRECTION('',(0.,1.));
+#15232 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15233 = PCURVE('',#15234,#15239);
+#15234 = PLANE('',#15235);
+#15235 = AXIS2_PLACEMENT_3D('',#15236,#15237,#15238);
+#15236 = CARTESIAN_POINT('',(-3.6725,-8.615,-3.5));
+#15237 = DIRECTION('',(0.,1.,0.));
+#15238 = DIRECTION('',(0.,0.,1.));
+#15239 = DEFINITIONAL_REPRESENTATION('',(#15240),#15244);
+#15240 = LINE('',#15241,#15242);
+#15241 = CARTESIAN_POINT('',(0.,-0.275));
+#15242 = VECTOR('',#15243,1.);
+#15243 = DIRECTION('',(1.,0.));
+#15244 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15245 = ORIENTED_EDGE('',*,*,#15246,.T.);
+#15246 = EDGE_CURVE('',#15219,#15247,#15249,.T.);
+#15247 = VERTEX_POINT('',#15248);
+#15248 = CARTESIAN_POINT('',(-3.9475,-8.34,0.275));
+#15249 = SURFACE_CURVE('',#15250,(#15254,#15261),.PCURVE_S1.);
+#15250 = LINE('',#15251,#15252);
+#15251 = CARTESIAN_POINT('',(-3.9475,-8.615,0.));
+#15252 = VECTOR('',#15253,1.);
+#15253 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#15254 = PCURVE('',#15110,#15255);
+#15255 = DEFINITIONAL_REPRESENTATION('',(#15256),#15260);
+#15256 = LINE('',#15257,#15258);
+#15257 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#15258 = VECTOR('',#15259,1.);
+#15259 = DIRECTION('',(0.707106781187,0.707106781187));
+#15260 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15261 = PCURVE('',#15262,#15267);
+#15262 = PLANE('',#15263);
+#15263 = AXIS2_PLACEMENT_3D('',#15264,#15265,#15266);
+#15264 = CARTESIAN_POINT('',(-3.6725,-8.615,0.));
+#15265 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#15266 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#15267 = DEFINITIONAL_REPRESENTATION('',(#15268),#15272);
+#15268 = LINE('',#15269,#15270);
+#15269 = CARTESIAN_POINT('',(0.,-0.275));
+#15270 = VECTOR('',#15271,1.);
+#15271 = DIRECTION('',(1.,0.));
+#15272 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15273 = ORIENTED_EDGE('',*,*,#15274,.T.);
+#15274 = EDGE_CURVE('',#15247,#15275,#15277,.T.);
+#15275 = VERTEX_POINT('',#15276);
+#15276 = CARTESIAN_POINT('',(-3.9475,-8.34,2.4225));
+#15277 = SURFACE_CURVE('',#15278,(#15282,#15289),.PCURVE_S1.);
+#15278 = LINE('',#15279,#15280);
+#15279 = CARTESIAN_POINT('',(-3.9475,-8.34,0.275));
+#15280 = VECTOR('',#15281,1.);
+#15281 = DIRECTION('',(0.,0.,1.));
+#15282 = PCURVE('',#15110,#15283);
+#15283 = DEFINITIONAL_REPRESENTATION('',(#15284),#15288);
+#15284 = LINE('',#15285,#15286);
+#15285 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#15286 = VECTOR('',#15287,1.);
+#15287 = DIRECTION('',(0.,1.));
+#15288 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15289 = PCURVE('',#15290,#15295);
+#15290 = PLANE('',#15291);
+#15291 = AXIS2_PLACEMENT_3D('',#15292,#15293,#15294);
+#15292 = CARTESIAN_POINT('',(-3.724778209321,-8.34,1.581028209321));
+#15293 = DIRECTION('',(2.616880222009E-29,1.,-2.312216259511E-30));
+#15294 = DIRECTION('',(1.,-2.616880222009E-29,0.));
+#15295 = DEFINITIONAL_REPRESENTATION('',(#15296),#15300);
+#15296 = LINE('',#15297,#15298);
+#15297 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#15298 = VECTOR('',#15299,1.);
+#15299 = DIRECTION('',(0.,-1.));
+#15300 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15301 = ORIENTED_EDGE('',*,*,#15302,.T.);
+#15302 = EDGE_CURVE('',#15275,#15100,#15303,.T.);
+#15303 = SURFACE_CURVE('',#15304,(#15308,#15315),.PCURVE_S1.);
+#15304 = LINE('',#15305,#15306);
+#15305 = CARTESIAN_POINT('',(-3.9475,-8.34,2.4225));
+#15306 = VECTOR('',#15307,1.);
+#15307 = DIRECTION('',(0.,-1.,0.));
+#15308 = PCURVE('',#15110,#15309);
+#15309 = DEFINITIONAL_REPRESENTATION('',(#15310),#15314);
+#15310 = LINE('',#15311,#15312);
+#15311 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#15312 = VECTOR('',#15313,1.);
+#15313 = DIRECTION('',(-1.,2.226071387182E-62));
+#15314 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15315 = PCURVE('',#15316,#15321);
+#15316 = CYLINDRICAL_SURFACE('',#15317,0.1375);
+#15317 = AXIS2_PLACEMENT_3D('',#15318,#15319,#15320);
+#15318 = CARTESIAN_POINT('',(-3.81,-8.34,2.4225));
+#15319 = DIRECTION('',(0.,-1.,0.));
+#15320 = DIRECTION('',(-1.,-0.,-9.8088568672E-33));
+#15321 = DEFINITIONAL_REPRESENTATION('',(#15322),#15326);
+#15322 = LINE('',#15323,#15324);
+#15323 = CARTESIAN_POINT('',(-0.,0.));
+#15324 = VECTOR('',#15325,1.);
+#15325 = DIRECTION('',(-0.,1.));
+#15326 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15327 = ADVANCED_FACE('',(#15328),#15122,.T.);
+#15328 = FACE_BOUND('',#15329,.T.);
+#15329 = EDGE_LOOP('',(#15330,#15360,#15386,#15387,#15410,#15438,#15466)
+ );
+#15330 = ORIENTED_EDGE('',*,*,#15331,.T.);
+#15331 = EDGE_CURVE('',#15332,#15334,#15336,.T.);
+#15332 = VERTEX_POINT('',#15333);
+#15333 = CARTESIAN_POINT('',(-3.175,-9.44,2.56));
+#15334 = VERTEX_POINT('',#15335);
+#15335 = CARTESIAN_POINT('',(-3.81,-9.44,2.56));
+#15336 = SURFACE_CURVE('',#15337,(#15341,#15348),.PCURVE_S1.);
+#15337 = LINE('',#15338,#15339);
+#15338 = CARTESIAN_POINT('',(-3.6725,-9.44,2.56));
+#15339 = VECTOR('',#15340,1.);
+#15340 = DIRECTION('',(-1.,0.,0.));
+#15341 = PCURVE('',#15122,#15342);
+#15342 = DEFINITIONAL_REPRESENTATION('',(#15343),#15347);
+#15343 = LINE('',#15344,#15345);
+#15344 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#15345 = VECTOR('',#15346,1.);
+#15346 = DIRECTION('',(1.,1.676027028956E-59));
+#15347 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15348 = PCURVE('',#15349,#15354);
+#15349 = PLANE('',#15350);
+#15350 = AXIS2_PLACEMENT_3D('',#15351,#15352,#15353);
+#15351 = CARTESIAN_POINT('',(-3.56125,-8.89,2.56));
+#15352 = DIRECTION('',(1.601195610168E-30,3.925633828627E-30,1.));
+#15353 = DIRECTION('',(0.,1.,-3.925633828627E-30));
+#15354 = DEFINITIONAL_REPRESENTATION('',(#15355),#15359);
+#15355 = LINE('',#15356,#15357);
+#15356 = CARTESIAN_POINT('',(-0.55,0.11125));
+#15357 = VECTOR('',#15358,1.);
+#15358 = DIRECTION('',(0.,1.));
+#15359 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15360 = ORIENTED_EDGE('',*,*,#15361,.F.);
+#15361 = EDGE_CURVE('',#15100,#15334,#15362,.T.);
+#15362 = SURFACE_CURVE('',#15363,(#15368,#15379),.PCURVE_S1.);
+#15363 = CIRCLE('',#15364,0.1375);
+#15364 = AXIS2_PLACEMENT_3D('',#15365,#15366,#15367);
+#15365 = CARTESIAN_POINT('',(-3.81,-9.44,2.4225));
+#15366 = DIRECTION('',(-0.,1.,0.));
+#15367 = DIRECTION('',(0.,0.,-1.));
+#15368 = PCURVE('',#15122,#15369);
+#15369 = DEFINITIONAL_REPRESENTATION('',(#15370),#15378);
+#15370 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#15371,#15372,#15373,#15374
+ ,#15375,#15376,#15377),.UNSPECIFIED.,.F.,.F.)
+B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),(-2.094395102393,0.,
+ 2.094395102393,4.188790204786,6.28318530718,8.377580409573),
+.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM()
+RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM(
+ '') );
+#15371 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#15372 = CARTESIAN_POINT('',(0.323378776719,-0.703971790679));
+#15373 = CARTESIAN_POINT('',(0.204300283699,-0.910221790679));
+#15374 = CARTESIAN_POINT('',(8.522179067866E-02,-1.116471790679));
+#15375 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.910221790679));
+#15376 = CARTESIAN_POINT('',(-0.152935195362,-0.703971790679));
+#15377 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#15378 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15379 = PCURVE('',#15316,#15380);
+#15380 = DEFINITIONAL_REPRESENTATION('',(#15381),#15385);
+#15381 = LINE('',#15382,#15383);
+#15382 = CARTESIAN_POINT('',(1.570796326795,1.1));
+#15383 = VECTOR('',#15384,1.);
+#15384 = DIRECTION('',(-1.,0.));
+#15385 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15386 = ORIENTED_EDGE('',*,*,#15099,.T.);
+#15387 = ORIENTED_EDGE('',*,*,#15388,.F.);
+#15388 = EDGE_CURVE('',#15389,#15102,#15391,.T.);
+#15389 = VERTEX_POINT('',#15390);
+#15390 = CARTESIAN_POINT('',(-3.6725,-9.44,0.275));
+#15391 = SURFACE_CURVE('',#15392,(#15396,#15403),.PCURVE_S1.);
+#15392 = LINE('',#15393,#15394);
+#15393 = CARTESIAN_POINT('',(-3.6725,-9.44,0.275));
+#15394 = VECTOR('',#15395,1.);
+#15395 = DIRECTION('',(-1.,0.,0.));
+#15396 = PCURVE('',#15122,#15397);
+#15397 = DEFINITIONAL_REPRESENTATION('',(#15398),#15402);
+#15398 = LINE('',#15399,#15400);
+#15399 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#15400 = VECTOR('',#15401,1.);
+#15401 = DIRECTION('',(1.,1.676027028956E-59));
+#15402 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15403 = PCURVE('',#15150,#15404);
+#15404 = DEFINITIONAL_REPRESENTATION('',(#15405),#15409);
+#15405 = LINE('',#15406,#15407);
+#15406 = CARTESIAN_POINT('',(0.,0.));
+#15407 = VECTOR('',#15408,1.);
+#15408 = DIRECTION('',(0.,-1.));
+#15409 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15410 = ORIENTED_EDGE('',*,*,#15411,.F.);
+#15411 = EDGE_CURVE('',#15412,#15389,#15414,.T.);
+#15412 = VERTEX_POINT('',#15413);
+#15413 = CARTESIAN_POINT('',(-3.6725,-9.44,2.285));
+#15414 = SURFACE_CURVE('',#15415,(#15419,#15426),.PCURVE_S1.);
+#15415 = LINE('',#15416,#15417);
+#15416 = CARTESIAN_POINT('',(-3.6725,-9.44,2.56));
+#15417 = VECTOR('',#15418,1.);
+#15418 = DIRECTION('',(0.,0.,-1.));
+#15419 = PCURVE('',#15122,#15420);
+#15420 = DEFINITIONAL_REPRESENTATION('',(#15421),#15425);
+#15421 = LINE('',#15422,#15423);
+#15422 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#15423 = VECTOR('',#15424,1.);
+#15424 = DIRECTION('',(0.,1.));
+#15425 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15426 = PCURVE('',#15427,#15432);
+#15427 = PLANE('',#15428);
+#15428 = AXIS2_PLACEMENT_3D('',#15429,#15430,#15431);
+#15429 = CARTESIAN_POINT('',(-3.6725,-8.89,-0.34105853382));
+#15430 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#15431 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#15432 = DEFINITIONAL_REPRESENTATION('',(#15433),#15437);
+#15433 = LINE('',#15434,#15435);
+#15434 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#15435 = VECTOR('',#15436,1.);
+#15436 = DIRECTION('',(0.,-1.));
+#15437 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15438 = ORIENTED_EDGE('',*,*,#15439,.T.);
+#15439 = EDGE_CURVE('',#15412,#15440,#15442,.T.);
+#15440 = VERTEX_POINT('',#15441);
+#15441 = CARTESIAN_POINT('',(-3.175,-9.44,2.285));
+#15442 = SURFACE_CURVE('',#15443,(#15447,#15454),.PCURVE_S1.);
+#15443 = LINE('',#15444,#15445);
+#15444 = CARTESIAN_POINT('',(-3.6725,-9.44,2.285));
+#15445 = VECTOR('',#15446,1.);
+#15446 = DIRECTION('',(1.,0.,0.));
+#15447 = PCURVE('',#15122,#15448);
+#15448 = DEFINITIONAL_REPRESENTATION('',(#15449),#15453);
+#15449 = LINE('',#15450,#15451);
+#15450 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.703971790679));
+#15451 = VECTOR('',#15452,1.);
+#15452 = DIRECTION('',(-1.,-1.676027028956E-59));
+#15453 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15454 = PCURVE('',#15455,#15460);
+#15455 = PLANE('',#15456);
+#15456 = AXIS2_PLACEMENT_3D('',#15457,#15458,#15459);
+#15457 = CARTESIAN_POINT('',(-3.6725,-9.44,2.285));
+#15458 = DIRECTION('',(0.,0.,1.));
+#15459 = DIRECTION('',(1.,0.,0.));
+#15460 = DEFINITIONAL_REPRESENTATION('',(#15461),#15465);
+#15461 = LINE('',#15462,#15463);
+#15462 = CARTESIAN_POINT('',(0.,0.));
+#15463 = VECTOR('',#15464,1.);
+#15464 = DIRECTION('',(1.,0.));
+#15465 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15466 = ORIENTED_EDGE('',*,*,#15467,.T.);
+#15467 = EDGE_CURVE('',#15440,#15332,#15468,.T.);
+#15468 = SURFACE_CURVE('',#15469,(#15473,#15480),.PCURVE_S1.);
+#15469 = LINE('',#15470,#15471);
+#15470 = CARTESIAN_POINT('',(-3.175,-9.44,2.285));
+#15471 = VECTOR('',#15472,1.);
+#15472 = DIRECTION('',(0.,0.,1.));
+#15473 = PCURVE('',#15122,#15474);
+#15474 = DEFINITIONAL_REPRESENTATION('',(#15475),#15479);
+#15475 = LINE('',#15476,#15477);
+#15476 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#15477 = VECTOR('',#15478,1.);
+#15478 = DIRECTION('',(0.,-1.));
+#15479 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15480 = PCURVE('',#15481,#15486);
+#15481 = PLANE('',#15482);
+#15482 = AXIS2_PLACEMENT_3D('',#15483,#15484,#15485);
+#15483 = CARTESIAN_POINT('',(-3.175,-9.44,2.285));
+#15484 = DIRECTION('',(1.,0.,0.));
+#15485 = DIRECTION('',(0.,0.,1.));
+#15486 = DEFINITIONAL_REPRESENTATION('',(#15487),#15491);
+#15487 = LINE('',#15488,#15489);
+#15488 = CARTESIAN_POINT('',(0.,0.));
+#15489 = VECTOR('',#15490,1.);
+#15490 = DIRECTION('',(1.,0.));
+#15491 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15492 = ADVANCED_FACE('',(#15493),#15316,.T.);
+#15493 = FACE_BOUND('',#15494,.F.);
+#15494 = EDGE_LOOP('',(#15495,#15519,#15540,#15541));
+#15495 = ORIENTED_EDGE('',*,*,#15496,.T.);
+#15496 = EDGE_CURVE('',#15275,#15497,#15499,.T.);
+#15497 = VERTEX_POINT('',#15498);
+#15498 = CARTESIAN_POINT('',(-3.81,-8.34,2.56));
+#15499 = SURFACE_CURVE('',#15500,(#15505,#15512),.PCURVE_S1.);
+#15500 = CIRCLE('',#15501,0.1375);
+#15501 = AXIS2_PLACEMENT_3D('',#15502,#15503,#15504);
+#15502 = CARTESIAN_POINT('',(-3.81,-8.34,2.4225));
+#15503 = DIRECTION('',(-0.,1.,0.));
+#15504 = DIRECTION('',(0.,0.,-1.));
+#15505 = PCURVE('',#15316,#15506);
+#15506 = DEFINITIONAL_REPRESENTATION('',(#15507),#15511);
+#15507 = LINE('',#15508,#15509);
+#15508 = CARTESIAN_POINT('',(1.570796326795,3.552713678801E-15));
+#15509 = VECTOR('',#15510,1.);
+#15510 = DIRECTION('',(-1.,0.));
+#15511 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15512 = PCURVE('',#15290,#15513);
+#15513 = DEFINITIONAL_REPRESENTATION('',(#15514),#15518);
+#15514 = CIRCLE('',#15515,0.1375);
+#15515 = AXIS2_PLACEMENT_2D('',#15516,#15517);
+#15516 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#15517 = DIRECTION('',(0.,1.));
+#15518 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15519 = ORIENTED_EDGE('',*,*,#15520,.T.);
+#15520 = EDGE_CURVE('',#15497,#15334,#15521,.T.);
+#15521 = SURFACE_CURVE('',#15522,(#15526,#15533),.PCURVE_S1.);
+#15522 = LINE('',#15523,#15524);
+#15523 = CARTESIAN_POINT('',(-3.81,-8.34,2.56));
+#15524 = VECTOR('',#15525,1.);
+#15525 = DIRECTION('',(0.,-1.,0.));
+#15526 = PCURVE('',#15316,#15527);
+#15527 = DEFINITIONAL_REPRESENTATION('',(#15528),#15532);
+#15528 = LINE('',#15529,#15530);
+#15529 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#15530 = VECTOR('',#15531,1.);
+#15531 = DIRECTION('',(-0.,1.));
+#15532 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15533 = PCURVE('',#15349,#15534);
+#15534 = DEFINITIONAL_REPRESENTATION('',(#15535),#15539);
+#15535 = LINE('',#15536,#15537);
+#15536 = CARTESIAN_POINT('',(0.55,0.24875));
+#15537 = VECTOR('',#15538,1.);
+#15538 = DIRECTION('',(-1.,-6.285707653525E-60));
+#15539 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15540 = ORIENTED_EDGE('',*,*,#15361,.F.);
+#15541 = ORIENTED_EDGE('',*,*,#15302,.F.);
+#15542 = ADVANCED_FACE('',(#15543),#15150,.T.);
+#15543 = FACE_BOUND('',#15544,.T.);
+#15544 = EDGE_LOOP('',(#15545,#15546,#15547,#15570));
+#15545 = ORIENTED_EDGE('',*,*,#15388,.T.);
+#15546 = ORIENTED_EDGE('',*,*,#15134,.T.);
+#15547 = ORIENTED_EDGE('',*,*,#15548,.F.);
+#15548 = EDGE_CURVE('',#15549,#15135,#15551,.T.);
+#15549 = VERTEX_POINT('',#15550);
+#15550 = CARTESIAN_POINT('',(-3.6725,-9.165,0.));
+#15551 = SURFACE_CURVE('',#15552,(#15556,#15563),.PCURVE_S1.);
+#15552 = LINE('',#15553,#15554);
+#15553 = CARTESIAN_POINT('',(-3.6725,-9.165,0.));
+#15554 = VECTOR('',#15555,1.);
+#15555 = DIRECTION('',(-1.,0.,0.));
+#15556 = PCURVE('',#15150,#15557);
+#15557 = DEFINITIONAL_REPRESENTATION('',(#15558),#15562);
+#15558 = LINE('',#15559,#15560);
+#15559 = CARTESIAN_POINT('',(0.388908729653,0.));
+#15560 = VECTOR('',#15561,1.);
+#15561 = DIRECTION('',(0.,-1.));
+#15562 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15563 = PCURVE('',#15178,#15564);
+#15564 = DEFINITIONAL_REPRESENTATION('',(#15565),#15569);
+#15565 = LINE('',#15566,#15567);
+#15566 = CARTESIAN_POINT('',(0.,0.));
+#15567 = VECTOR('',#15568,1.);
+#15568 = DIRECTION('',(0.,-1.));
+#15569 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15570 = ORIENTED_EDGE('',*,*,#15571,.F.);
+#15571 = EDGE_CURVE('',#15389,#15549,#15572,.T.);
+#15572 = SURFACE_CURVE('',#15573,(#15577,#15584),.PCURVE_S1.);
+#15573 = LINE('',#15574,#15575);
+#15574 = CARTESIAN_POINT('',(-3.6725,-9.44,0.275));
+#15575 = VECTOR('',#15576,1.);
+#15576 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#15577 = PCURVE('',#15150,#15578);
+#15578 = DEFINITIONAL_REPRESENTATION('',(#15579),#15583);
+#15579 = LINE('',#15580,#15581);
+#15580 = CARTESIAN_POINT('',(0.,0.));
+#15581 = VECTOR('',#15582,1.);
+#15582 = DIRECTION('',(1.,0.));
+#15583 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15584 = PCURVE('',#15427,#15585);
+#15585 = DEFINITIONAL_REPRESENTATION('',(#15586),#15590);
+#15586 = LINE('',#15587,#15588);
+#15587 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#15588 = VECTOR('',#15589,1.);
+#15589 = DIRECTION('',(0.707106781187,-0.707106781187));
+#15590 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15591 = ADVANCED_FACE('',(#15592),#15290,.T.);
+#15592 = FACE_BOUND('',#15593,.T.);
+#15593 = EDGE_LOOP('',(#15594,#15595,#15596,#15619,#15642,#15665,#15688)
+ );
+#15594 = ORIENTED_EDGE('',*,*,#15274,.T.);
+#15595 = ORIENTED_EDGE('',*,*,#15496,.T.);
+#15596 = ORIENTED_EDGE('',*,*,#15597,.T.);
+#15597 = EDGE_CURVE('',#15497,#15598,#15600,.T.);
+#15598 = VERTEX_POINT('',#15599);
+#15599 = CARTESIAN_POINT('',(-3.175,-8.34,2.56));
+#15600 = SURFACE_CURVE('',#15601,(#15605,#15612),.PCURVE_S1.);
+#15601 = LINE('',#15602,#15603);
+#15602 = CARTESIAN_POINT('',(-3.6725,-8.34,2.56));
+#15603 = VECTOR('',#15604,1.);
+#15604 = DIRECTION('',(1.,0.,0.));
+#15605 = PCURVE('',#15290,#15606);
+#15606 = DEFINITIONAL_REPRESENTATION('',(#15607),#15611);
+#15607 = LINE('',#15608,#15609);
+#15608 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#15609 = VECTOR('',#15610,1.);
+#15610 = DIRECTION('',(1.,-6.050792998522E-59));
+#15611 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15612 = PCURVE('',#15349,#15613);
+#15613 = DEFINITIONAL_REPRESENTATION('',(#15614),#15618);
+#15614 = LINE('',#15615,#15616);
+#15615 = CARTESIAN_POINT('',(0.55,0.11125));
+#15616 = VECTOR('',#15617,1.);
+#15617 = DIRECTION('',(0.,-1.));
+#15618 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15619 = ORIENTED_EDGE('',*,*,#15620,.F.);
+#15620 = EDGE_CURVE('',#15621,#15598,#15623,.T.);
+#15621 = VERTEX_POINT('',#15622);
+#15622 = CARTESIAN_POINT('',(-3.175,-8.34,2.285));
+#15623 = SURFACE_CURVE('',#15624,(#15628,#15635),.PCURVE_S1.);
+#15624 = LINE('',#15625,#15626);
+#15625 = CARTESIAN_POINT('',(-3.175,-8.34,2.285));
+#15626 = VECTOR('',#15627,1.);
+#15627 = DIRECTION('',(0.,0.,1.));
+#15628 = PCURVE('',#15290,#15629);
+#15629 = DEFINITIONAL_REPRESENTATION('',(#15630),#15634);
+#15630 = LINE('',#15631,#15632);
+#15631 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#15632 = VECTOR('',#15633,1.);
+#15633 = DIRECTION('',(0.,-1.));
+#15634 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15635 = PCURVE('',#15481,#15636);
+#15636 = DEFINITIONAL_REPRESENTATION('',(#15637),#15641);
+#15637 = LINE('',#15638,#15639);
+#15638 = CARTESIAN_POINT('',(0.,-1.1));
+#15639 = VECTOR('',#15640,1.);
+#15640 = DIRECTION('',(1.,0.));
+#15641 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15642 = ORIENTED_EDGE('',*,*,#15643,.F.);
+#15643 = EDGE_CURVE('',#15644,#15621,#15646,.T.);
+#15644 = VERTEX_POINT('',#15645);
+#15645 = CARTESIAN_POINT('',(-3.6725,-8.34,2.285));
+#15646 = SURFACE_CURVE('',#15647,(#15651,#15658),.PCURVE_S1.);
+#15647 = LINE('',#15648,#15649);
+#15648 = CARTESIAN_POINT('',(-3.6725,-8.34,2.285));
+#15649 = VECTOR('',#15650,1.);
+#15650 = DIRECTION('',(1.,0.,0.));
+#15651 = PCURVE('',#15290,#15652);
+#15652 = DEFINITIONAL_REPRESENTATION('',(#15653),#15657);
+#15653 = LINE('',#15654,#15655);
+#15654 = CARTESIAN_POINT('',(5.227820932134E-02,-0.703971790679));
+#15655 = VECTOR('',#15656,1.);
+#15656 = DIRECTION('',(1.,-6.050792998522E-59));
+#15657 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15658 = PCURVE('',#15455,#15659);
+#15659 = DEFINITIONAL_REPRESENTATION('',(#15660),#15664);
+#15660 = LINE('',#15661,#15662);
+#15661 = CARTESIAN_POINT('',(0.,1.1));
+#15662 = VECTOR('',#15663,1.);
+#15663 = DIRECTION('',(1.,0.));
+#15664 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15665 = ORIENTED_EDGE('',*,*,#15666,.F.);
+#15666 = EDGE_CURVE('',#15667,#15644,#15669,.T.);
+#15667 = VERTEX_POINT('',#15668);
+#15668 = CARTESIAN_POINT('',(-3.6725,-8.34,0.275));
+#15669 = SURFACE_CURVE('',#15670,(#15674,#15681),.PCURVE_S1.);
+#15670 = LINE('',#15671,#15672);
+#15671 = CARTESIAN_POINT('',(-3.6725,-8.34,0.275));
+#15672 = VECTOR('',#15673,1.);
+#15673 = DIRECTION('',(0.,0.,1.));
+#15674 = PCURVE('',#15290,#15675);
+#15675 = DEFINITIONAL_REPRESENTATION('',(#15676),#15680);
+#15676 = LINE('',#15677,#15678);
+#15677 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#15678 = VECTOR('',#15679,1.);
+#15679 = DIRECTION('',(0.,-1.));
+#15680 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15681 = PCURVE('',#15427,#15682);
+#15682 = DEFINITIONAL_REPRESENTATION('',(#15683),#15687);
+#15683 = LINE('',#15684,#15685);
+#15684 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#15685 = VECTOR('',#15686,1.);
+#15686 = DIRECTION('',(0.,1.));
+#15687 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15688 = ORIENTED_EDGE('',*,*,#15689,.T.);
+#15689 = EDGE_CURVE('',#15667,#15247,#15690,.T.);
+#15690 = SURFACE_CURVE('',#15691,(#15695,#15702),.PCURVE_S1.);
+#15691 = LINE('',#15692,#15693);
+#15692 = CARTESIAN_POINT('',(-3.6725,-8.34,0.275));
+#15693 = VECTOR('',#15694,1.);
+#15694 = DIRECTION('',(-1.,0.,0.));
+#15695 = PCURVE('',#15290,#15696);
+#15696 = DEFINITIONAL_REPRESENTATION('',(#15697),#15701);
+#15697 = LINE('',#15698,#15699);
+#15698 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#15699 = VECTOR('',#15700,1.);
+#15700 = DIRECTION('',(-1.,6.050792998522E-59));
+#15701 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15702 = PCURVE('',#15262,#15703);
+#15703 = DEFINITIONAL_REPRESENTATION('',(#15704),#15708);
+#15704 = LINE('',#15705,#15706);
+#15705 = CARTESIAN_POINT('',(0.388908729653,0.));
+#15706 = VECTOR('',#15707,1.);
+#15707 = DIRECTION('',(0.,-1.));
+#15708 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15709 = ADVANCED_FACE('',(#15710),#15178,.T.);
+#15710 = FACE_BOUND('',#15711,.T.);
+#15711 = EDGE_LOOP('',(#15712,#15713,#15714,#15737));
+#15712 = ORIENTED_EDGE('',*,*,#15548,.T.);
+#15713 = ORIENTED_EDGE('',*,*,#15162,.T.);
+#15714 = ORIENTED_EDGE('',*,*,#15715,.F.);
+#15715 = EDGE_CURVE('',#15716,#15163,#15718,.T.);
+#15716 = VERTEX_POINT('',#15717);
+#15717 = CARTESIAN_POINT('',(-3.6725,-9.165,-3.5));
+#15718 = SURFACE_CURVE('',#15719,(#15723,#15730),.PCURVE_S1.);
+#15719 = LINE('',#15720,#15721);
+#15720 = CARTESIAN_POINT('',(-3.6725,-9.165,-3.5));
+#15721 = VECTOR('',#15722,1.);
+#15722 = DIRECTION('',(-1.,0.,0.));
+#15723 = PCURVE('',#15178,#15724);
+#15724 = DEFINITIONAL_REPRESENTATION('',(#15725),#15729);
+#15725 = LINE('',#15726,#15727);
+#15726 = CARTESIAN_POINT('',(3.5,0.));
+#15727 = VECTOR('',#15728,1.);
+#15728 = DIRECTION('',(0.,-1.));
+#15729 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15730 = PCURVE('',#15206,#15731);
+#15731 = DEFINITIONAL_REPRESENTATION('',(#15732),#15736);
+#15732 = LINE('',#15733,#15734);
+#15733 = CARTESIAN_POINT('',(3.330669073875E-16,0.));
+#15734 = VECTOR('',#15735,1.);
+#15735 = DIRECTION('',(0.,-1.));
+#15736 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15737 = ORIENTED_EDGE('',*,*,#15738,.F.);
+#15738 = EDGE_CURVE('',#15549,#15716,#15739,.T.);
+#15739 = SURFACE_CURVE('',#15740,(#15744,#15751),.PCURVE_S1.);
+#15740 = LINE('',#15741,#15742);
+#15741 = CARTESIAN_POINT('',(-3.6725,-9.165,0.));
+#15742 = VECTOR('',#15743,1.);
+#15743 = DIRECTION('',(0.,0.,-1.));
+#15744 = PCURVE('',#15178,#15745);
+#15745 = DEFINITIONAL_REPRESENTATION('',(#15746),#15750);
+#15746 = LINE('',#15747,#15748);
+#15747 = CARTESIAN_POINT('',(0.,0.));
+#15748 = VECTOR('',#15749,1.);
+#15749 = DIRECTION('',(1.,0.));
+#15750 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15751 = PCURVE('',#15427,#15752);
+#15752 = DEFINITIONAL_REPRESENTATION('',(#15753),#15757);
+#15753 = LINE('',#15754,#15755);
+#15754 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#15755 = VECTOR('',#15756,1.);
+#15756 = DIRECTION('',(0.,-1.));
+#15757 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15758 = ADVANCED_FACE('',(#15759),#15262,.T.);
+#15759 = FACE_BOUND('',#15760,.T.);
+#15760 = EDGE_LOOP('',(#15761,#15784,#15785,#15786));
+#15761 = ORIENTED_EDGE('',*,*,#15762,.T.);
+#15762 = EDGE_CURVE('',#15763,#15219,#15765,.T.);
+#15763 = VERTEX_POINT('',#15764);
+#15764 = CARTESIAN_POINT('',(-3.6725,-8.615,0.));
+#15765 = SURFACE_CURVE('',#15766,(#15770,#15777),.PCURVE_S1.);
+#15766 = LINE('',#15767,#15768);
+#15767 = CARTESIAN_POINT('',(-3.6725,-8.615,0.));
+#15768 = VECTOR('',#15769,1.);
+#15769 = DIRECTION('',(-1.,0.,0.));
+#15770 = PCURVE('',#15262,#15771);
+#15771 = DEFINITIONAL_REPRESENTATION('',(#15772),#15776);
+#15772 = LINE('',#15773,#15774);
+#15773 = CARTESIAN_POINT('',(-6.280369834735E-16,0.));
+#15774 = VECTOR('',#15775,1.);
+#15775 = DIRECTION('',(0.,-1.));
+#15776 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15777 = PCURVE('',#15234,#15778);
+#15778 = DEFINITIONAL_REPRESENTATION('',(#15779),#15783);
+#15779 = LINE('',#15780,#15781);
+#15780 = CARTESIAN_POINT('',(3.5,0.));
+#15781 = VECTOR('',#15782,1.);
+#15782 = DIRECTION('',(0.,-1.));
+#15783 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15784 = ORIENTED_EDGE('',*,*,#15246,.T.);
+#15785 = ORIENTED_EDGE('',*,*,#15689,.F.);
+#15786 = ORIENTED_EDGE('',*,*,#15787,.F.);
+#15787 = EDGE_CURVE('',#15763,#15667,#15788,.T.);
+#15788 = SURFACE_CURVE('',#15789,(#15793,#15800),.PCURVE_S1.);
+#15789 = LINE('',#15790,#15791);
+#15790 = CARTESIAN_POINT('',(-3.6725,-8.615,0.));
+#15791 = VECTOR('',#15792,1.);
+#15792 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#15793 = PCURVE('',#15262,#15794);
+#15794 = DEFINITIONAL_REPRESENTATION('',(#15795),#15799);
+#15795 = LINE('',#15796,#15797);
+#15796 = CARTESIAN_POINT('',(0.,0.));
+#15797 = VECTOR('',#15798,1.);
+#15798 = DIRECTION('',(1.,0.));
+#15799 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15800 = PCURVE('',#15427,#15801);
+#15801 = DEFINITIONAL_REPRESENTATION('',(#15802),#15806);
+#15802 = LINE('',#15803,#15804);
+#15803 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#15804 = VECTOR('',#15805,1.);
+#15805 = DIRECTION('',(0.707106781187,0.707106781187));
+#15806 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15807 = ADVANCED_FACE('',(#15808),#15206,.T.);
+#15808 = FACE_BOUND('',#15809,.T.);
+#15809 = EDGE_LOOP('',(#15810,#15811,#15812,#15835));
+#15810 = ORIENTED_EDGE('',*,*,#15715,.T.);
+#15811 = ORIENTED_EDGE('',*,*,#15190,.T.);
+#15812 = ORIENTED_EDGE('',*,*,#15813,.F.);
+#15813 = EDGE_CURVE('',#15814,#15191,#15816,.T.);
+#15814 = VERTEX_POINT('',#15815);
+#15815 = CARTESIAN_POINT('',(-3.6725,-8.615,-3.5));
+#15816 = SURFACE_CURVE('',#15817,(#15821,#15828),.PCURVE_S1.);
+#15817 = LINE('',#15818,#15819);
+#15818 = CARTESIAN_POINT('',(-3.6725,-8.615,-3.5));
+#15819 = VECTOR('',#15820,1.);
+#15820 = DIRECTION('',(-1.,0.,0.));
+#15821 = PCURVE('',#15206,#15822);
+#15822 = DEFINITIONAL_REPRESENTATION('',(#15823),#15827);
+#15823 = LINE('',#15824,#15825);
+#15824 = CARTESIAN_POINT('',(0.55,0.));
+#15825 = VECTOR('',#15826,1.);
+#15826 = DIRECTION('',(0.,-1.));
+#15827 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15828 = PCURVE('',#15234,#15829);
+#15829 = DEFINITIONAL_REPRESENTATION('',(#15830),#15834);
+#15830 = LINE('',#15831,#15832);
+#15831 = CARTESIAN_POINT('',(0.,0.));
+#15832 = VECTOR('',#15833,1.);
+#15833 = DIRECTION('',(0.,-1.));
+#15834 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15835 = ORIENTED_EDGE('',*,*,#15836,.F.);
+#15836 = EDGE_CURVE('',#15716,#15814,#15837,.T.);
+#15837 = SURFACE_CURVE('',#15838,(#15842,#15849),.PCURVE_S1.);
+#15838 = LINE('',#15839,#15840);
+#15839 = CARTESIAN_POINT('',(-3.6725,-9.165,-3.5));
+#15840 = VECTOR('',#15841,1.);
+#15841 = DIRECTION('',(0.,1.,0.));
+#15842 = PCURVE('',#15206,#15843);
+#15843 = DEFINITIONAL_REPRESENTATION('',(#15844),#15848);
+#15844 = LINE('',#15845,#15846);
+#15845 = CARTESIAN_POINT('',(0.,0.));
+#15846 = VECTOR('',#15847,1.);
+#15847 = DIRECTION('',(1.,0.));
+#15848 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15849 = PCURVE('',#15427,#15850);
+#15850 = DEFINITIONAL_REPRESENTATION('',(#15851),#15855);
+#15851 = LINE('',#15852,#15853);
+#15852 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#15853 = VECTOR('',#15854,1.);
+#15854 = DIRECTION('',(1.,-2.226071387182E-62));
+#15855 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15856 = ADVANCED_FACE('',(#15857),#15234,.T.);
+#15857 = FACE_BOUND('',#15858,.T.);
+#15858 = EDGE_LOOP('',(#15859,#15860,#15861,#15862));
+#15859 = ORIENTED_EDGE('',*,*,#15813,.T.);
+#15860 = ORIENTED_EDGE('',*,*,#15218,.T.);
+#15861 = ORIENTED_EDGE('',*,*,#15762,.F.);
+#15862 = ORIENTED_EDGE('',*,*,#15863,.F.);
+#15863 = EDGE_CURVE('',#15814,#15763,#15864,.T.);
+#15864 = SURFACE_CURVE('',#15865,(#15869,#15876),.PCURVE_S1.);
+#15865 = LINE('',#15866,#15867);
+#15866 = CARTESIAN_POINT('',(-3.6725,-8.615,-3.5));
+#15867 = VECTOR('',#15868,1.);
+#15868 = DIRECTION('',(0.,0.,1.));
+#15869 = PCURVE('',#15234,#15870);
+#15870 = DEFINITIONAL_REPRESENTATION('',(#15871),#15875);
+#15871 = LINE('',#15872,#15873);
+#15872 = CARTESIAN_POINT('',(0.,0.));
+#15873 = VECTOR('',#15874,1.);
+#15874 = DIRECTION('',(1.,0.));
+#15875 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15876 = PCURVE('',#15427,#15877);
+#15877 = DEFINITIONAL_REPRESENTATION('',(#15878),#15882);
+#15878 = LINE('',#15879,#15880);
+#15879 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#15880 = VECTOR('',#15881,1.);
+#15881 = DIRECTION('',(0.,1.));
+#15882 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15883 = ADVANCED_FACE('',(#15884),#15349,.T.);
+#15884 = FACE_BOUND('',#15885,.T.);
+#15885 = EDGE_LOOP('',(#15886,#15887,#15908,#15909));
+#15886 = ORIENTED_EDGE('',*,*,#15331,.F.);
+#15887 = ORIENTED_EDGE('',*,*,#15888,.T.);
+#15888 = EDGE_CURVE('',#15332,#15598,#15889,.T.);
+#15889 = SURFACE_CURVE('',#15890,(#15894,#15901),.PCURVE_S1.);
+#15890 = LINE('',#15891,#15892);
+#15891 = CARTESIAN_POINT('',(-3.175,-9.44,2.56));
+#15892 = VECTOR('',#15893,1.);
+#15893 = DIRECTION('',(0.,1.,0.));
+#15894 = PCURVE('',#15349,#15895);
+#15895 = DEFINITIONAL_REPRESENTATION('',(#15896),#15900);
+#15896 = LINE('',#15897,#15898);
+#15897 = CARTESIAN_POINT('',(-0.55,-0.38625));
+#15898 = VECTOR('',#15899,1.);
+#15899 = DIRECTION('',(1.,6.285707653525E-60));
+#15900 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15901 = PCURVE('',#15481,#15902);
+#15902 = DEFINITIONAL_REPRESENTATION('',(#15903),#15907);
+#15903 = LINE('',#15904,#15905);
+#15904 = CARTESIAN_POINT('',(0.275,0.));
+#15905 = VECTOR('',#15906,1.);
+#15906 = DIRECTION('',(0.,-1.));
+#15907 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15908 = ORIENTED_EDGE('',*,*,#15597,.F.);
+#15909 = ORIENTED_EDGE('',*,*,#15520,.T.);
+#15910 = ADVANCED_FACE('',(#15911),#15481,.T.);
+#15911 = FACE_BOUND('',#15912,.T.);
+#15912 = EDGE_LOOP('',(#15913,#15914,#15935,#15936));
+#15913 = ORIENTED_EDGE('',*,*,#15467,.F.);
+#15914 = ORIENTED_EDGE('',*,*,#15915,.T.);
+#15915 = EDGE_CURVE('',#15440,#15621,#15916,.T.);
+#15916 = SURFACE_CURVE('',#15917,(#15921,#15928),.PCURVE_S1.);
+#15917 = LINE('',#15918,#15919);
+#15918 = CARTESIAN_POINT('',(-3.175,-9.44,2.285));
+#15919 = VECTOR('',#15920,1.);
+#15920 = DIRECTION('',(0.,1.,0.));
+#15921 = PCURVE('',#15481,#15922);
+#15922 = DEFINITIONAL_REPRESENTATION('',(#15923),#15927);
+#15923 = LINE('',#15924,#15925);
+#15924 = CARTESIAN_POINT('',(0.,0.));
+#15925 = VECTOR('',#15926,1.);
+#15926 = DIRECTION('',(0.,-1.));
+#15927 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15928 = PCURVE('',#15455,#15929);
+#15929 = DEFINITIONAL_REPRESENTATION('',(#15930),#15934);
+#15930 = LINE('',#15931,#15932);
+#15931 = CARTESIAN_POINT('',(0.4975,0.));
+#15932 = VECTOR('',#15933,1.);
+#15933 = DIRECTION('',(0.,1.));
+#15934 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15935 = ORIENTED_EDGE('',*,*,#15620,.T.);
+#15936 = ORIENTED_EDGE('',*,*,#15888,.F.);
+#15937 = ADVANCED_FACE('',(#15938),#15455,.F.);
+#15938 = FACE_BOUND('',#15939,.F.);
+#15939 = EDGE_LOOP('',(#15940,#15961,#15962,#15963));
+#15940 = ORIENTED_EDGE('',*,*,#15941,.F.);
+#15941 = EDGE_CURVE('',#15412,#15644,#15942,.T.);
+#15942 = SURFACE_CURVE('',#15943,(#15947,#15954),.PCURVE_S1.);
+#15943 = LINE('',#15944,#15945);
+#15944 = CARTESIAN_POINT('',(-3.6725,-9.44,2.285));
+#15945 = VECTOR('',#15946,1.);
+#15946 = DIRECTION('',(0.,1.,0.));
+#15947 = PCURVE('',#15455,#15948);
+#15948 = DEFINITIONAL_REPRESENTATION('',(#15949),#15953);
+#15949 = LINE('',#15950,#15951);
+#15950 = CARTESIAN_POINT('',(0.,0.));
+#15951 = VECTOR('',#15952,1.);
+#15952 = DIRECTION('',(0.,1.));
+#15953 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15954 = PCURVE('',#15427,#15955);
+#15955 = DEFINITIONAL_REPRESENTATION('',(#15956),#15960);
+#15956 = LINE('',#15957,#15958);
+#15957 = CARTESIAN_POINT('',(-0.55,2.62605853382));
+#15958 = VECTOR('',#15959,1.);
+#15959 = DIRECTION('',(1.,-2.226071387182E-62));
+#15960 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#15961 = ORIENTED_EDGE('',*,*,#15439,.T.);
+#15962 = ORIENTED_EDGE('',*,*,#15915,.T.);
+#15963 = ORIENTED_EDGE('',*,*,#15643,.F.);
+#15964 = ADVANCED_FACE('',(#15965),#15427,.T.);
+#15965 = FACE_BOUND('',#15966,.T.);
+#15966 = EDGE_LOOP('',(#15967,#15968,#15969,#15970,#15971,#15972,#15973,
+ #15974));
+#15967 = ORIENTED_EDGE('',*,*,#15666,.T.);
+#15968 = ORIENTED_EDGE('',*,*,#15941,.F.);
+#15969 = ORIENTED_EDGE('',*,*,#15411,.T.);
+#15970 = ORIENTED_EDGE('',*,*,#15571,.T.);
+#15971 = ORIENTED_EDGE('',*,*,#15738,.T.);
+#15972 = ORIENTED_EDGE('',*,*,#15836,.T.);
+#15973 = ORIENTED_EDGE('',*,*,#15863,.T.);
+#15974 = ORIENTED_EDGE('',*,*,#15787,.T.);
+#15975 = MANIFOLD_SOLID_BREP('',#15976);
+#15976 = CLOSED_SHELL('',(#15977,#16209,#16374,#16424,#16473,#16591,
+ #16640,#16689,#16738,#16765,#16792,#16819,#16846));
+#15977 = ADVANCED_FACE('',(#15978),#15992,.F.);
+#15978 = FACE_BOUND('',#15979,.F.);
+#15979 = EDGE_LOOP('',(#15980,#16015,#16043,#16071,#16099,#16127,#16155,
+ #16183));
+#15980 = ORIENTED_EDGE('',*,*,#15981,.T.);
+#15981 = EDGE_CURVE('',#15982,#15984,#15986,.T.);
+#15982 = VERTEX_POINT('',#15983);
+#15983 = CARTESIAN_POINT('',(3.9475,-8.34,2.4225));
+#15984 = VERTEX_POINT('',#15985);
+#15985 = CARTESIAN_POINT('',(3.9475,-8.34,0.275));
+#15986 = SURFACE_CURVE('',#15987,(#15991,#16003),.PCURVE_S1.);
+#15987 = LINE('',#15988,#15989);
+#15988 = CARTESIAN_POINT('',(3.9475,-8.34,2.56));
+#15989 = VECTOR('',#15990,1.);
+#15990 = DIRECTION('',(0.,0.,-1.));
+#15991 = PCURVE('',#15992,#15997);
+#15992 = PLANE('',#15993);
+#15993 = AXIS2_PLACEMENT_3D('',#15994,#15995,#15996);
+#15994 = CARTESIAN_POINT('',(3.9475,-8.89,-0.34105853382));
+#15995 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#15996 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#15997 = DEFINITIONAL_REPRESENTATION('',(#15998),#16002);
+#15998 = LINE('',#15999,#16000);
+#15999 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#16000 = VECTOR('',#16001,1.);
+#16001 = DIRECTION('',(0.,-1.));
+#16002 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16003 = PCURVE('',#16004,#16009);
+#16004 = PLANE('',#16005);
+#16005 = AXIS2_PLACEMENT_3D('',#16006,#16007,#16008);
+#16006 = CARTESIAN_POINT('',(3.724778209321,-8.34,1.581028209321));
+#16007 = DIRECTION('',(3.17453643318E-29,1.,2.111838454822E-30));
+#16008 = DIRECTION('',(1.,-3.17453643318E-29,0.));
+#16009 = DEFINITIONAL_REPRESENTATION('',(#16010),#16014);
+#16010 = LINE('',#16011,#16012);
+#16011 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#16012 = VECTOR('',#16013,1.);
+#16013 = DIRECTION('',(0.,1.));
+#16014 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16015 = ORIENTED_EDGE('',*,*,#16016,.T.);
+#16016 = EDGE_CURVE('',#15984,#16017,#16019,.T.);
+#16017 = VERTEX_POINT('',#16018);
+#16018 = CARTESIAN_POINT('',(3.9475,-8.615,0.));
+#16019 = SURFACE_CURVE('',#16020,(#16024,#16031),.PCURVE_S1.);
+#16020 = LINE('',#16021,#16022);
+#16021 = CARTESIAN_POINT('',(3.9475,-8.34,0.275));
+#16022 = VECTOR('',#16023,1.);
+#16023 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#16024 = PCURVE('',#15992,#16025);
+#16025 = DEFINITIONAL_REPRESENTATION('',(#16026),#16030);
+#16026 = LINE('',#16027,#16028);
+#16027 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#16028 = VECTOR('',#16029,1.);
+#16029 = DIRECTION('',(0.707106781187,-0.707106781187));
+#16030 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16031 = PCURVE('',#16032,#16037);
+#16032 = PLANE('',#16033);
+#16033 = AXIS2_PLACEMENT_3D('',#16034,#16035,#16036);
+#16034 = CARTESIAN_POINT('',(3.6725,-8.34,0.275));
+#16035 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#16036 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#16037 = DEFINITIONAL_REPRESENTATION('',(#16038),#16042);
+#16038 = LINE('',#16039,#16040);
+#16039 = CARTESIAN_POINT('',(0.,-0.275));
+#16040 = VECTOR('',#16041,1.);
+#16041 = DIRECTION('',(1.,0.));
+#16042 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16043 = ORIENTED_EDGE('',*,*,#16044,.T.);
+#16044 = EDGE_CURVE('',#16017,#16045,#16047,.T.);
+#16045 = VERTEX_POINT('',#16046);
+#16046 = CARTESIAN_POINT('',(3.9475,-8.615,-3.5));
+#16047 = SURFACE_CURVE('',#16048,(#16052,#16059),.PCURVE_S1.);
+#16048 = LINE('',#16049,#16050);
+#16049 = CARTESIAN_POINT('',(3.9475,-8.615,0.));
+#16050 = VECTOR('',#16051,1.);
+#16051 = DIRECTION('',(0.,0.,-1.));
+#16052 = PCURVE('',#15992,#16053);
+#16053 = DEFINITIONAL_REPRESENTATION('',(#16054),#16058);
+#16054 = LINE('',#16055,#16056);
+#16055 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#16056 = VECTOR('',#16057,1.);
+#16057 = DIRECTION('',(0.,-1.));
+#16058 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16059 = PCURVE('',#16060,#16065);
+#16060 = PLANE('',#16061);
+#16061 = AXIS2_PLACEMENT_3D('',#16062,#16063,#16064);
+#16062 = CARTESIAN_POINT('',(3.6725,-8.615,0.));
+#16063 = DIRECTION('',(0.,1.,0.));
+#16064 = DIRECTION('',(0.,0.,-1.));
+#16065 = DEFINITIONAL_REPRESENTATION('',(#16066),#16070);
+#16066 = LINE('',#16067,#16068);
+#16067 = CARTESIAN_POINT('',(0.,-0.275));
+#16068 = VECTOR('',#16069,1.);
+#16069 = DIRECTION('',(1.,0.));
+#16070 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16071 = ORIENTED_EDGE('',*,*,#16072,.T.);
+#16072 = EDGE_CURVE('',#16045,#16073,#16075,.T.);
+#16073 = VERTEX_POINT('',#16074);
+#16074 = CARTESIAN_POINT('',(3.9475,-9.165,-3.5));
+#16075 = SURFACE_CURVE('',#16076,(#16080,#16087),.PCURVE_S1.);
+#16076 = LINE('',#16077,#16078);
+#16077 = CARTESIAN_POINT('',(3.9475,-8.615,-3.5));
+#16078 = VECTOR('',#16079,1.);
+#16079 = DIRECTION('',(0.,-1.,0.));
+#16080 = PCURVE('',#15992,#16081);
+#16081 = DEFINITIONAL_REPRESENTATION('',(#16082),#16086);
+#16082 = LINE('',#16083,#16084);
+#16083 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#16084 = VECTOR('',#16085,1.);
+#16085 = DIRECTION('',(1.,2.226071387182E-62));
+#16086 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16087 = PCURVE('',#16088,#16093);
+#16088 = PLANE('',#16089);
+#16089 = AXIS2_PLACEMENT_3D('',#16090,#16091,#16092);
+#16090 = CARTESIAN_POINT('',(3.6725,-8.615,-3.5));
+#16091 = DIRECTION('',(0.,0.,-1.));
+#16092 = DIRECTION('',(0.,-1.,0.));
+#16093 = DEFINITIONAL_REPRESENTATION('',(#16094),#16098);
+#16094 = LINE('',#16095,#16096);
+#16095 = CARTESIAN_POINT('',(0.,-0.275));
+#16096 = VECTOR('',#16097,1.);
+#16097 = DIRECTION('',(1.,0.));
+#16098 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16099 = ORIENTED_EDGE('',*,*,#16100,.T.);
+#16100 = EDGE_CURVE('',#16073,#16101,#16103,.T.);
+#16101 = VERTEX_POINT('',#16102);
+#16102 = CARTESIAN_POINT('',(3.9475,-9.165,0.));
+#16103 = SURFACE_CURVE('',#16104,(#16108,#16115),.PCURVE_S1.);
+#16104 = LINE('',#16105,#16106);
+#16105 = CARTESIAN_POINT('',(3.9475,-9.165,-3.5));
+#16106 = VECTOR('',#16107,1.);
+#16107 = DIRECTION('',(0.,0.,1.));
+#16108 = PCURVE('',#15992,#16109);
+#16109 = DEFINITIONAL_REPRESENTATION('',(#16110),#16114);
+#16110 = LINE('',#16111,#16112);
+#16111 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#16112 = VECTOR('',#16113,1.);
+#16113 = DIRECTION('',(0.,1.));
+#16114 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16115 = PCURVE('',#16116,#16121);
+#16116 = PLANE('',#16117);
+#16117 = AXIS2_PLACEMENT_3D('',#16118,#16119,#16120);
+#16118 = CARTESIAN_POINT('',(3.6725,-9.165,-3.5));
+#16119 = DIRECTION('',(0.,-1.,0.));
+#16120 = DIRECTION('',(0.,0.,1.));
+#16121 = DEFINITIONAL_REPRESENTATION('',(#16122),#16126);
+#16122 = LINE('',#16123,#16124);
+#16123 = CARTESIAN_POINT('',(0.,-0.275));
+#16124 = VECTOR('',#16125,1.);
+#16125 = DIRECTION('',(1.,0.));
+#16126 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16127 = ORIENTED_EDGE('',*,*,#16128,.T.);
+#16128 = EDGE_CURVE('',#16101,#16129,#16131,.T.);
+#16129 = VERTEX_POINT('',#16130);
+#16130 = CARTESIAN_POINT('',(3.9475,-9.44,0.275));
+#16131 = SURFACE_CURVE('',#16132,(#16136,#16143),.PCURVE_S1.);
+#16132 = LINE('',#16133,#16134);
+#16133 = CARTESIAN_POINT('',(3.9475,-9.165,0.));
+#16134 = VECTOR('',#16135,1.);
+#16135 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#16136 = PCURVE('',#15992,#16137);
+#16137 = DEFINITIONAL_REPRESENTATION('',(#16138),#16142);
+#16138 = LINE('',#16139,#16140);
+#16139 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#16140 = VECTOR('',#16141,1.);
+#16141 = DIRECTION('',(0.707106781187,0.707106781187));
+#16142 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16143 = PCURVE('',#16144,#16149);
+#16144 = PLANE('',#16145);
+#16145 = AXIS2_PLACEMENT_3D('',#16146,#16147,#16148);
+#16146 = CARTESIAN_POINT('',(3.6725,-9.165,0.));
+#16147 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#16148 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#16149 = DEFINITIONAL_REPRESENTATION('',(#16150),#16154);
+#16150 = LINE('',#16151,#16152);
+#16151 = CARTESIAN_POINT('',(0.,-0.275));
+#16152 = VECTOR('',#16153,1.);
+#16153 = DIRECTION('',(1.,0.));
+#16154 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16155 = ORIENTED_EDGE('',*,*,#16156,.T.);
+#16156 = EDGE_CURVE('',#16129,#16157,#16159,.T.);
+#16157 = VERTEX_POINT('',#16158);
+#16158 = CARTESIAN_POINT('',(3.9475,-9.44,2.4225));
+#16159 = SURFACE_CURVE('',#16160,(#16164,#16171),.PCURVE_S1.);
+#16160 = LINE('',#16161,#16162);
+#16161 = CARTESIAN_POINT('',(3.9475,-9.44,0.275));
+#16162 = VECTOR('',#16163,1.);
+#16163 = DIRECTION('',(0.,0.,1.));
+#16164 = PCURVE('',#15992,#16165);
+#16165 = DEFINITIONAL_REPRESENTATION('',(#16166),#16170);
+#16166 = LINE('',#16167,#16168);
+#16167 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#16168 = VECTOR('',#16169,1.);
+#16169 = DIRECTION('',(0.,1.));
+#16170 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16171 = PCURVE('',#16172,#16177);
+#16172 = PLANE('',#16173);
+#16173 = AXIS2_PLACEMENT_3D('',#16174,#16175,#16176);
+#16174 = CARTESIAN_POINT('',(3.724778209321,-9.44,1.581028209321));
+#16175 = DIRECTION('',(1.308440111004E-29,-1.,1.156108129756E-30));
+#16176 = DIRECTION('',(-1.,-1.308440111004E-29,0.));
+#16177 = DEFINITIONAL_REPRESENTATION('',(#16178),#16182);
+#16178 = LINE('',#16179,#16180);
+#16179 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#16180 = VECTOR('',#16181,1.);
+#16181 = DIRECTION('',(0.,-1.));
+#16182 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16183 = ORIENTED_EDGE('',*,*,#16184,.T.);
+#16184 = EDGE_CURVE('',#16157,#15982,#16185,.T.);
+#16185 = SURFACE_CURVE('',#16186,(#16190,#16197),.PCURVE_S1.);
+#16186 = LINE('',#16187,#16188);
+#16187 = CARTESIAN_POINT('',(3.9475,-9.44,2.4225));
+#16188 = VECTOR('',#16189,1.);
+#16189 = DIRECTION('',(0.,1.,0.));
+#16190 = PCURVE('',#15992,#16191);
+#16191 = DEFINITIONAL_REPRESENTATION('',(#16192),#16196);
+#16192 = LINE('',#16193,#16194);
+#16193 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#16194 = VECTOR('',#16195,1.);
+#16195 = DIRECTION('',(-1.,-2.226071387182E-62));
+#16196 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16197 = PCURVE('',#16198,#16203);
+#16198 = CYLINDRICAL_SURFACE('',#16199,0.1375);
+#16199 = AXIS2_PLACEMENT_3D('',#16200,#16201,#16202);
+#16200 = CARTESIAN_POINT('',(3.81,-9.44,2.4225));
+#16201 = DIRECTION('',(0.,1.,0.));
+#16202 = DIRECTION('',(1.,0.,-9.8088568672E-33));
+#16203 = DEFINITIONAL_REPRESENTATION('',(#16204),#16208);
+#16204 = LINE('',#16205,#16206);
+#16205 = CARTESIAN_POINT('',(-0.,0.));
+#16206 = VECTOR('',#16207,1.);
+#16207 = DIRECTION('',(-0.,1.));
+#16208 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16209 = ADVANCED_FACE('',(#16210),#16004,.T.);
+#16210 = FACE_BOUND('',#16211,.T.);
+#16211 = EDGE_LOOP('',(#16212,#16242,#16268,#16269,#16292,#16320,#16348)
+ );
+#16212 = ORIENTED_EDGE('',*,*,#16213,.T.);
+#16213 = EDGE_CURVE('',#16214,#16216,#16218,.T.);
+#16214 = VERTEX_POINT('',#16215);
+#16215 = CARTESIAN_POINT('',(3.175,-8.34,2.56));
+#16216 = VERTEX_POINT('',#16217);
+#16217 = CARTESIAN_POINT('',(3.81,-8.34,2.56));
+#16218 = SURFACE_CURVE('',#16219,(#16223,#16230),.PCURVE_S1.);
+#16219 = LINE('',#16220,#16221);
+#16220 = CARTESIAN_POINT('',(3.6725,-8.34,2.56));
+#16221 = VECTOR('',#16222,1.);
+#16222 = DIRECTION('',(1.,0.,0.));
+#16223 = PCURVE('',#16004,#16224);
+#16224 = DEFINITIONAL_REPRESENTATION('',(#16225),#16229);
+#16225 = LINE('',#16226,#16227);
+#16226 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#16227 = VECTOR('',#16228,1.);
+#16228 = DIRECTION('',(1.,6.704108115824E-59));
+#16229 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16230 = PCURVE('',#16231,#16236);
+#16231 = PLANE('',#16232);
+#16232 = AXIS2_PLACEMENT_3D('',#16233,#16234,#16235);
+#16233 = CARTESIAN_POINT('',(3.56125,-8.89,2.56));
+#16234 = DIRECTION('',(-1.657312278749E-30,-1.304555144269E-30,1.));
+#16235 = DIRECTION('',(1.,0.,1.657312278749E-30));
+#16236 = DEFINITIONAL_REPRESENTATION('',(#16237),#16241);
+#16237 = LINE('',#16238,#16239);
+#16238 = CARTESIAN_POINT('',(0.11125,0.55));
+#16239 = VECTOR('',#16240,1.);
+#16240 = DIRECTION('',(1.,-2.162055258902E-60));
+#16241 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16242 = ORIENTED_EDGE('',*,*,#16243,.F.);
+#16243 = EDGE_CURVE('',#15982,#16216,#16244,.T.);
+#16244 = SURFACE_CURVE('',#16245,(#16250,#16261),.PCURVE_S1.);
+#16245 = CIRCLE('',#16246,0.1375);
+#16246 = AXIS2_PLACEMENT_3D('',#16247,#16248,#16249);
+#16247 = CARTESIAN_POINT('',(3.81,-8.34,2.4225));
+#16248 = DIRECTION('',(0.,-1.,0.));
+#16249 = DIRECTION('',(0.,0.,1.));
+#16250 = PCURVE('',#16004,#16251);
+#16251 = DEFINITIONAL_REPRESENTATION('',(#16252),#16260);
+#16252 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#16253,#16254,#16255,#16256
+ ,#16257,#16258,#16259),.UNSPECIFIED.,.F.,.F.)
+B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),(-2.094395102393,0.,
+ 2.094395102393,4.188790204786,6.28318530718,8.377580409573),
+.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM()
+RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM(
+ '') );
+#16253 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#16254 = CARTESIAN_POINT('',(-0.152935195362,-0.978971790679));
+#16255 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.772721790679));
+#16256 = CARTESIAN_POINT('',(8.522179067866E-02,-0.566471790679));
+#16257 = CARTESIAN_POINT('',(0.204300283699,-0.772721790679));
+#16258 = CARTESIAN_POINT('',(0.323378776719,-0.978971790679));
+#16259 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#16260 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16261 = PCURVE('',#16198,#16262);
+#16262 = DEFINITIONAL_REPRESENTATION('',(#16263),#16267);
+#16263 = LINE('',#16264,#16265);
+#16264 = CARTESIAN_POINT('',(4.712388980385,1.1));
+#16265 = VECTOR('',#16266,1.);
+#16266 = DIRECTION('',(-1.,0.));
+#16267 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16268 = ORIENTED_EDGE('',*,*,#15981,.T.);
+#16269 = ORIENTED_EDGE('',*,*,#16270,.F.);
+#16270 = EDGE_CURVE('',#16271,#15984,#16273,.T.);
+#16271 = VERTEX_POINT('',#16272);
+#16272 = CARTESIAN_POINT('',(3.6725,-8.34,0.275));
+#16273 = SURFACE_CURVE('',#16274,(#16278,#16285),.PCURVE_S1.);
+#16274 = LINE('',#16275,#16276);
+#16275 = CARTESIAN_POINT('',(3.6725,-8.34,0.275));
+#16276 = VECTOR('',#16277,1.);
+#16277 = DIRECTION('',(1.,0.,0.));
+#16278 = PCURVE('',#16004,#16279);
+#16279 = DEFINITIONAL_REPRESENTATION('',(#16280),#16284);
+#16280 = LINE('',#16281,#16282);
+#16281 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#16282 = VECTOR('',#16283,1.);
+#16283 = DIRECTION('',(1.,6.704108115824E-59));
+#16284 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16285 = PCURVE('',#16032,#16286);
+#16286 = DEFINITIONAL_REPRESENTATION('',(#16287),#16291);
+#16287 = LINE('',#16288,#16289);
+#16288 = CARTESIAN_POINT('',(4.710277376051E-16,0.));
+#16289 = VECTOR('',#16290,1.);
+#16290 = DIRECTION('',(0.,-1.));
+#16291 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16292 = ORIENTED_EDGE('',*,*,#16293,.F.);
+#16293 = EDGE_CURVE('',#16294,#16271,#16296,.T.);
+#16294 = VERTEX_POINT('',#16295);
+#16295 = CARTESIAN_POINT('',(3.6725,-8.34,2.285));
+#16296 = SURFACE_CURVE('',#16297,(#16301,#16308),.PCURVE_S1.);
+#16297 = LINE('',#16298,#16299);
+#16298 = CARTESIAN_POINT('',(3.6725,-8.34,2.56));
+#16299 = VECTOR('',#16300,1.);
+#16300 = DIRECTION('',(0.,0.,-1.));
+#16301 = PCURVE('',#16004,#16302);
+#16302 = DEFINITIONAL_REPRESENTATION('',(#16303),#16307);
+#16303 = LINE('',#16304,#16305);
+#16304 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#16305 = VECTOR('',#16306,1.);
+#16306 = DIRECTION('',(0.,1.));
+#16307 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16308 = PCURVE('',#16309,#16314);
+#16309 = PLANE('',#16310);
+#16310 = AXIS2_PLACEMENT_3D('',#16311,#16312,#16313);
+#16311 = CARTESIAN_POINT('',(3.6725,-8.89,-0.34105853382));
+#16312 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#16313 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#16314 = DEFINITIONAL_REPRESENTATION('',(#16315),#16319);
+#16315 = LINE('',#16316,#16317);
+#16316 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#16317 = VECTOR('',#16318,1.);
+#16318 = DIRECTION('',(0.,-1.));
+#16319 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16320 = ORIENTED_EDGE('',*,*,#16321,.F.);
+#16321 = EDGE_CURVE('',#16322,#16294,#16324,.T.);
+#16322 = VERTEX_POINT('',#16323);
+#16323 = CARTESIAN_POINT('',(3.175,-8.34,2.285));
+#16324 = SURFACE_CURVE('',#16325,(#16329,#16336),.PCURVE_S1.);
+#16325 = LINE('',#16326,#16327);
+#16326 = CARTESIAN_POINT('',(3.175,-8.34,2.285));
+#16327 = VECTOR('',#16328,1.);
+#16328 = DIRECTION('',(1.,0.,0.));
+#16329 = PCURVE('',#16004,#16330);
+#16330 = DEFINITIONAL_REPRESENTATION('',(#16331),#16335);
+#16331 = LINE('',#16332,#16333);
+#16332 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#16333 = VECTOR('',#16334,1.);
+#16334 = DIRECTION('',(1.,6.704108115824E-59));
+#16335 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16336 = PCURVE('',#16337,#16342);
+#16337 = PLANE('',#16338);
+#16338 = AXIS2_PLACEMENT_3D('',#16339,#16340,#16341);
+#16339 = CARTESIAN_POINT('',(3.175,-9.44,2.285));
+#16340 = DIRECTION('',(0.,0.,1.));
+#16341 = DIRECTION('',(1.,0.,0.));
+#16342 = DEFINITIONAL_REPRESENTATION('',(#16343),#16347);
+#16343 = LINE('',#16344,#16345);
+#16344 = CARTESIAN_POINT('',(0.,1.1));
+#16345 = VECTOR('',#16346,1.);
+#16346 = DIRECTION('',(1.,0.));
+#16347 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16348 = ORIENTED_EDGE('',*,*,#16349,.T.);
+#16349 = EDGE_CURVE('',#16322,#16214,#16350,.T.);
+#16350 = SURFACE_CURVE('',#16351,(#16355,#16362),.PCURVE_S1.);
+#16351 = LINE('',#16352,#16353);
+#16352 = CARTESIAN_POINT('',(3.175,-8.34,2.285));
+#16353 = VECTOR('',#16354,1.);
+#16354 = DIRECTION('',(0.,0.,1.));
+#16355 = PCURVE('',#16004,#16356);
+#16356 = DEFINITIONAL_REPRESENTATION('',(#16357),#16361);
+#16357 = LINE('',#16358,#16359);
+#16358 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#16359 = VECTOR('',#16360,1.);
+#16360 = DIRECTION('',(0.,-1.));
+#16361 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16362 = PCURVE('',#16363,#16368);
+#16363 = PLANE('',#16364);
+#16364 = AXIS2_PLACEMENT_3D('',#16365,#16366,#16367);
+#16365 = CARTESIAN_POINT('',(3.175,-9.44,2.285));
+#16366 = DIRECTION('',(1.,0.,0.));
+#16367 = DIRECTION('',(0.,0.,1.));
+#16368 = DEFINITIONAL_REPRESENTATION('',(#16369),#16373);
+#16369 = LINE('',#16370,#16371);
+#16370 = CARTESIAN_POINT('',(0.,-1.1));
+#16371 = VECTOR('',#16372,1.);
+#16372 = DIRECTION('',(1.,0.));
+#16373 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16374 = ADVANCED_FACE('',(#16375),#16198,.T.);
+#16375 = FACE_BOUND('',#16376,.F.);
+#16376 = EDGE_LOOP('',(#16377,#16401,#16422,#16423));
+#16377 = ORIENTED_EDGE('',*,*,#16378,.T.);
+#16378 = EDGE_CURVE('',#16157,#16379,#16381,.T.);
+#16379 = VERTEX_POINT('',#16380);
+#16380 = CARTESIAN_POINT('',(3.81,-9.44,2.56));
+#16381 = SURFACE_CURVE('',#16382,(#16387,#16394),.PCURVE_S1.);
+#16382 = CIRCLE('',#16383,0.1375);
+#16383 = AXIS2_PLACEMENT_3D('',#16384,#16385,#16386);
+#16384 = CARTESIAN_POINT('',(3.81,-9.44,2.4225));
+#16385 = DIRECTION('',(0.,-1.,0.));
+#16386 = DIRECTION('',(0.,0.,1.));
+#16387 = PCURVE('',#16198,#16388);
+#16388 = DEFINITIONAL_REPRESENTATION('',(#16389),#16393);
+#16389 = LINE('',#16390,#16391);
+#16390 = CARTESIAN_POINT('',(4.712388980385,-1.7763568394E-15));
+#16391 = VECTOR('',#16392,1.);
+#16392 = DIRECTION('',(-1.,0.));
+#16393 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16394 = PCURVE('',#16172,#16395);
+#16395 = DEFINITIONAL_REPRESENTATION('',(#16396),#16400);
+#16396 = CIRCLE('',#16397,0.1375);
+#16397 = AXIS2_PLACEMENT_2D('',#16398,#16399);
+#16398 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#16399 = DIRECTION('',(0.,-1.));
+#16400 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16401 = ORIENTED_EDGE('',*,*,#16402,.T.);
+#16402 = EDGE_CURVE('',#16379,#16216,#16403,.T.);
+#16403 = SURFACE_CURVE('',#16404,(#16408,#16415),.PCURVE_S1.);
+#16404 = LINE('',#16405,#16406);
+#16405 = CARTESIAN_POINT('',(3.81,-9.44,2.56));
+#16406 = VECTOR('',#16407,1.);
+#16407 = DIRECTION('',(0.,1.,0.));
+#16408 = PCURVE('',#16198,#16409);
+#16409 = DEFINITIONAL_REPRESENTATION('',(#16410),#16414);
+#16410 = LINE('',#16411,#16412);
+#16411 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#16412 = VECTOR('',#16413,1.);
+#16413 = DIRECTION('',(-0.,1.));
+#16414 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16415 = PCURVE('',#16231,#16416);
+#16416 = DEFINITIONAL_REPRESENTATION('',(#16417),#16421);
+#16417 = LINE('',#16418,#16419);
+#16418 = CARTESIAN_POINT('',(0.24875,-0.55));
+#16419 = VECTOR('',#16420,1.);
+#16420 = DIRECTION('',(0.,1.));
+#16421 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16422 = ORIENTED_EDGE('',*,*,#16243,.F.);
+#16423 = ORIENTED_EDGE('',*,*,#16184,.F.);
+#16424 = ADVANCED_FACE('',(#16425),#16032,.T.);
+#16425 = FACE_BOUND('',#16426,.T.);
+#16426 = EDGE_LOOP('',(#16427,#16428,#16429,#16452));
+#16427 = ORIENTED_EDGE('',*,*,#16270,.T.);
+#16428 = ORIENTED_EDGE('',*,*,#16016,.T.);
+#16429 = ORIENTED_EDGE('',*,*,#16430,.F.);
+#16430 = EDGE_CURVE('',#16431,#16017,#16433,.T.);
+#16431 = VERTEX_POINT('',#16432);
+#16432 = CARTESIAN_POINT('',(3.6725,-8.615,0.));
+#16433 = SURFACE_CURVE('',#16434,(#16438,#16445),.PCURVE_S1.);
+#16434 = LINE('',#16435,#16436);
+#16435 = CARTESIAN_POINT('',(3.6725,-8.615,0.));
+#16436 = VECTOR('',#16437,1.);
+#16437 = DIRECTION('',(1.,0.,0.));
+#16438 = PCURVE('',#16032,#16439);
+#16439 = DEFINITIONAL_REPRESENTATION('',(#16440),#16444);
+#16440 = LINE('',#16441,#16442);
+#16441 = CARTESIAN_POINT('',(0.388908729653,0.));
+#16442 = VECTOR('',#16443,1.);
+#16443 = DIRECTION('',(0.,-1.));
+#16444 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16445 = PCURVE('',#16060,#16446);
+#16446 = DEFINITIONAL_REPRESENTATION('',(#16447),#16451);
+#16447 = LINE('',#16448,#16449);
+#16448 = CARTESIAN_POINT('',(0.,0.));
+#16449 = VECTOR('',#16450,1.);
+#16450 = DIRECTION('',(0.,-1.));
+#16451 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16452 = ORIENTED_EDGE('',*,*,#16453,.F.);
+#16453 = EDGE_CURVE('',#16271,#16431,#16454,.T.);
+#16454 = SURFACE_CURVE('',#16455,(#16459,#16466),.PCURVE_S1.);
+#16455 = LINE('',#16456,#16457);
+#16456 = CARTESIAN_POINT('',(3.6725,-8.34,0.275));
+#16457 = VECTOR('',#16458,1.);
+#16458 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#16459 = PCURVE('',#16032,#16460);
+#16460 = DEFINITIONAL_REPRESENTATION('',(#16461),#16465);
+#16461 = LINE('',#16462,#16463);
+#16462 = CARTESIAN_POINT('',(0.,0.));
+#16463 = VECTOR('',#16464,1.);
+#16464 = DIRECTION('',(1.,0.));
+#16465 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16466 = PCURVE('',#16309,#16467);
+#16467 = DEFINITIONAL_REPRESENTATION('',(#16468),#16472);
+#16468 = LINE('',#16469,#16470);
+#16469 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#16470 = VECTOR('',#16471,1.);
+#16471 = DIRECTION('',(0.707106781187,-0.707106781187));
+#16472 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16473 = ADVANCED_FACE('',(#16474),#16172,.T.);
+#16474 = FACE_BOUND('',#16475,.T.);
+#16475 = EDGE_LOOP('',(#16476,#16477,#16478,#16501,#16524,#16547,#16570)
+ );
+#16476 = ORIENTED_EDGE('',*,*,#16156,.T.);
+#16477 = ORIENTED_EDGE('',*,*,#16378,.T.);
+#16478 = ORIENTED_EDGE('',*,*,#16479,.F.);
+#16479 = EDGE_CURVE('',#16480,#16379,#16482,.T.);
+#16480 = VERTEX_POINT('',#16481);
+#16481 = CARTESIAN_POINT('',(3.175,-9.44,2.56));
+#16482 = SURFACE_CURVE('',#16483,(#16487,#16494),.PCURVE_S1.);
+#16483 = LINE('',#16484,#16485);
+#16484 = CARTESIAN_POINT('',(3.6725,-9.44,2.56));
+#16485 = VECTOR('',#16486,1.);
+#16486 = DIRECTION('',(1.,0.,0.));
+#16487 = PCURVE('',#16172,#16488);
+#16488 = DEFINITIONAL_REPRESENTATION('',(#16489),#16493);
+#16489 = LINE('',#16490,#16491);
+#16490 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#16491 = VECTOR('',#16492,1.);
+#16492 = DIRECTION('',(-1.,1.51269824963E-59));
+#16493 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16494 = PCURVE('',#16231,#16495);
+#16495 = DEFINITIONAL_REPRESENTATION('',(#16496),#16500);
+#16496 = LINE('',#16497,#16498);
+#16497 = CARTESIAN_POINT('',(0.11125,-0.55));
+#16498 = VECTOR('',#16499,1.);
+#16499 = DIRECTION('',(1.,-2.162055258902E-60));
+#16500 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16501 = ORIENTED_EDGE('',*,*,#16502,.F.);
+#16502 = EDGE_CURVE('',#16503,#16480,#16505,.T.);
+#16503 = VERTEX_POINT('',#16504);
+#16504 = CARTESIAN_POINT('',(3.175,-9.44,2.285));
+#16505 = SURFACE_CURVE('',#16506,(#16510,#16517),.PCURVE_S1.);
+#16506 = LINE('',#16507,#16508);
+#16507 = CARTESIAN_POINT('',(3.175,-9.44,2.285));
+#16508 = VECTOR('',#16509,1.);
+#16509 = DIRECTION('',(0.,0.,1.));
+#16510 = PCURVE('',#16172,#16511);
+#16511 = DEFINITIONAL_REPRESENTATION('',(#16512),#16516);
+#16512 = LINE('',#16513,#16514);
+#16513 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#16514 = VECTOR('',#16515,1.);
+#16515 = DIRECTION('',(0.,-1.));
+#16516 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16517 = PCURVE('',#16363,#16518);
+#16518 = DEFINITIONAL_REPRESENTATION('',(#16519),#16523);
+#16519 = LINE('',#16520,#16521);
+#16520 = CARTESIAN_POINT('',(0.,0.));
+#16521 = VECTOR('',#16522,1.);
+#16522 = DIRECTION('',(1.,0.));
+#16523 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16524 = ORIENTED_EDGE('',*,*,#16525,.T.);
+#16525 = EDGE_CURVE('',#16503,#16526,#16528,.T.);
+#16526 = VERTEX_POINT('',#16527);
+#16527 = CARTESIAN_POINT('',(3.6725,-9.44,2.285));
+#16528 = SURFACE_CURVE('',#16529,(#16533,#16540),.PCURVE_S1.);
+#16529 = LINE('',#16530,#16531);
+#16530 = CARTESIAN_POINT('',(3.175,-9.44,2.285));
+#16531 = VECTOR('',#16532,1.);
+#16532 = DIRECTION('',(1.,0.,0.));
+#16533 = PCURVE('',#16172,#16534);
+#16534 = DEFINITIONAL_REPRESENTATION('',(#16535),#16539);
+#16535 = LINE('',#16536,#16537);
+#16536 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#16537 = VECTOR('',#16538,1.);
+#16538 = DIRECTION('',(-1.,1.51269824963E-59));
+#16539 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16540 = PCURVE('',#16337,#16541);
+#16541 = DEFINITIONAL_REPRESENTATION('',(#16542),#16546);
+#16542 = LINE('',#16543,#16544);
+#16543 = CARTESIAN_POINT('',(0.,0.));
+#16544 = VECTOR('',#16545,1.);
+#16545 = DIRECTION('',(1.,0.));
+#16546 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16547 = ORIENTED_EDGE('',*,*,#16548,.F.);
+#16548 = EDGE_CURVE('',#16549,#16526,#16551,.T.);
+#16549 = VERTEX_POINT('',#16550);
+#16550 = CARTESIAN_POINT('',(3.6725,-9.44,0.275));
+#16551 = SURFACE_CURVE('',#16552,(#16556,#16563),.PCURVE_S1.);
+#16552 = LINE('',#16553,#16554);
+#16553 = CARTESIAN_POINT('',(3.6725,-9.44,0.275));
+#16554 = VECTOR('',#16555,1.);
+#16555 = DIRECTION('',(0.,0.,1.));
+#16556 = PCURVE('',#16172,#16557);
+#16557 = DEFINITIONAL_REPRESENTATION('',(#16558),#16562);
+#16558 = LINE('',#16559,#16560);
+#16559 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#16560 = VECTOR('',#16561,1.);
+#16561 = DIRECTION('',(0.,-1.));
+#16562 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16563 = PCURVE('',#16309,#16564);
+#16564 = DEFINITIONAL_REPRESENTATION('',(#16565),#16569);
+#16565 = LINE('',#16566,#16567);
+#16566 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#16567 = VECTOR('',#16568,1.);
+#16568 = DIRECTION('',(0.,1.));
+#16569 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16570 = ORIENTED_EDGE('',*,*,#16571,.T.);
+#16571 = EDGE_CURVE('',#16549,#16129,#16572,.T.);
+#16572 = SURFACE_CURVE('',#16573,(#16577,#16584),.PCURVE_S1.);
+#16573 = LINE('',#16574,#16575);
+#16574 = CARTESIAN_POINT('',(3.6725,-9.44,0.275));
+#16575 = VECTOR('',#16576,1.);
+#16576 = DIRECTION('',(1.,0.,0.));
+#16577 = PCURVE('',#16172,#16578);
+#16578 = DEFINITIONAL_REPRESENTATION('',(#16579),#16583);
+#16579 = LINE('',#16580,#16581);
+#16580 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#16581 = VECTOR('',#16582,1.);
+#16582 = DIRECTION('',(-1.,1.51269824963E-59));
+#16583 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16584 = PCURVE('',#16144,#16585);
+#16585 = DEFINITIONAL_REPRESENTATION('',(#16586),#16590);
+#16586 = LINE('',#16587,#16588);
+#16587 = CARTESIAN_POINT('',(0.388908729653,0.));
+#16588 = VECTOR('',#16589,1.);
+#16589 = DIRECTION('',(0.,-1.));
+#16590 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16591 = ADVANCED_FACE('',(#16592),#16060,.T.);
+#16592 = FACE_BOUND('',#16593,.T.);
+#16593 = EDGE_LOOP('',(#16594,#16595,#16596,#16619));
+#16594 = ORIENTED_EDGE('',*,*,#16430,.T.);
+#16595 = ORIENTED_EDGE('',*,*,#16044,.T.);
+#16596 = ORIENTED_EDGE('',*,*,#16597,.F.);
+#16597 = EDGE_CURVE('',#16598,#16045,#16600,.T.);
+#16598 = VERTEX_POINT('',#16599);
+#16599 = CARTESIAN_POINT('',(3.6725,-8.615,-3.5));
+#16600 = SURFACE_CURVE('',#16601,(#16605,#16612),.PCURVE_S1.);
+#16601 = LINE('',#16602,#16603);
+#16602 = CARTESIAN_POINT('',(3.6725,-8.615,-3.5));
+#16603 = VECTOR('',#16604,1.);
+#16604 = DIRECTION('',(1.,0.,0.));
+#16605 = PCURVE('',#16060,#16606);
+#16606 = DEFINITIONAL_REPRESENTATION('',(#16607),#16611);
+#16607 = LINE('',#16608,#16609);
+#16608 = CARTESIAN_POINT('',(3.5,0.));
+#16609 = VECTOR('',#16610,1.);
+#16610 = DIRECTION('',(0.,-1.));
+#16611 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16612 = PCURVE('',#16088,#16613);
+#16613 = DEFINITIONAL_REPRESENTATION('',(#16614),#16618);
+#16614 = LINE('',#16615,#16616);
+#16615 = CARTESIAN_POINT('',(7.771561172376E-16,0.));
+#16616 = VECTOR('',#16617,1.);
+#16617 = DIRECTION('',(0.,-1.));
+#16618 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16619 = ORIENTED_EDGE('',*,*,#16620,.F.);
+#16620 = EDGE_CURVE('',#16431,#16598,#16621,.T.);
+#16621 = SURFACE_CURVE('',#16622,(#16626,#16633),.PCURVE_S1.);
+#16622 = LINE('',#16623,#16624);
+#16623 = CARTESIAN_POINT('',(3.6725,-8.615,0.));
+#16624 = VECTOR('',#16625,1.);
+#16625 = DIRECTION('',(0.,0.,-1.));
+#16626 = PCURVE('',#16060,#16627);
+#16627 = DEFINITIONAL_REPRESENTATION('',(#16628),#16632);
+#16628 = LINE('',#16629,#16630);
+#16629 = CARTESIAN_POINT('',(0.,0.));
+#16630 = VECTOR('',#16631,1.);
+#16631 = DIRECTION('',(1.,0.));
+#16632 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16633 = PCURVE('',#16309,#16634);
+#16634 = DEFINITIONAL_REPRESENTATION('',(#16635),#16639);
+#16635 = LINE('',#16636,#16637);
+#16636 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#16637 = VECTOR('',#16638,1.);
+#16638 = DIRECTION('',(0.,-1.));
+#16639 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16640 = ADVANCED_FACE('',(#16641),#16144,.T.);
+#16641 = FACE_BOUND('',#16642,.T.);
+#16642 = EDGE_LOOP('',(#16643,#16666,#16667,#16668));
+#16643 = ORIENTED_EDGE('',*,*,#16644,.T.);
+#16644 = EDGE_CURVE('',#16645,#16101,#16647,.T.);
+#16645 = VERTEX_POINT('',#16646);
+#16646 = CARTESIAN_POINT('',(3.6725,-9.165,0.));
+#16647 = SURFACE_CURVE('',#16648,(#16652,#16659),.PCURVE_S1.);
+#16648 = LINE('',#16649,#16650);
+#16649 = CARTESIAN_POINT('',(3.6725,-9.165,0.));
+#16650 = VECTOR('',#16651,1.);
+#16651 = DIRECTION('',(1.,0.,0.));
+#16652 = PCURVE('',#16144,#16653);
+#16653 = DEFINITIONAL_REPRESENTATION('',(#16654),#16658);
+#16654 = LINE('',#16655,#16656);
+#16655 = CARTESIAN_POINT('',(-1.177569344013E-16,0.));
+#16656 = VECTOR('',#16657,1.);
+#16657 = DIRECTION('',(0.,-1.));
+#16658 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16659 = PCURVE('',#16116,#16660);
+#16660 = DEFINITIONAL_REPRESENTATION('',(#16661),#16665);
+#16661 = LINE('',#16662,#16663);
+#16662 = CARTESIAN_POINT('',(3.5,0.));
+#16663 = VECTOR('',#16664,1.);
+#16664 = DIRECTION('',(0.,-1.));
+#16665 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16666 = ORIENTED_EDGE('',*,*,#16128,.T.);
+#16667 = ORIENTED_EDGE('',*,*,#16571,.F.);
+#16668 = ORIENTED_EDGE('',*,*,#16669,.F.);
+#16669 = EDGE_CURVE('',#16645,#16549,#16670,.T.);
+#16670 = SURFACE_CURVE('',#16671,(#16675,#16682),.PCURVE_S1.);
+#16671 = LINE('',#16672,#16673);
+#16672 = CARTESIAN_POINT('',(3.6725,-9.165,0.));
+#16673 = VECTOR('',#16674,1.);
+#16674 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#16675 = PCURVE('',#16144,#16676);
+#16676 = DEFINITIONAL_REPRESENTATION('',(#16677),#16681);
+#16677 = LINE('',#16678,#16679);
+#16678 = CARTESIAN_POINT('',(0.,0.));
+#16679 = VECTOR('',#16680,1.);
+#16680 = DIRECTION('',(1.,0.));
+#16681 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16682 = PCURVE('',#16309,#16683);
+#16683 = DEFINITIONAL_REPRESENTATION('',(#16684),#16688);
+#16684 = LINE('',#16685,#16686);
+#16685 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#16686 = VECTOR('',#16687,1.);
+#16687 = DIRECTION('',(0.707106781187,0.707106781187));
+#16688 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16689 = ADVANCED_FACE('',(#16690),#16088,.T.);
+#16690 = FACE_BOUND('',#16691,.T.);
+#16691 = EDGE_LOOP('',(#16692,#16693,#16694,#16717));
+#16692 = ORIENTED_EDGE('',*,*,#16597,.T.);
+#16693 = ORIENTED_EDGE('',*,*,#16072,.T.);
+#16694 = ORIENTED_EDGE('',*,*,#16695,.F.);
+#16695 = EDGE_CURVE('',#16696,#16073,#16698,.T.);
+#16696 = VERTEX_POINT('',#16697);
+#16697 = CARTESIAN_POINT('',(3.6725,-9.165,-3.5));
+#16698 = SURFACE_CURVE('',#16699,(#16703,#16710),.PCURVE_S1.);
+#16699 = LINE('',#16700,#16701);
+#16700 = CARTESIAN_POINT('',(3.6725,-9.165,-3.5));
+#16701 = VECTOR('',#16702,1.);
+#16702 = DIRECTION('',(1.,0.,0.));
+#16703 = PCURVE('',#16088,#16704);
+#16704 = DEFINITIONAL_REPRESENTATION('',(#16705),#16709);
+#16705 = LINE('',#16706,#16707);
+#16706 = CARTESIAN_POINT('',(0.55,0.));
+#16707 = VECTOR('',#16708,1.);
+#16708 = DIRECTION('',(0.,-1.));
+#16709 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16710 = PCURVE('',#16116,#16711);
+#16711 = DEFINITIONAL_REPRESENTATION('',(#16712),#16716);
+#16712 = LINE('',#16713,#16714);
+#16713 = CARTESIAN_POINT('',(0.,0.));
+#16714 = VECTOR('',#16715,1.);
+#16715 = DIRECTION('',(0.,-1.));
+#16716 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16717 = ORIENTED_EDGE('',*,*,#16718,.F.);
+#16718 = EDGE_CURVE('',#16598,#16696,#16719,.T.);
+#16719 = SURFACE_CURVE('',#16720,(#16724,#16731),.PCURVE_S1.);
+#16720 = LINE('',#16721,#16722);
+#16721 = CARTESIAN_POINT('',(3.6725,-8.615,-3.5));
+#16722 = VECTOR('',#16723,1.);
+#16723 = DIRECTION('',(0.,-1.,0.));
+#16724 = PCURVE('',#16088,#16725);
+#16725 = DEFINITIONAL_REPRESENTATION('',(#16726),#16730);
+#16726 = LINE('',#16727,#16728);
+#16727 = CARTESIAN_POINT('',(0.,-0.));
+#16728 = VECTOR('',#16729,1.);
+#16729 = DIRECTION('',(1.,0.));
+#16730 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16731 = PCURVE('',#16309,#16732);
+#16732 = DEFINITIONAL_REPRESENTATION('',(#16733),#16737);
+#16733 = LINE('',#16734,#16735);
+#16734 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#16735 = VECTOR('',#16736,1.);
+#16736 = DIRECTION('',(1.,2.226071387182E-62));
+#16737 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16738 = ADVANCED_FACE('',(#16739),#16116,.T.);
+#16739 = FACE_BOUND('',#16740,.T.);
+#16740 = EDGE_LOOP('',(#16741,#16742,#16743,#16744));
+#16741 = ORIENTED_EDGE('',*,*,#16695,.T.);
+#16742 = ORIENTED_EDGE('',*,*,#16100,.T.);
+#16743 = ORIENTED_EDGE('',*,*,#16644,.F.);
+#16744 = ORIENTED_EDGE('',*,*,#16745,.F.);
+#16745 = EDGE_CURVE('',#16696,#16645,#16746,.T.);
+#16746 = SURFACE_CURVE('',#16747,(#16751,#16758),.PCURVE_S1.);
+#16747 = LINE('',#16748,#16749);
+#16748 = CARTESIAN_POINT('',(3.6725,-9.165,-3.5));
+#16749 = VECTOR('',#16750,1.);
+#16750 = DIRECTION('',(0.,0.,1.));
+#16751 = PCURVE('',#16116,#16752);
+#16752 = DEFINITIONAL_REPRESENTATION('',(#16753),#16757);
+#16753 = LINE('',#16754,#16755);
+#16754 = CARTESIAN_POINT('',(0.,0.));
+#16755 = VECTOR('',#16756,1.);
+#16756 = DIRECTION('',(1.,0.));
+#16757 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16758 = PCURVE('',#16309,#16759);
+#16759 = DEFINITIONAL_REPRESENTATION('',(#16760),#16764);
+#16760 = LINE('',#16761,#16762);
+#16761 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#16762 = VECTOR('',#16763,1.);
+#16763 = DIRECTION('',(0.,1.));
+#16764 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16765 = ADVANCED_FACE('',(#16766),#16231,.T.);
+#16766 = FACE_BOUND('',#16767,.T.);
+#16767 = EDGE_LOOP('',(#16768,#16769,#16770,#16771));
+#16768 = ORIENTED_EDGE('',*,*,#16479,.T.);
+#16769 = ORIENTED_EDGE('',*,*,#16402,.T.);
+#16770 = ORIENTED_EDGE('',*,*,#16213,.F.);
+#16771 = ORIENTED_EDGE('',*,*,#16772,.F.);
+#16772 = EDGE_CURVE('',#16480,#16214,#16773,.T.);
+#16773 = SURFACE_CURVE('',#16774,(#16778,#16785),.PCURVE_S1.);
+#16774 = LINE('',#16775,#16776);
+#16775 = CARTESIAN_POINT('',(3.175,-9.44,2.56));
+#16776 = VECTOR('',#16777,1.);
+#16777 = DIRECTION('',(0.,1.,0.));
+#16778 = PCURVE('',#16231,#16779);
+#16779 = DEFINITIONAL_REPRESENTATION('',(#16780),#16784);
+#16780 = LINE('',#16781,#16782);
+#16781 = CARTESIAN_POINT('',(-0.38625,-0.55));
+#16782 = VECTOR('',#16783,1.);
+#16783 = DIRECTION('',(0.,1.));
+#16784 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16785 = PCURVE('',#16363,#16786);
+#16786 = DEFINITIONAL_REPRESENTATION('',(#16787),#16791);
+#16787 = LINE('',#16788,#16789);
+#16788 = CARTESIAN_POINT('',(0.275,0.));
+#16789 = VECTOR('',#16790,1.);
+#16790 = DIRECTION('',(0.,-1.));
+#16791 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16792 = ADVANCED_FACE('',(#16793),#16363,.F.);
+#16793 = FACE_BOUND('',#16794,.F.);
+#16794 = EDGE_LOOP('',(#16795,#16796,#16817,#16818));
+#16795 = ORIENTED_EDGE('',*,*,#16502,.F.);
+#16796 = ORIENTED_EDGE('',*,*,#16797,.T.);
+#16797 = EDGE_CURVE('',#16503,#16322,#16798,.T.);
+#16798 = SURFACE_CURVE('',#16799,(#16803,#16810),.PCURVE_S1.);
+#16799 = LINE('',#16800,#16801);
+#16800 = CARTESIAN_POINT('',(3.175,-9.44,2.285));
+#16801 = VECTOR('',#16802,1.);
+#16802 = DIRECTION('',(0.,1.,0.));
+#16803 = PCURVE('',#16363,#16804);
+#16804 = DEFINITIONAL_REPRESENTATION('',(#16805),#16809);
+#16805 = LINE('',#16806,#16807);
+#16806 = CARTESIAN_POINT('',(0.,0.));
+#16807 = VECTOR('',#16808,1.);
+#16808 = DIRECTION('',(0.,-1.));
+#16809 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16810 = PCURVE('',#16337,#16811);
+#16811 = DEFINITIONAL_REPRESENTATION('',(#16812),#16816);
+#16812 = LINE('',#16813,#16814);
+#16813 = CARTESIAN_POINT('',(0.,0.));
+#16814 = VECTOR('',#16815,1.);
+#16815 = DIRECTION('',(0.,1.));
+#16816 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16817 = ORIENTED_EDGE('',*,*,#16349,.T.);
+#16818 = ORIENTED_EDGE('',*,*,#16772,.F.);
+#16819 = ADVANCED_FACE('',(#16820),#16337,.F.);
+#16820 = FACE_BOUND('',#16821,.F.);
+#16821 = EDGE_LOOP('',(#16822,#16823,#16824,#16845));
+#16822 = ORIENTED_EDGE('',*,*,#16797,.F.);
+#16823 = ORIENTED_EDGE('',*,*,#16525,.T.);
+#16824 = ORIENTED_EDGE('',*,*,#16825,.T.);
+#16825 = EDGE_CURVE('',#16526,#16294,#16826,.T.);
+#16826 = SURFACE_CURVE('',#16827,(#16831,#16838),.PCURVE_S1.);
+#16827 = LINE('',#16828,#16829);
+#16828 = CARTESIAN_POINT('',(3.6725,-9.44,2.285));
+#16829 = VECTOR('',#16830,1.);
+#16830 = DIRECTION('',(0.,1.,0.));
+#16831 = PCURVE('',#16337,#16832);
+#16832 = DEFINITIONAL_REPRESENTATION('',(#16833),#16837);
+#16833 = LINE('',#16834,#16835);
+#16834 = CARTESIAN_POINT('',(0.4975,0.));
+#16835 = VECTOR('',#16836,1.);
+#16836 = DIRECTION('',(0.,1.));
+#16837 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16838 = PCURVE('',#16309,#16839);
+#16839 = DEFINITIONAL_REPRESENTATION('',(#16840),#16844);
+#16840 = LINE('',#16841,#16842);
+#16841 = CARTESIAN_POINT('',(0.55,2.62605853382));
+#16842 = VECTOR('',#16843,1.);
+#16843 = DIRECTION('',(-1.,-2.226071387182E-62));
+#16844 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16845 = ORIENTED_EDGE('',*,*,#16321,.F.);
+#16846 = ADVANCED_FACE('',(#16847),#16309,.T.);
+#16847 = FACE_BOUND('',#16848,.T.);
+#16848 = EDGE_LOOP('',(#16849,#16850,#16851,#16852,#16853,#16854,#16855,
+ #16856));
+#16849 = ORIENTED_EDGE('',*,*,#16548,.T.);
+#16850 = ORIENTED_EDGE('',*,*,#16825,.T.);
+#16851 = ORIENTED_EDGE('',*,*,#16293,.T.);
+#16852 = ORIENTED_EDGE('',*,*,#16453,.T.);
+#16853 = ORIENTED_EDGE('',*,*,#16620,.T.);
+#16854 = ORIENTED_EDGE('',*,*,#16718,.T.);
+#16855 = ORIENTED_EDGE('',*,*,#16745,.T.);
+#16856 = ORIENTED_EDGE('',*,*,#16669,.T.);
+#16857 = MANIFOLD_SOLID_BREP('',#16858);
+#16858 = CLOSED_SHELL('',(#16859,#17091,#17256,#17306,#17355,#17473,
+ #17522,#17571,#17620,#17647,#17674,#17701,#17728));
+#16859 = ADVANCED_FACE('',(#16860),#16874,.F.);
+#16860 = FACE_BOUND('',#16861,.F.);
+#16861 = EDGE_LOOP('',(#16862,#16897,#16925,#16953,#16981,#17009,#17037,
+ #17065));
+#16862 = ORIENTED_EDGE('',*,*,#16863,.T.);
+#16863 = EDGE_CURVE('',#16864,#16866,#16868,.T.);
+#16864 = VERTEX_POINT('',#16865);
+#16865 = CARTESIAN_POINT('',(-3.9475,-11.98,2.4225));
+#16866 = VERTEX_POINT('',#16867);
+#16867 = CARTESIAN_POINT('',(-3.9475,-11.98,0.275));
+#16868 = SURFACE_CURVE('',#16869,(#16873,#16885),.PCURVE_S1.);
+#16869 = LINE('',#16870,#16871);
+#16870 = CARTESIAN_POINT('',(-3.9475,-11.98,2.56));
+#16871 = VECTOR('',#16872,1.);
+#16872 = DIRECTION('',(0.,0.,-1.));
+#16873 = PCURVE('',#16874,#16879);
+#16874 = PLANE('',#16875);
+#16875 = AXIS2_PLACEMENT_3D('',#16876,#16877,#16878);
+#16876 = CARTESIAN_POINT('',(-3.9475,-11.43,-0.34105853382));
+#16877 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#16878 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#16879 = DEFINITIONAL_REPRESENTATION('',(#16880),#16884);
+#16880 = LINE('',#16881,#16882);
+#16881 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#16882 = VECTOR('',#16883,1.);
+#16883 = DIRECTION('',(0.,-1.));
+#16884 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16885 = PCURVE('',#16886,#16891);
+#16886 = PLANE('',#16887);
+#16887 = AXIS2_PLACEMENT_3D('',#16888,#16889,#16890);
+#16888 = CARTESIAN_POINT('',(-3.724778209321,-11.98,1.581028209321));
+#16889 = DIRECTION('',(1.58726821659E-29,-1.,-1.055919227411E-30));
+#16890 = DIRECTION('',(-1.,-1.58726821659E-29,0.));
+#16891 = DEFINITIONAL_REPRESENTATION('',(#16892),#16896);
+#16892 = LINE('',#16893,#16894);
+#16893 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#16894 = VECTOR('',#16895,1.);
+#16895 = DIRECTION('',(0.,1.));
+#16896 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16897 = ORIENTED_EDGE('',*,*,#16898,.T.);
+#16898 = EDGE_CURVE('',#16866,#16899,#16901,.T.);
+#16899 = VERTEX_POINT('',#16900);
+#16900 = CARTESIAN_POINT('',(-3.9475,-11.705,0.));
+#16901 = SURFACE_CURVE('',#16902,(#16906,#16913),.PCURVE_S1.);
+#16902 = LINE('',#16903,#16904);
+#16903 = CARTESIAN_POINT('',(-3.9475,-11.98,0.275));
+#16904 = VECTOR('',#16905,1.);
+#16905 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#16906 = PCURVE('',#16874,#16907);
+#16907 = DEFINITIONAL_REPRESENTATION('',(#16908),#16912);
+#16908 = LINE('',#16909,#16910);
+#16909 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#16910 = VECTOR('',#16911,1.);
+#16911 = DIRECTION('',(0.707106781187,-0.707106781187));
+#16912 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16913 = PCURVE('',#16914,#16919);
+#16914 = PLANE('',#16915);
+#16915 = AXIS2_PLACEMENT_3D('',#16916,#16917,#16918);
+#16916 = CARTESIAN_POINT('',(-3.6725,-11.98,0.275));
+#16917 = DIRECTION('',(-0.,-0.707106781187,-0.707106781187));
+#16918 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#16919 = DEFINITIONAL_REPRESENTATION('',(#16920),#16924);
+#16920 = LINE('',#16921,#16922);
+#16921 = CARTESIAN_POINT('',(0.,-0.275));
+#16922 = VECTOR('',#16923,1.);
+#16923 = DIRECTION('',(1.,0.));
+#16924 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16925 = ORIENTED_EDGE('',*,*,#16926,.T.);
+#16926 = EDGE_CURVE('',#16899,#16927,#16929,.T.);
+#16927 = VERTEX_POINT('',#16928);
+#16928 = CARTESIAN_POINT('',(-3.9475,-11.705,-3.5));
+#16929 = SURFACE_CURVE('',#16930,(#16934,#16941),.PCURVE_S1.);
+#16930 = LINE('',#16931,#16932);
+#16931 = CARTESIAN_POINT('',(-3.9475,-11.705,0.));
+#16932 = VECTOR('',#16933,1.);
+#16933 = DIRECTION('',(0.,0.,-1.));
+#16934 = PCURVE('',#16874,#16935);
+#16935 = DEFINITIONAL_REPRESENTATION('',(#16936),#16940);
+#16936 = LINE('',#16937,#16938);
+#16937 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#16938 = VECTOR('',#16939,1.);
+#16939 = DIRECTION('',(0.,-1.));
+#16940 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16941 = PCURVE('',#16942,#16947);
+#16942 = PLANE('',#16943);
+#16943 = AXIS2_PLACEMENT_3D('',#16944,#16945,#16946);
+#16944 = CARTESIAN_POINT('',(-3.6725,-11.705,0.));
+#16945 = DIRECTION('',(-0.,-1.,-0.));
+#16946 = DIRECTION('',(0.,0.,-1.));
+#16947 = DEFINITIONAL_REPRESENTATION('',(#16948),#16952);
+#16948 = LINE('',#16949,#16950);
+#16949 = CARTESIAN_POINT('',(0.,-0.275));
+#16950 = VECTOR('',#16951,1.);
+#16951 = DIRECTION('',(1.,0.));
+#16952 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16953 = ORIENTED_EDGE('',*,*,#16954,.T.);
+#16954 = EDGE_CURVE('',#16927,#16955,#16957,.T.);
+#16955 = VERTEX_POINT('',#16956);
+#16956 = CARTESIAN_POINT('',(-3.9475,-11.155,-3.5));
+#16957 = SURFACE_CURVE('',#16958,(#16962,#16969),.PCURVE_S1.);
+#16958 = LINE('',#16959,#16960);
+#16959 = CARTESIAN_POINT('',(-3.9475,-11.705,-3.5));
+#16960 = VECTOR('',#16961,1.);
+#16961 = DIRECTION('',(0.,1.,0.));
+#16962 = PCURVE('',#16874,#16963);
+#16963 = DEFINITIONAL_REPRESENTATION('',(#16964),#16968);
+#16964 = LINE('',#16965,#16966);
+#16965 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#16966 = VECTOR('',#16967,1.);
+#16967 = DIRECTION('',(1.,-2.226071387182E-62));
+#16968 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16969 = PCURVE('',#16970,#16975);
+#16970 = PLANE('',#16971);
+#16971 = AXIS2_PLACEMENT_3D('',#16972,#16973,#16974);
+#16972 = CARTESIAN_POINT('',(-3.6725,-11.705,-3.5));
+#16973 = DIRECTION('',(0.,0.,-1.));
+#16974 = DIRECTION('',(0.,1.,0.));
+#16975 = DEFINITIONAL_REPRESENTATION('',(#16976),#16980);
+#16976 = LINE('',#16977,#16978);
+#16977 = CARTESIAN_POINT('',(0.,-0.275));
+#16978 = VECTOR('',#16979,1.);
+#16979 = DIRECTION('',(1.,0.));
+#16980 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16981 = ORIENTED_EDGE('',*,*,#16982,.T.);
+#16982 = EDGE_CURVE('',#16955,#16983,#16985,.T.);
+#16983 = VERTEX_POINT('',#16984);
+#16984 = CARTESIAN_POINT('',(-3.9475,-11.155,0.));
+#16985 = SURFACE_CURVE('',#16986,(#16990,#16997),.PCURVE_S1.);
+#16986 = LINE('',#16987,#16988);
+#16987 = CARTESIAN_POINT('',(-3.9475,-11.155,-3.5));
+#16988 = VECTOR('',#16989,1.);
+#16989 = DIRECTION('',(0.,0.,1.));
+#16990 = PCURVE('',#16874,#16991);
+#16991 = DEFINITIONAL_REPRESENTATION('',(#16992),#16996);
+#16992 = LINE('',#16993,#16994);
+#16993 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#16994 = VECTOR('',#16995,1.);
+#16995 = DIRECTION('',(0.,1.));
+#16996 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#16997 = PCURVE('',#16998,#17003);
+#16998 = PLANE('',#16999);
+#16999 = AXIS2_PLACEMENT_3D('',#17000,#17001,#17002);
+#17000 = CARTESIAN_POINT('',(-3.6725,-11.155,-3.5));
+#17001 = DIRECTION('',(0.,1.,0.));
+#17002 = DIRECTION('',(0.,0.,1.));
+#17003 = DEFINITIONAL_REPRESENTATION('',(#17004),#17008);
+#17004 = LINE('',#17005,#17006);
+#17005 = CARTESIAN_POINT('',(0.,-0.275));
+#17006 = VECTOR('',#17007,1.);
+#17007 = DIRECTION('',(1.,0.));
+#17008 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17009 = ORIENTED_EDGE('',*,*,#17010,.T.);
+#17010 = EDGE_CURVE('',#16983,#17011,#17013,.T.);
+#17011 = VERTEX_POINT('',#17012);
+#17012 = CARTESIAN_POINT('',(-3.9475,-10.88,0.275));
+#17013 = SURFACE_CURVE('',#17014,(#17018,#17025),.PCURVE_S1.);
+#17014 = LINE('',#17015,#17016);
+#17015 = CARTESIAN_POINT('',(-3.9475,-11.155,0.));
+#17016 = VECTOR('',#17017,1.);
+#17017 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#17018 = PCURVE('',#16874,#17019);
+#17019 = DEFINITIONAL_REPRESENTATION('',(#17020),#17024);
+#17020 = LINE('',#17021,#17022);
+#17021 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#17022 = VECTOR('',#17023,1.);
+#17023 = DIRECTION('',(0.707106781187,0.707106781187));
+#17024 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17025 = PCURVE('',#17026,#17031);
+#17026 = PLANE('',#17027);
+#17027 = AXIS2_PLACEMENT_3D('',#17028,#17029,#17030);
+#17028 = CARTESIAN_POINT('',(-3.6725,-11.155,0.));
+#17029 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#17030 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#17031 = DEFINITIONAL_REPRESENTATION('',(#17032),#17036);
+#17032 = LINE('',#17033,#17034);
+#17033 = CARTESIAN_POINT('',(0.,-0.275));
+#17034 = VECTOR('',#17035,1.);
+#17035 = DIRECTION('',(1.,0.));
+#17036 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17037 = ORIENTED_EDGE('',*,*,#17038,.T.);
+#17038 = EDGE_CURVE('',#17011,#17039,#17041,.T.);
+#17039 = VERTEX_POINT('',#17040);
+#17040 = CARTESIAN_POINT('',(-3.9475,-10.88,2.4225));
+#17041 = SURFACE_CURVE('',#17042,(#17046,#17053),.PCURVE_S1.);
+#17042 = LINE('',#17043,#17044);
+#17043 = CARTESIAN_POINT('',(-3.9475,-10.88,0.275));
+#17044 = VECTOR('',#17045,1.);
+#17045 = DIRECTION('',(0.,0.,1.));
+#17046 = PCURVE('',#16874,#17047);
+#17047 = DEFINITIONAL_REPRESENTATION('',(#17048),#17052);
+#17048 = LINE('',#17049,#17050);
+#17049 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#17050 = VECTOR('',#17051,1.);
+#17051 = DIRECTION('',(0.,1.));
+#17052 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17053 = PCURVE('',#17054,#17059);
+#17054 = PLANE('',#17055);
+#17055 = AXIS2_PLACEMENT_3D('',#17056,#17057,#17058);
+#17056 = CARTESIAN_POINT('',(-3.724778209321,-10.88,1.581028209321));
+#17057 = DIRECTION('',(2.616880222009E-29,1.,-2.312216259511E-30));
+#17058 = DIRECTION('',(1.,-2.616880222009E-29,0.));
+#17059 = DEFINITIONAL_REPRESENTATION('',(#17060),#17064);
+#17060 = LINE('',#17061,#17062);
+#17061 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#17062 = VECTOR('',#17063,1.);
+#17063 = DIRECTION('',(0.,-1.));
+#17064 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17065 = ORIENTED_EDGE('',*,*,#17066,.T.);
+#17066 = EDGE_CURVE('',#17039,#16864,#17067,.T.);
+#17067 = SURFACE_CURVE('',#17068,(#17072,#17079),.PCURVE_S1.);
+#17068 = LINE('',#17069,#17070);
+#17069 = CARTESIAN_POINT('',(-3.9475,-10.88,2.4225));
+#17070 = VECTOR('',#17071,1.);
+#17071 = DIRECTION('',(0.,-1.,0.));
+#17072 = PCURVE('',#16874,#17073);
+#17073 = DEFINITIONAL_REPRESENTATION('',(#17074),#17078);
+#17074 = LINE('',#17075,#17076);
+#17075 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#17076 = VECTOR('',#17077,1.);
+#17077 = DIRECTION('',(-1.,2.226071387182E-62));
+#17078 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17079 = PCURVE('',#17080,#17085);
+#17080 = CYLINDRICAL_SURFACE('',#17081,0.1375);
+#17081 = AXIS2_PLACEMENT_3D('',#17082,#17083,#17084);
+#17082 = CARTESIAN_POINT('',(-3.81,-10.88,2.4225));
+#17083 = DIRECTION('',(0.,-1.,0.));
+#17084 = DIRECTION('',(-1.,-0.,-9.8088568672E-33));
+#17085 = DEFINITIONAL_REPRESENTATION('',(#17086),#17090);
+#17086 = LINE('',#17087,#17088);
+#17087 = CARTESIAN_POINT('',(-0.,0.));
+#17088 = VECTOR('',#17089,1.);
+#17089 = DIRECTION('',(-0.,1.));
+#17090 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17091 = ADVANCED_FACE('',(#17092),#16886,.T.);
+#17092 = FACE_BOUND('',#17093,.T.);
+#17093 = EDGE_LOOP('',(#17094,#17124,#17150,#17151,#17174,#17202,#17230)
+ );
+#17094 = ORIENTED_EDGE('',*,*,#17095,.T.);
+#17095 = EDGE_CURVE('',#17096,#17098,#17100,.T.);
+#17096 = VERTEX_POINT('',#17097);
+#17097 = CARTESIAN_POINT('',(-3.175,-11.98,2.56));
+#17098 = VERTEX_POINT('',#17099);
+#17099 = CARTESIAN_POINT('',(-3.81,-11.98,2.56));
+#17100 = SURFACE_CURVE('',#17101,(#17105,#17112),.PCURVE_S1.);
+#17101 = LINE('',#17102,#17103);
+#17102 = CARTESIAN_POINT('',(-3.6725,-11.98,2.56));
+#17103 = VECTOR('',#17104,1.);
+#17104 = DIRECTION('',(-1.,0.,0.));
+#17105 = PCURVE('',#16886,#17106);
+#17106 = DEFINITIONAL_REPRESENTATION('',(#17107),#17111);
+#17107 = LINE('',#17108,#17109);
+#17108 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#17109 = VECTOR('',#17110,1.);
+#17110 = DIRECTION('',(1.,1.676027028956E-59));
+#17111 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17112 = PCURVE('',#17113,#17118);
+#17113 = PLANE('',#17114);
+#17114 = AXIS2_PLACEMENT_3D('',#17115,#17116,#17117);
+#17115 = CARTESIAN_POINT('',(-3.56125,-11.43,2.56));
+#17116 = DIRECTION('',(1.601195610168E-30,3.925633828627E-30,1.));
+#17117 = DIRECTION('',(0.,1.,-3.925633828627E-30));
+#17118 = DEFINITIONAL_REPRESENTATION('',(#17119),#17123);
+#17119 = LINE('',#17120,#17121);
+#17120 = CARTESIAN_POINT('',(-0.55,0.11125));
+#17121 = VECTOR('',#17122,1.);
+#17122 = DIRECTION('',(0.,1.));
+#17123 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17124 = ORIENTED_EDGE('',*,*,#17125,.F.);
+#17125 = EDGE_CURVE('',#16864,#17098,#17126,.T.);
+#17126 = SURFACE_CURVE('',#17127,(#17132,#17143),.PCURVE_S1.);
+#17127 = CIRCLE('',#17128,0.1375);
+#17128 = AXIS2_PLACEMENT_3D('',#17129,#17130,#17131);
+#17129 = CARTESIAN_POINT('',(-3.81,-11.98,2.4225));
+#17130 = DIRECTION('',(-0.,1.,0.));
+#17131 = DIRECTION('',(0.,0.,-1.));
+#17132 = PCURVE('',#16886,#17133);
+#17133 = DEFINITIONAL_REPRESENTATION('',(#17134),#17142);
+#17134 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#17135,#17136,#17137,#17138
+ ,#17139,#17140,#17141),.UNSPECIFIED.,.F.,.F.)
+B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),(-2.094395102393,0.,
+ 2.094395102393,4.188790204786,6.28318530718,8.377580409573),
+.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM()
+RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM(
+ '') );
+#17135 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#17136 = CARTESIAN_POINT('',(0.323378776719,-0.703971790679));
+#17137 = CARTESIAN_POINT('',(0.204300283699,-0.910221790679));
+#17138 = CARTESIAN_POINT('',(8.522179067866E-02,-1.116471790679));
+#17139 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.910221790679));
+#17140 = CARTESIAN_POINT('',(-0.152935195362,-0.703971790679));
+#17141 = CARTESIAN_POINT('',(8.522179067866E-02,-0.703971790679));
+#17142 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17143 = PCURVE('',#17080,#17144);
+#17144 = DEFINITIONAL_REPRESENTATION('',(#17145),#17149);
+#17145 = LINE('',#17146,#17147);
+#17146 = CARTESIAN_POINT('',(1.570796326795,1.1));
+#17147 = VECTOR('',#17148,1.);
+#17148 = DIRECTION('',(-1.,0.));
+#17149 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17150 = ORIENTED_EDGE('',*,*,#16863,.T.);
+#17151 = ORIENTED_EDGE('',*,*,#17152,.F.);
+#17152 = EDGE_CURVE('',#17153,#16866,#17155,.T.);
+#17153 = VERTEX_POINT('',#17154);
+#17154 = CARTESIAN_POINT('',(-3.6725,-11.98,0.275));
+#17155 = SURFACE_CURVE('',#17156,(#17160,#17167),.PCURVE_S1.);
+#17156 = LINE('',#17157,#17158);
+#17157 = CARTESIAN_POINT('',(-3.6725,-11.98,0.275));
+#17158 = VECTOR('',#17159,1.);
+#17159 = DIRECTION('',(-1.,0.,0.));
+#17160 = PCURVE('',#16886,#17161);
+#17161 = DEFINITIONAL_REPRESENTATION('',(#17162),#17166);
+#17162 = LINE('',#17163,#17164);
+#17163 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#17164 = VECTOR('',#17165,1.);
+#17165 = DIRECTION('',(1.,1.676027028956E-59));
+#17166 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17167 = PCURVE('',#16914,#17168);
+#17168 = DEFINITIONAL_REPRESENTATION('',(#17169),#17173);
+#17169 = LINE('',#17170,#17171);
+#17170 = CARTESIAN_POINT('',(0.,0.));
+#17171 = VECTOR('',#17172,1.);
+#17172 = DIRECTION('',(0.,-1.));
+#17173 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17174 = ORIENTED_EDGE('',*,*,#17175,.F.);
+#17175 = EDGE_CURVE('',#17176,#17153,#17178,.T.);
+#17176 = VERTEX_POINT('',#17177);
+#17177 = CARTESIAN_POINT('',(-3.6725,-11.98,2.285));
+#17178 = SURFACE_CURVE('',#17179,(#17183,#17190),.PCURVE_S1.);
+#17179 = LINE('',#17180,#17181);
+#17180 = CARTESIAN_POINT('',(-3.6725,-11.98,2.56));
+#17181 = VECTOR('',#17182,1.);
+#17182 = DIRECTION('',(0.,0.,-1.));
+#17183 = PCURVE('',#16886,#17184);
+#17184 = DEFINITIONAL_REPRESENTATION('',(#17185),#17189);
+#17185 = LINE('',#17186,#17187);
+#17186 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#17187 = VECTOR('',#17188,1.);
+#17188 = DIRECTION('',(0.,1.));
+#17189 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17190 = PCURVE('',#17191,#17196);
+#17191 = PLANE('',#17192);
+#17192 = AXIS2_PLACEMENT_3D('',#17193,#17194,#17195);
+#17193 = CARTESIAN_POINT('',(-3.6725,-11.43,-0.34105853382));
+#17194 = DIRECTION('',(1.,2.269450372577E-30,9.8088568672E-33));
+#17195 = DIRECTION('',(-2.269450372577E-30,1.,0.));
+#17196 = DEFINITIONAL_REPRESENTATION('',(#17197),#17201);
+#17197 = LINE('',#17198,#17199);
+#17198 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#17199 = VECTOR('',#17200,1.);
+#17200 = DIRECTION('',(0.,-1.));
+#17201 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17202 = ORIENTED_EDGE('',*,*,#17203,.T.);
+#17203 = EDGE_CURVE('',#17176,#17204,#17206,.T.);
+#17204 = VERTEX_POINT('',#17205);
+#17205 = CARTESIAN_POINT('',(-3.175,-11.98,2.285));
+#17206 = SURFACE_CURVE('',#17207,(#17211,#17218),.PCURVE_S1.);
+#17207 = LINE('',#17208,#17209);
+#17208 = CARTESIAN_POINT('',(-3.6725,-11.98,2.285));
+#17209 = VECTOR('',#17210,1.);
+#17210 = DIRECTION('',(1.,0.,0.));
+#17211 = PCURVE('',#16886,#17212);
+#17212 = DEFINITIONAL_REPRESENTATION('',(#17213),#17217);
+#17213 = LINE('',#17214,#17215);
+#17214 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.703971790679));
+#17215 = VECTOR('',#17216,1.);
+#17216 = DIRECTION('',(-1.,-1.676027028956E-59));
+#17217 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17218 = PCURVE('',#17219,#17224);
+#17219 = PLANE('',#17220);
+#17220 = AXIS2_PLACEMENT_3D('',#17221,#17222,#17223);
+#17221 = CARTESIAN_POINT('',(-3.6725,-11.98,2.285));
+#17222 = DIRECTION('',(0.,0.,1.));
+#17223 = DIRECTION('',(1.,0.,0.));
+#17224 = DEFINITIONAL_REPRESENTATION('',(#17225),#17229);
+#17225 = LINE('',#17226,#17227);
+#17226 = CARTESIAN_POINT('',(0.,0.));
+#17227 = VECTOR('',#17228,1.);
+#17228 = DIRECTION('',(1.,0.));
+#17229 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17230 = ORIENTED_EDGE('',*,*,#17231,.T.);
+#17231 = EDGE_CURVE('',#17204,#17096,#17232,.T.);
+#17232 = SURFACE_CURVE('',#17233,(#17237,#17244),.PCURVE_S1.);
+#17233 = LINE('',#17234,#17235);
+#17234 = CARTESIAN_POINT('',(-3.175,-11.98,2.285));
+#17235 = VECTOR('',#17236,1.);
+#17236 = DIRECTION('',(0.,0.,1.));
+#17237 = PCURVE('',#16886,#17238);
+#17238 = DEFINITIONAL_REPRESENTATION('',(#17239),#17243);
+#17239 = LINE('',#17240,#17241);
+#17240 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#17241 = VECTOR('',#17242,1.);
+#17242 = DIRECTION('',(0.,-1.));
+#17243 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17244 = PCURVE('',#17245,#17250);
+#17245 = PLANE('',#17246);
+#17246 = AXIS2_PLACEMENT_3D('',#17247,#17248,#17249);
+#17247 = CARTESIAN_POINT('',(-3.175,-11.98,2.285));
+#17248 = DIRECTION('',(1.,0.,0.));
+#17249 = DIRECTION('',(0.,0.,1.));
+#17250 = DEFINITIONAL_REPRESENTATION('',(#17251),#17255);
+#17251 = LINE('',#17252,#17253);
+#17252 = CARTESIAN_POINT('',(0.,0.));
+#17253 = VECTOR('',#17254,1.);
+#17254 = DIRECTION('',(1.,0.));
+#17255 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17256 = ADVANCED_FACE('',(#17257),#17080,.T.);
+#17257 = FACE_BOUND('',#17258,.F.);
+#17258 = EDGE_LOOP('',(#17259,#17283,#17304,#17305));
+#17259 = ORIENTED_EDGE('',*,*,#17260,.T.);
+#17260 = EDGE_CURVE('',#17039,#17261,#17263,.T.);
+#17261 = VERTEX_POINT('',#17262);
+#17262 = CARTESIAN_POINT('',(-3.81,-10.88,2.56));
+#17263 = SURFACE_CURVE('',#17264,(#17269,#17276),.PCURVE_S1.);
+#17264 = CIRCLE('',#17265,0.1375);
+#17265 = AXIS2_PLACEMENT_3D('',#17266,#17267,#17268);
+#17266 = CARTESIAN_POINT('',(-3.81,-10.88,2.4225));
+#17267 = DIRECTION('',(-0.,1.,0.));
+#17268 = DIRECTION('',(0.,0.,-1.));
+#17269 = PCURVE('',#17080,#17270);
+#17270 = DEFINITIONAL_REPRESENTATION('',(#17271),#17275);
+#17271 = LINE('',#17272,#17273);
+#17272 = CARTESIAN_POINT('',(1.570796326795,3.552713678801E-15));
+#17273 = VECTOR('',#17274,1.);
+#17274 = DIRECTION('',(-1.,0.));
+#17275 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17276 = PCURVE('',#17054,#17277);
+#17277 = DEFINITIONAL_REPRESENTATION('',(#17278),#17282);
+#17278 = CIRCLE('',#17279,0.1375);
+#17279 = AXIS2_PLACEMENT_2D('',#17280,#17281);
+#17280 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#17281 = DIRECTION('',(0.,1.));
+#17282 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17283 = ORIENTED_EDGE('',*,*,#17284,.T.);
+#17284 = EDGE_CURVE('',#17261,#17098,#17285,.T.);
+#17285 = SURFACE_CURVE('',#17286,(#17290,#17297),.PCURVE_S1.);
+#17286 = LINE('',#17287,#17288);
+#17287 = CARTESIAN_POINT('',(-3.81,-10.88,2.56));
+#17288 = VECTOR('',#17289,1.);
+#17289 = DIRECTION('',(0.,-1.,0.));
+#17290 = PCURVE('',#17080,#17291);
+#17291 = DEFINITIONAL_REPRESENTATION('',(#17292),#17296);
+#17292 = LINE('',#17293,#17294);
+#17293 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#17294 = VECTOR('',#17295,1.);
+#17295 = DIRECTION('',(-0.,1.));
+#17296 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17297 = PCURVE('',#17113,#17298);
+#17298 = DEFINITIONAL_REPRESENTATION('',(#17299),#17303);
+#17299 = LINE('',#17300,#17301);
+#17300 = CARTESIAN_POINT('',(0.55,0.24875));
+#17301 = VECTOR('',#17302,1.);
+#17302 = DIRECTION('',(-1.,-6.285707653525E-60));
+#17303 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17304 = ORIENTED_EDGE('',*,*,#17125,.F.);
+#17305 = ORIENTED_EDGE('',*,*,#17066,.F.);
+#17306 = ADVANCED_FACE('',(#17307),#16914,.T.);
+#17307 = FACE_BOUND('',#17308,.T.);
+#17308 = EDGE_LOOP('',(#17309,#17310,#17311,#17334));
+#17309 = ORIENTED_EDGE('',*,*,#17152,.T.);
+#17310 = ORIENTED_EDGE('',*,*,#16898,.T.);
+#17311 = ORIENTED_EDGE('',*,*,#17312,.F.);
+#17312 = EDGE_CURVE('',#17313,#16899,#17315,.T.);
+#17313 = VERTEX_POINT('',#17314);
+#17314 = CARTESIAN_POINT('',(-3.6725,-11.705,0.));
+#17315 = SURFACE_CURVE('',#17316,(#17320,#17327),.PCURVE_S1.);
+#17316 = LINE('',#17317,#17318);
+#17317 = CARTESIAN_POINT('',(-3.6725,-11.705,0.));
+#17318 = VECTOR('',#17319,1.);
+#17319 = DIRECTION('',(-1.,0.,0.));
+#17320 = PCURVE('',#16914,#17321);
+#17321 = DEFINITIONAL_REPRESENTATION('',(#17322),#17326);
+#17322 = LINE('',#17323,#17324);
+#17323 = CARTESIAN_POINT('',(0.388908729653,0.));
+#17324 = VECTOR('',#17325,1.);
+#17325 = DIRECTION('',(0.,-1.));
+#17326 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17327 = PCURVE('',#16942,#17328);
+#17328 = DEFINITIONAL_REPRESENTATION('',(#17329),#17333);
+#17329 = LINE('',#17330,#17331);
+#17330 = CARTESIAN_POINT('',(0.,0.));
+#17331 = VECTOR('',#17332,1.);
+#17332 = DIRECTION('',(0.,-1.));
+#17333 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17334 = ORIENTED_EDGE('',*,*,#17335,.F.);
+#17335 = EDGE_CURVE('',#17153,#17313,#17336,.T.);
+#17336 = SURFACE_CURVE('',#17337,(#17341,#17348),.PCURVE_S1.);
+#17337 = LINE('',#17338,#17339);
+#17338 = CARTESIAN_POINT('',(-3.6725,-11.98,0.275));
+#17339 = VECTOR('',#17340,1.);
+#17340 = DIRECTION('',(-0.,0.707106781187,-0.707106781187));
+#17341 = PCURVE('',#16914,#17342);
+#17342 = DEFINITIONAL_REPRESENTATION('',(#17343),#17347);
+#17343 = LINE('',#17344,#17345);
+#17344 = CARTESIAN_POINT('',(0.,0.));
+#17345 = VECTOR('',#17346,1.);
+#17346 = DIRECTION('',(1.,0.));
+#17347 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17348 = PCURVE('',#17191,#17349);
+#17349 = DEFINITIONAL_REPRESENTATION('',(#17350),#17354);
+#17350 = LINE('',#17351,#17352);
+#17351 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#17352 = VECTOR('',#17353,1.);
+#17353 = DIRECTION('',(0.707106781187,-0.707106781187));
+#17354 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17355 = ADVANCED_FACE('',(#17356),#17054,.T.);
+#17356 = FACE_BOUND('',#17357,.T.);
+#17357 = EDGE_LOOP('',(#17358,#17359,#17360,#17383,#17406,#17429,#17452)
+ );
+#17358 = ORIENTED_EDGE('',*,*,#17038,.T.);
+#17359 = ORIENTED_EDGE('',*,*,#17260,.T.);
+#17360 = ORIENTED_EDGE('',*,*,#17361,.T.);
+#17361 = EDGE_CURVE('',#17261,#17362,#17364,.T.);
+#17362 = VERTEX_POINT('',#17363);
+#17363 = CARTESIAN_POINT('',(-3.175,-10.88,2.56));
+#17364 = SURFACE_CURVE('',#17365,(#17369,#17376),.PCURVE_S1.);
+#17365 = LINE('',#17366,#17367);
+#17366 = CARTESIAN_POINT('',(-3.6725,-10.88,2.56));
+#17367 = VECTOR('',#17368,1.);
+#17368 = DIRECTION('',(1.,0.,0.));
+#17369 = PCURVE('',#17054,#17370);
+#17370 = DEFINITIONAL_REPRESENTATION('',(#17371),#17375);
+#17371 = LINE('',#17372,#17373);
+#17372 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#17373 = VECTOR('',#17374,1.);
+#17374 = DIRECTION('',(1.,-6.050792998522E-59));
+#17375 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17376 = PCURVE('',#17113,#17377);
+#17377 = DEFINITIONAL_REPRESENTATION('',(#17378),#17382);
+#17378 = LINE('',#17379,#17380);
+#17379 = CARTESIAN_POINT('',(0.55,0.11125));
+#17380 = VECTOR('',#17381,1.);
+#17381 = DIRECTION('',(0.,-1.));
+#17382 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17383 = ORIENTED_EDGE('',*,*,#17384,.F.);
+#17384 = EDGE_CURVE('',#17385,#17362,#17387,.T.);
+#17385 = VERTEX_POINT('',#17386);
+#17386 = CARTESIAN_POINT('',(-3.175,-10.88,2.285));
+#17387 = SURFACE_CURVE('',#17388,(#17392,#17399),.PCURVE_S1.);
+#17388 = LINE('',#17389,#17390);
+#17389 = CARTESIAN_POINT('',(-3.175,-10.88,2.285));
+#17390 = VECTOR('',#17391,1.);
+#17391 = DIRECTION('',(0.,0.,1.));
+#17392 = PCURVE('',#17054,#17393);
+#17393 = DEFINITIONAL_REPRESENTATION('',(#17394),#17398);
+#17394 = LINE('',#17395,#17396);
+#17395 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#17396 = VECTOR('',#17397,1.);
+#17397 = DIRECTION('',(0.,-1.));
+#17398 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17399 = PCURVE('',#17245,#17400);
+#17400 = DEFINITIONAL_REPRESENTATION('',(#17401),#17405);
+#17401 = LINE('',#17402,#17403);
+#17402 = CARTESIAN_POINT('',(0.,-1.1));
+#17403 = VECTOR('',#17404,1.);
+#17404 = DIRECTION('',(1.,0.));
+#17405 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17406 = ORIENTED_EDGE('',*,*,#17407,.F.);
+#17407 = EDGE_CURVE('',#17408,#17385,#17410,.T.);
+#17408 = VERTEX_POINT('',#17409);
+#17409 = CARTESIAN_POINT('',(-3.6725,-10.88,2.285));
+#17410 = SURFACE_CURVE('',#17411,(#17415,#17422),.PCURVE_S1.);
+#17411 = LINE('',#17412,#17413);
+#17412 = CARTESIAN_POINT('',(-3.6725,-10.88,2.285));
+#17413 = VECTOR('',#17414,1.);
+#17414 = DIRECTION('',(1.,0.,0.));
+#17415 = PCURVE('',#17054,#17416);
+#17416 = DEFINITIONAL_REPRESENTATION('',(#17417),#17421);
+#17417 = LINE('',#17418,#17419);
+#17418 = CARTESIAN_POINT('',(5.227820932134E-02,-0.703971790679));
+#17419 = VECTOR('',#17420,1.);
+#17420 = DIRECTION('',(1.,-6.050792998522E-59));
+#17421 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17422 = PCURVE('',#17219,#17423);
+#17423 = DEFINITIONAL_REPRESENTATION('',(#17424),#17428);
+#17424 = LINE('',#17425,#17426);
+#17425 = CARTESIAN_POINT('',(0.,1.1));
+#17426 = VECTOR('',#17427,1.);
+#17427 = DIRECTION('',(1.,0.));
+#17428 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17429 = ORIENTED_EDGE('',*,*,#17430,.F.);
+#17430 = EDGE_CURVE('',#17431,#17408,#17433,.T.);
+#17431 = VERTEX_POINT('',#17432);
+#17432 = CARTESIAN_POINT('',(-3.6725,-10.88,0.275));
+#17433 = SURFACE_CURVE('',#17434,(#17438,#17445),.PCURVE_S1.);
+#17434 = LINE('',#17435,#17436);
+#17435 = CARTESIAN_POINT('',(-3.6725,-10.88,0.275));
+#17436 = VECTOR('',#17437,1.);
+#17437 = DIRECTION('',(0.,0.,1.));
+#17438 = PCURVE('',#17054,#17439);
+#17439 = DEFINITIONAL_REPRESENTATION('',(#17440),#17444);
+#17440 = LINE('',#17441,#17442);
+#17441 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#17442 = VECTOR('',#17443,1.);
+#17443 = DIRECTION('',(0.,-1.));
+#17444 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17445 = PCURVE('',#17191,#17446);
+#17446 = DEFINITIONAL_REPRESENTATION('',(#17447),#17451);
+#17447 = LINE('',#17448,#17449);
+#17448 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#17449 = VECTOR('',#17450,1.);
+#17450 = DIRECTION('',(0.,1.));
+#17451 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17452 = ORIENTED_EDGE('',*,*,#17453,.T.);
+#17453 = EDGE_CURVE('',#17431,#17011,#17454,.T.);
+#17454 = SURFACE_CURVE('',#17455,(#17459,#17466),.PCURVE_S1.);
+#17455 = LINE('',#17456,#17457);
+#17456 = CARTESIAN_POINT('',(-3.6725,-10.88,0.275));
+#17457 = VECTOR('',#17458,1.);
+#17458 = DIRECTION('',(-1.,0.,0.));
+#17459 = PCURVE('',#17054,#17460);
+#17460 = DEFINITIONAL_REPRESENTATION('',(#17461),#17465);
+#17461 = LINE('',#17462,#17463);
+#17462 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#17463 = VECTOR('',#17464,1.);
+#17464 = DIRECTION('',(-1.,6.050792998522E-59));
+#17465 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17466 = PCURVE('',#17026,#17467);
+#17467 = DEFINITIONAL_REPRESENTATION('',(#17468),#17472);
+#17468 = LINE('',#17469,#17470);
+#17469 = CARTESIAN_POINT('',(0.388908729653,0.));
+#17470 = VECTOR('',#17471,1.);
+#17471 = DIRECTION('',(0.,-1.));
+#17472 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17473 = ADVANCED_FACE('',(#17474),#16942,.T.);
+#17474 = FACE_BOUND('',#17475,.T.);
+#17475 = EDGE_LOOP('',(#17476,#17477,#17478,#17501));
+#17476 = ORIENTED_EDGE('',*,*,#17312,.T.);
+#17477 = ORIENTED_EDGE('',*,*,#16926,.T.);
+#17478 = ORIENTED_EDGE('',*,*,#17479,.F.);
+#17479 = EDGE_CURVE('',#17480,#16927,#17482,.T.);
+#17480 = VERTEX_POINT('',#17481);
+#17481 = CARTESIAN_POINT('',(-3.6725,-11.705,-3.5));
+#17482 = SURFACE_CURVE('',#17483,(#17487,#17494),.PCURVE_S1.);
+#17483 = LINE('',#17484,#17485);
+#17484 = CARTESIAN_POINT('',(-3.6725,-11.705,-3.5));
+#17485 = VECTOR('',#17486,1.);
+#17486 = DIRECTION('',(-1.,0.,0.));
+#17487 = PCURVE('',#16942,#17488);
+#17488 = DEFINITIONAL_REPRESENTATION('',(#17489),#17493);
+#17489 = LINE('',#17490,#17491);
+#17490 = CARTESIAN_POINT('',(3.5,0.));
+#17491 = VECTOR('',#17492,1.);
+#17492 = DIRECTION('',(0.,-1.));
+#17493 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17494 = PCURVE('',#16970,#17495);
+#17495 = DEFINITIONAL_REPRESENTATION('',(#17496),#17500);
+#17496 = LINE('',#17497,#17498);
+#17497 = CARTESIAN_POINT('',(3.330669073875E-16,0.));
+#17498 = VECTOR('',#17499,1.);
+#17499 = DIRECTION('',(0.,-1.));
+#17500 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17501 = ORIENTED_EDGE('',*,*,#17502,.F.);
+#17502 = EDGE_CURVE('',#17313,#17480,#17503,.T.);
+#17503 = SURFACE_CURVE('',#17504,(#17508,#17515),.PCURVE_S1.);
+#17504 = LINE('',#17505,#17506);
+#17505 = CARTESIAN_POINT('',(-3.6725,-11.705,0.));
+#17506 = VECTOR('',#17507,1.);
+#17507 = DIRECTION('',(0.,0.,-1.));
+#17508 = PCURVE('',#16942,#17509);
+#17509 = DEFINITIONAL_REPRESENTATION('',(#17510),#17514);
+#17510 = LINE('',#17511,#17512);
+#17511 = CARTESIAN_POINT('',(0.,0.));
+#17512 = VECTOR('',#17513,1.);
+#17513 = DIRECTION('',(1.,0.));
+#17514 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17515 = PCURVE('',#17191,#17516);
+#17516 = DEFINITIONAL_REPRESENTATION('',(#17517),#17521);
+#17517 = LINE('',#17518,#17519);
+#17518 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#17519 = VECTOR('',#17520,1.);
+#17520 = DIRECTION('',(0.,-1.));
+#17521 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17522 = ADVANCED_FACE('',(#17523),#17026,.T.);
+#17523 = FACE_BOUND('',#17524,.T.);
+#17524 = EDGE_LOOP('',(#17525,#17548,#17549,#17550));
+#17525 = ORIENTED_EDGE('',*,*,#17526,.T.);
+#17526 = EDGE_CURVE('',#17527,#16983,#17529,.T.);
+#17527 = VERTEX_POINT('',#17528);
+#17528 = CARTESIAN_POINT('',(-3.6725,-11.155,0.));
+#17529 = SURFACE_CURVE('',#17530,(#17534,#17541),.PCURVE_S1.);
+#17530 = LINE('',#17531,#17532);
+#17531 = CARTESIAN_POINT('',(-3.6725,-11.155,0.));
+#17532 = VECTOR('',#17533,1.);
+#17533 = DIRECTION('',(-1.,0.,0.));
+#17534 = PCURVE('',#17026,#17535);
+#17535 = DEFINITIONAL_REPRESENTATION('',(#17536),#17540);
+#17536 = LINE('',#17537,#17538);
+#17537 = CARTESIAN_POINT('',(-6.280369834735E-16,0.));
+#17538 = VECTOR('',#17539,1.);
+#17539 = DIRECTION('',(0.,-1.));
+#17540 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17541 = PCURVE('',#16998,#17542);
+#17542 = DEFINITIONAL_REPRESENTATION('',(#17543),#17547);
+#17543 = LINE('',#17544,#17545);
+#17544 = CARTESIAN_POINT('',(3.5,0.));
+#17545 = VECTOR('',#17546,1.);
+#17546 = DIRECTION('',(0.,-1.));
+#17547 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17548 = ORIENTED_EDGE('',*,*,#17010,.T.);
+#17549 = ORIENTED_EDGE('',*,*,#17453,.F.);
+#17550 = ORIENTED_EDGE('',*,*,#17551,.F.);
+#17551 = EDGE_CURVE('',#17527,#17431,#17552,.T.);
+#17552 = SURFACE_CURVE('',#17553,(#17557,#17564),.PCURVE_S1.);
+#17553 = LINE('',#17554,#17555);
+#17554 = CARTESIAN_POINT('',(-3.6725,-11.155,0.));
+#17555 = VECTOR('',#17556,1.);
+#17556 = DIRECTION('',(0.,0.707106781187,0.707106781187));
+#17557 = PCURVE('',#17026,#17558);
+#17558 = DEFINITIONAL_REPRESENTATION('',(#17559),#17563);
+#17559 = LINE('',#17560,#17561);
+#17560 = CARTESIAN_POINT('',(0.,0.));
+#17561 = VECTOR('',#17562,1.);
+#17562 = DIRECTION('',(1.,0.));
+#17563 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17564 = PCURVE('',#17191,#17565);
+#17565 = DEFINITIONAL_REPRESENTATION('',(#17566),#17570);
+#17566 = LINE('',#17567,#17568);
+#17567 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#17568 = VECTOR('',#17569,1.);
+#17569 = DIRECTION('',(0.707106781187,0.707106781187));
+#17570 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17571 = ADVANCED_FACE('',(#17572),#16970,.T.);
+#17572 = FACE_BOUND('',#17573,.T.);
+#17573 = EDGE_LOOP('',(#17574,#17575,#17576,#17599));
+#17574 = ORIENTED_EDGE('',*,*,#17479,.T.);
+#17575 = ORIENTED_EDGE('',*,*,#16954,.T.);
+#17576 = ORIENTED_EDGE('',*,*,#17577,.F.);
+#17577 = EDGE_CURVE('',#17578,#16955,#17580,.T.);
+#17578 = VERTEX_POINT('',#17579);
+#17579 = CARTESIAN_POINT('',(-3.6725,-11.155,-3.5));
+#17580 = SURFACE_CURVE('',#17581,(#17585,#17592),.PCURVE_S1.);
+#17581 = LINE('',#17582,#17583);
+#17582 = CARTESIAN_POINT('',(-3.6725,-11.155,-3.5));
+#17583 = VECTOR('',#17584,1.);
+#17584 = DIRECTION('',(-1.,0.,0.));
+#17585 = PCURVE('',#16970,#17586);
+#17586 = DEFINITIONAL_REPRESENTATION('',(#17587),#17591);
+#17587 = LINE('',#17588,#17589);
+#17588 = CARTESIAN_POINT('',(0.55,0.));
+#17589 = VECTOR('',#17590,1.);
+#17590 = DIRECTION('',(0.,-1.));
+#17591 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17592 = PCURVE('',#16998,#17593);
+#17593 = DEFINITIONAL_REPRESENTATION('',(#17594),#17598);
+#17594 = LINE('',#17595,#17596);
+#17595 = CARTESIAN_POINT('',(0.,0.));
+#17596 = VECTOR('',#17597,1.);
+#17597 = DIRECTION('',(0.,-1.));
+#17598 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17599 = ORIENTED_EDGE('',*,*,#17600,.F.);
+#17600 = EDGE_CURVE('',#17480,#17578,#17601,.T.);
+#17601 = SURFACE_CURVE('',#17602,(#17606,#17613),.PCURVE_S1.);
+#17602 = LINE('',#17603,#17604);
+#17603 = CARTESIAN_POINT('',(-3.6725,-11.705,-3.5));
+#17604 = VECTOR('',#17605,1.);
+#17605 = DIRECTION('',(0.,1.,0.));
+#17606 = PCURVE('',#16970,#17607);
+#17607 = DEFINITIONAL_REPRESENTATION('',(#17608),#17612);
+#17608 = LINE('',#17609,#17610);
+#17609 = CARTESIAN_POINT('',(0.,0.));
+#17610 = VECTOR('',#17611,1.);
+#17611 = DIRECTION('',(1.,0.));
+#17612 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17613 = PCURVE('',#17191,#17614);
+#17614 = DEFINITIONAL_REPRESENTATION('',(#17615),#17619);
+#17615 = LINE('',#17616,#17617);
+#17616 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#17617 = VECTOR('',#17618,1.);
+#17618 = DIRECTION('',(1.,-2.226071387182E-62));
+#17619 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17620 = ADVANCED_FACE('',(#17621),#16998,.T.);
+#17621 = FACE_BOUND('',#17622,.T.);
+#17622 = EDGE_LOOP('',(#17623,#17624,#17625,#17626));
+#17623 = ORIENTED_EDGE('',*,*,#17577,.T.);
+#17624 = ORIENTED_EDGE('',*,*,#16982,.T.);
+#17625 = ORIENTED_EDGE('',*,*,#17526,.F.);
+#17626 = ORIENTED_EDGE('',*,*,#17627,.F.);
+#17627 = EDGE_CURVE('',#17578,#17527,#17628,.T.);
+#17628 = SURFACE_CURVE('',#17629,(#17633,#17640),.PCURVE_S1.);
+#17629 = LINE('',#17630,#17631);
+#17630 = CARTESIAN_POINT('',(-3.6725,-11.155,-3.5));
+#17631 = VECTOR('',#17632,1.);
+#17632 = DIRECTION('',(0.,0.,1.));
+#17633 = PCURVE('',#16998,#17634);
+#17634 = DEFINITIONAL_REPRESENTATION('',(#17635),#17639);
+#17635 = LINE('',#17636,#17637);
+#17636 = CARTESIAN_POINT('',(0.,0.));
+#17637 = VECTOR('',#17638,1.);
+#17638 = DIRECTION('',(1.,0.));
+#17639 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17640 = PCURVE('',#17191,#17641);
+#17641 = DEFINITIONAL_REPRESENTATION('',(#17642),#17646);
+#17642 = LINE('',#17643,#17644);
+#17643 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#17644 = VECTOR('',#17645,1.);
+#17645 = DIRECTION('',(0.,1.));
+#17646 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17647 = ADVANCED_FACE('',(#17648),#17113,.T.);
+#17648 = FACE_BOUND('',#17649,.T.);
+#17649 = EDGE_LOOP('',(#17650,#17651,#17672,#17673));
+#17650 = ORIENTED_EDGE('',*,*,#17095,.F.);
+#17651 = ORIENTED_EDGE('',*,*,#17652,.T.);
+#17652 = EDGE_CURVE('',#17096,#17362,#17653,.T.);
+#17653 = SURFACE_CURVE('',#17654,(#17658,#17665),.PCURVE_S1.);
+#17654 = LINE('',#17655,#17656);
+#17655 = CARTESIAN_POINT('',(-3.175,-11.98,2.56));
+#17656 = VECTOR('',#17657,1.);
+#17657 = DIRECTION('',(0.,1.,0.));
+#17658 = PCURVE('',#17113,#17659);
+#17659 = DEFINITIONAL_REPRESENTATION('',(#17660),#17664);
+#17660 = LINE('',#17661,#17662);
+#17661 = CARTESIAN_POINT('',(-0.55,-0.38625));
+#17662 = VECTOR('',#17663,1.);
+#17663 = DIRECTION('',(1.,6.285707653525E-60));
+#17664 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17665 = PCURVE('',#17245,#17666);
+#17666 = DEFINITIONAL_REPRESENTATION('',(#17667),#17671);
+#17667 = LINE('',#17668,#17669);
+#17668 = CARTESIAN_POINT('',(0.275,0.));
+#17669 = VECTOR('',#17670,1.);
+#17670 = DIRECTION('',(0.,-1.));
+#17671 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17672 = ORIENTED_EDGE('',*,*,#17361,.F.);
+#17673 = ORIENTED_EDGE('',*,*,#17284,.T.);
+#17674 = ADVANCED_FACE('',(#17675),#17245,.T.);
+#17675 = FACE_BOUND('',#17676,.T.);
+#17676 = EDGE_LOOP('',(#17677,#17678,#17699,#17700));
+#17677 = ORIENTED_EDGE('',*,*,#17231,.F.);
+#17678 = ORIENTED_EDGE('',*,*,#17679,.T.);
+#17679 = EDGE_CURVE('',#17204,#17385,#17680,.T.);
+#17680 = SURFACE_CURVE('',#17681,(#17685,#17692),.PCURVE_S1.);
+#17681 = LINE('',#17682,#17683);
+#17682 = CARTESIAN_POINT('',(-3.175,-11.98,2.285));
+#17683 = VECTOR('',#17684,1.);
+#17684 = DIRECTION('',(0.,1.,0.));
+#17685 = PCURVE('',#17245,#17686);
+#17686 = DEFINITIONAL_REPRESENTATION('',(#17687),#17691);
+#17687 = LINE('',#17688,#17689);
+#17688 = CARTESIAN_POINT('',(0.,0.));
+#17689 = VECTOR('',#17690,1.);
+#17690 = DIRECTION('',(0.,-1.));
+#17691 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17692 = PCURVE('',#17219,#17693);
+#17693 = DEFINITIONAL_REPRESENTATION('',(#17694),#17698);
+#17694 = LINE('',#17695,#17696);
+#17695 = CARTESIAN_POINT('',(0.4975,0.));
+#17696 = VECTOR('',#17697,1.);
+#17697 = DIRECTION('',(0.,1.));
+#17698 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17699 = ORIENTED_EDGE('',*,*,#17384,.T.);
+#17700 = ORIENTED_EDGE('',*,*,#17652,.F.);
+#17701 = ADVANCED_FACE('',(#17702),#17219,.F.);
+#17702 = FACE_BOUND('',#17703,.F.);
+#17703 = EDGE_LOOP('',(#17704,#17725,#17726,#17727));
+#17704 = ORIENTED_EDGE('',*,*,#17705,.F.);
+#17705 = EDGE_CURVE('',#17176,#17408,#17706,.T.);
+#17706 = SURFACE_CURVE('',#17707,(#17711,#17718),.PCURVE_S1.);
+#17707 = LINE('',#17708,#17709);
+#17708 = CARTESIAN_POINT('',(-3.6725,-11.98,2.285));
+#17709 = VECTOR('',#17710,1.);
+#17710 = DIRECTION('',(0.,1.,0.));
+#17711 = PCURVE('',#17219,#17712);
+#17712 = DEFINITIONAL_REPRESENTATION('',(#17713),#17717);
+#17713 = LINE('',#17714,#17715);
+#17714 = CARTESIAN_POINT('',(0.,0.));
+#17715 = VECTOR('',#17716,1.);
+#17716 = DIRECTION('',(0.,1.));
+#17717 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17718 = PCURVE('',#17191,#17719);
+#17719 = DEFINITIONAL_REPRESENTATION('',(#17720),#17724);
+#17720 = LINE('',#17721,#17722);
+#17721 = CARTESIAN_POINT('',(-0.55,2.62605853382));
+#17722 = VECTOR('',#17723,1.);
+#17723 = DIRECTION('',(1.,-2.226071387182E-62));
+#17724 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17725 = ORIENTED_EDGE('',*,*,#17203,.T.);
+#17726 = ORIENTED_EDGE('',*,*,#17679,.T.);
+#17727 = ORIENTED_EDGE('',*,*,#17407,.F.);
+#17728 = ADVANCED_FACE('',(#17729),#17191,.T.);
+#17729 = FACE_BOUND('',#17730,.T.);
+#17730 = EDGE_LOOP('',(#17731,#17732,#17733,#17734,#17735,#17736,#17737,
+ #17738));
+#17731 = ORIENTED_EDGE('',*,*,#17430,.T.);
+#17732 = ORIENTED_EDGE('',*,*,#17705,.F.);
+#17733 = ORIENTED_EDGE('',*,*,#17175,.T.);
+#17734 = ORIENTED_EDGE('',*,*,#17335,.T.);
+#17735 = ORIENTED_EDGE('',*,*,#17502,.T.);
+#17736 = ORIENTED_EDGE('',*,*,#17600,.T.);
+#17737 = ORIENTED_EDGE('',*,*,#17627,.T.);
+#17738 = ORIENTED_EDGE('',*,*,#17551,.T.);
+#17739 = MANIFOLD_SOLID_BREP('',#17740);
+#17740 = CLOSED_SHELL('',(#17741,#17973,#18138,#18188,#18237,#18355,
+ #18404,#18453,#18502,#18529,#18556,#18583,#18610));
+#17741 = ADVANCED_FACE('',(#17742),#17756,.F.);
+#17742 = FACE_BOUND('',#17743,.F.);
+#17743 = EDGE_LOOP('',(#17744,#17779,#17807,#17835,#17863,#17891,#17919,
+ #17947));
+#17744 = ORIENTED_EDGE('',*,*,#17745,.T.);
+#17745 = EDGE_CURVE('',#17746,#17748,#17750,.T.);
+#17746 = VERTEX_POINT('',#17747);
+#17747 = CARTESIAN_POINT('',(3.9475,-10.88,2.4225));
+#17748 = VERTEX_POINT('',#17749);
+#17749 = CARTESIAN_POINT('',(3.9475,-10.88,0.275));
+#17750 = SURFACE_CURVE('',#17751,(#17755,#17767),.PCURVE_S1.);
+#17751 = LINE('',#17752,#17753);
+#17752 = CARTESIAN_POINT('',(3.9475,-10.88,2.56));
+#17753 = VECTOR('',#17754,1.);
+#17754 = DIRECTION('',(0.,0.,-1.));
+#17755 = PCURVE('',#17756,#17761);
+#17756 = PLANE('',#17757);
+#17757 = AXIS2_PLACEMENT_3D('',#17758,#17759,#17760);
+#17758 = CARTESIAN_POINT('',(3.9475,-11.43,-0.34105853382));
+#17759 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#17760 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#17761 = DEFINITIONAL_REPRESENTATION('',(#17762),#17766);
+#17762 = LINE('',#17763,#17764);
+#17763 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#17764 = VECTOR('',#17765,1.);
+#17765 = DIRECTION('',(0.,-1.));
+#17766 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17767 = PCURVE('',#17768,#17773);
+#17768 = PLANE('',#17769);
+#17769 = AXIS2_PLACEMENT_3D('',#17770,#17771,#17772);
+#17770 = CARTESIAN_POINT('',(3.724778209321,-10.88,1.581028209321));
+#17771 = DIRECTION('',(3.17453643318E-29,1.,2.111838454822E-30));
+#17772 = DIRECTION('',(1.,-3.17453643318E-29,0.));
+#17773 = DEFINITIONAL_REPRESENTATION('',(#17774),#17778);
+#17774 = LINE('',#17775,#17776);
+#17775 = CARTESIAN_POINT('',(0.222721790679,-0.978971790679));
+#17776 = VECTOR('',#17777,1.);
+#17777 = DIRECTION('',(0.,1.));
+#17778 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17779 = ORIENTED_EDGE('',*,*,#17780,.T.);
+#17780 = EDGE_CURVE('',#17748,#17781,#17783,.T.);
+#17781 = VERTEX_POINT('',#17782);
+#17782 = CARTESIAN_POINT('',(3.9475,-11.155,0.));
+#17783 = SURFACE_CURVE('',#17784,(#17788,#17795),.PCURVE_S1.);
+#17784 = LINE('',#17785,#17786);
+#17785 = CARTESIAN_POINT('',(3.9475,-10.88,0.275));
+#17786 = VECTOR('',#17787,1.);
+#17787 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#17788 = PCURVE('',#17756,#17789);
+#17789 = DEFINITIONAL_REPRESENTATION('',(#17790),#17794);
+#17790 = LINE('',#17791,#17792);
+#17791 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#17792 = VECTOR('',#17793,1.);
+#17793 = DIRECTION('',(0.707106781187,-0.707106781187));
+#17794 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17795 = PCURVE('',#17796,#17801);
+#17796 = PLANE('',#17797);
+#17797 = AXIS2_PLACEMENT_3D('',#17798,#17799,#17800);
+#17798 = CARTESIAN_POINT('',(3.6725,-10.88,0.275));
+#17799 = DIRECTION('',(0.,0.707106781187,-0.707106781187));
+#17800 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#17801 = DEFINITIONAL_REPRESENTATION('',(#17802),#17806);
+#17802 = LINE('',#17803,#17804);
+#17803 = CARTESIAN_POINT('',(0.,-0.275));
+#17804 = VECTOR('',#17805,1.);
+#17805 = DIRECTION('',(1.,0.));
+#17806 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17807 = ORIENTED_EDGE('',*,*,#17808,.T.);
+#17808 = EDGE_CURVE('',#17781,#17809,#17811,.T.);
+#17809 = VERTEX_POINT('',#17810);
+#17810 = CARTESIAN_POINT('',(3.9475,-11.155,-3.5));
+#17811 = SURFACE_CURVE('',#17812,(#17816,#17823),.PCURVE_S1.);
+#17812 = LINE('',#17813,#17814);
+#17813 = CARTESIAN_POINT('',(3.9475,-11.155,0.));
+#17814 = VECTOR('',#17815,1.);
+#17815 = DIRECTION('',(0.,0.,-1.));
+#17816 = PCURVE('',#17756,#17817);
+#17817 = DEFINITIONAL_REPRESENTATION('',(#17818),#17822);
+#17818 = LINE('',#17819,#17820);
+#17819 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#17820 = VECTOR('',#17821,1.);
+#17821 = DIRECTION('',(0.,-1.));
+#17822 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17823 = PCURVE('',#17824,#17829);
+#17824 = PLANE('',#17825);
+#17825 = AXIS2_PLACEMENT_3D('',#17826,#17827,#17828);
+#17826 = CARTESIAN_POINT('',(3.6725,-11.155,0.));
+#17827 = DIRECTION('',(0.,1.,0.));
+#17828 = DIRECTION('',(0.,0.,-1.));
+#17829 = DEFINITIONAL_REPRESENTATION('',(#17830),#17834);
+#17830 = LINE('',#17831,#17832);
+#17831 = CARTESIAN_POINT('',(0.,-0.275));
+#17832 = VECTOR('',#17833,1.);
+#17833 = DIRECTION('',(1.,0.));
+#17834 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17835 = ORIENTED_EDGE('',*,*,#17836,.T.);
+#17836 = EDGE_CURVE('',#17809,#17837,#17839,.T.);
+#17837 = VERTEX_POINT('',#17838);
+#17838 = CARTESIAN_POINT('',(3.9475,-11.705,-3.5));
+#17839 = SURFACE_CURVE('',#17840,(#17844,#17851),.PCURVE_S1.);
+#17840 = LINE('',#17841,#17842);
+#17841 = CARTESIAN_POINT('',(3.9475,-11.155,-3.5));
+#17842 = VECTOR('',#17843,1.);
+#17843 = DIRECTION('',(0.,-1.,0.));
+#17844 = PCURVE('',#17756,#17845);
+#17845 = DEFINITIONAL_REPRESENTATION('',(#17846),#17850);
+#17846 = LINE('',#17847,#17848);
+#17847 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#17848 = VECTOR('',#17849,1.);
+#17849 = DIRECTION('',(1.,2.226071387182E-62));
+#17850 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17851 = PCURVE('',#17852,#17857);
+#17852 = PLANE('',#17853);
+#17853 = AXIS2_PLACEMENT_3D('',#17854,#17855,#17856);
+#17854 = CARTESIAN_POINT('',(3.6725,-11.155,-3.5));
+#17855 = DIRECTION('',(0.,0.,-1.));
+#17856 = DIRECTION('',(0.,-1.,0.));
+#17857 = DEFINITIONAL_REPRESENTATION('',(#17858),#17862);
+#17858 = LINE('',#17859,#17860);
+#17859 = CARTESIAN_POINT('',(0.,-0.275));
+#17860 = VECTOR('',#17861,1.);
+#17861 = DIRECTION('',(1.,0.));
+#17862 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17863 = ORIENTED_EDGE('',*,*,#17864,.T.);
+#17864 = EDGE_CURVE('',#17837,#17865,#17867,.T.);
+#17865 = VERTEX_POINT('',#17866);
+#17866 = CARTESIAN_POINT('',(3.9475,-11.705,0.));
+#17867 = SURFACE_CURVE('',#17868,(#17872,#17879),.PCURVE_S1.);
+#17868 = LINE('',#17869,#17870);
+#17869 = CARTESIAN_POINT('',(3.9475,-11.705,-3.5));
+#17870 = VECTOR('',#17871,1.);
+#17871 = DIRECTION('',(0.,0.,1.));
+#17872 = PCURVE('',#17756,#17873);
+#17873 = DEFINITIONAL_REPRESENTATION('',(#17874),#17878);
+#17874 = LINE('',#17875,#17876);
+#17875 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#17876 = VECTOR('',#17877,1.);
+#17877 = DIRECTION('',(0.,1.));
+#17878 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17879 = PCURVE('',#17880,#17885);
+#17880 = PLANE('',#17881);
+#17881 = AXIS2_PLACEMENT_3D('',#17882,#17883,#17884);
+#17882 = CARTESIAN_POINT('',(3.6725,-11.705,-3.5));
+#17883 = DIRECTION('',(0.,-1.,0.));
+#17884 = DIRECTION('',(0.,0.,1.));
+#17885 = DEFINITIONAL_REPRESENTATION('',(#17886),#17890);
+#17886 = LINE('',#17887,#17888);
+#17887 = CARTESIAN_POINT('',(0.,-0.275));
+#17888 = VECTOR('',#17889,1.);
+#17889 = DIRECTION('',(1.,0.));
+#17890 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17891 = ORIENTED_EDGE('',*,*,#17892,.T.);
+#17892 = EDGE_CURVE('',#17865,#17893,#17895,.T.);
+#17893 = VERTEX_POINT('',#17894);
+#17894 = CARTESIAN_POINT('',(3.9475,-11.98,0.275));
+#17895 = SURFACE_CURVE('',#17896,(#17900,#17907),.PCURVE_S1.);
+#17896 = LINE('',#17897,#17898);
+#17897 = CARTESIAN_POINT('',(3.9475,-11.705,0.));
+#17898 = VECTOR('',#17899,1.);
+#17899 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#17900 = PCURVE('',#17756,#17901);
+#17901 = DEFINITIONAL_REPRESENTATION('',(#17902),#17906);
+#17902 = LINE('',#17903,#17904);
+#17903 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#17904 = VECTOR('',#17905,1.);
+#17905 = DIRECTION('',(0.707106781187,0.707106781187));
+#17906 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17907 = PCURVE('',#17908,#17913);
+#17908 = PLANE('',#17909);
+#17909 = AXIS2_PLACEMENT_3D('',#17910,#17911,#17912);
+#17910 = CARTESIAN_POINT('',(3.6725,-11.705,0.));
+#17911 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#17912 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#17913 = DEFINITIONAL_REPRESENTATION('',(#17914),#17918);
+#17914 = LINE('',#17915,#17916);
+#17915 = CARTESIAN_POINT('',(0.,-0.275));
+#17916 = VECTOR('',#17917,1.);
+#17917 = DIRECTION('',(1.,0.));
+#17918 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17919 = ORIENTED_EDGE('',*,*,#17920,.T.);
+#17920 = EDGE_CURVE('',#17893,#17921,#17923,.T.);
+#17921 = VERTEX_POINT('',#17922);
+#17922 = CARTESIAN_POINT('',(3.9475,-11.98,2.4225));
+#17923 = SURFACE_CURVE('',#17924,(#17928,#17935),.PCURVE_S1.);
+#17924 = LINE('',#17925,#17926);
+#17925 = CARTESIAN_POINT('',(3.9475,-11.98,0.275));
+#17926 = VECTOR('',#17927,1.);
+#17927 = DIRECTION('',(0.,0.,1.));
+#17928 = PCURVE('',#17756,#17929);
+#17929 = DEFINITIONAL_REPRESENTATION('',(#17930),#17934);
+#17930 = LINE('',#17931,#17932);
+#17931 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#17932 = VECTOR('',#17933,1.);
+#17933 = DIRECTION('',(0.,1.));
+#17934 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17935 = PCURVE('',#17936,#17941);
+#17936 = PLANE('',#17937);
+#17937 = AXIS2_PLACEMENT_3D('',#17938,#17939,#17940);
+#17938 = CARTESIAN_POINT('',(3.724778209321,-11.98,1.581028209321));
+#17939 = DIRECTION('',(1.308440111004E-29,-1.,1.156108129756E-30));
+#17940 = DIRECTION('',(-1.,-1.308440111004E-29,0.));
+#17941 = DEFINITIONAL_REPRESENTATION('',(#17942),#17946);
+#17942 = LINE('',#17943,#17944);
+#17943 = CARTESIAN_POINT('',(-0.222721790679,1.306028209321));
+#17944 = VECTOR('',#17945,1.);
+#17945 = DIRECTION('',(0.,-1.));
+#17946 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17947 = ORIENTED_EDGE('',*,*,#17948,.T.);
+#17948 = EDGE_CURVE('',#17921,#17746,#17949,.T.);
+#17949 = SURFACE_CURVE('',#17950,(#17954,#17961),.PCURVE_S1.);
+#17950 = LINE('',#17951,#17952);
+#17951 = CARTESIAN_POINT('',(3.9475,-11.98,2.4225));
+#17952 = VECTOR('',#17953,1.);
+#17953 = DIRECTION('',(0.,1.,0.));
+#17954 = PCURVE('',#17756,#17955);
+#17955 = DEFINITIONAL_REPRESENTATION('',(#17956),#17960);
+#17956 = LINE('',#17957,#17958);
+#17957 = CARTESIAN_POINT('',(0.55,2.76355853382));
+#17958 = VECTOR('',#17959,1.);
+#17959 = DIRECTION('',(-1.,-2.226071387182E-62));
+#17960 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17961 = PCURVE('',#17962,#17967);
+#17962 = CYLINDRICAL_SURFACE('',#17963,0.1375);
+#17963 = AXIS2_PLACEMENT_3D('',#17964,#17965,#17966);
+#17964 = CARTESIAN_POINT('',(3.81,-11.98,2.4225));
+#17965 = DIRECTION('',(0.,1.,0.));
+#17966 = DIRECTION('',(1.,0.,-9.8088568672E-33));
+#17967 = DEFINITIONAL_REPRESENTATION('',(#17968),#17972);
+#17968 = LINE('',#17969,#17970);
+#17969 = CARTESIAN_POINT('',(-0.,0.));
+#17970 = VECTOR('',#17971,1.);
+#17971 = DIRECTION('',(-0.,1.));
+#17972 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17973 = ADVANCED_FACE('',(#17974),#17768,.T.);
+#17974 = FACE_BOUND('',#17975,.T.);
+#17975 = EDGE_LOOP('',(#17976,#18006,#18032,#18033,#18056,#18084,#18112)
+ );
+#17976 = ORIENTED_EDGE('',*,*,#17977,.T.);
+#17977 = EDGE_CURVE('',#17978,#17980,#17982,.T.);
+#17978 = VERTEX_POINT('',#17979);
+#17979 = CARTESIAN_POINT('',(3.175,-10.88,2.56));
+#17980 = VERTEX_POINT('',#17981);
+#17981 = CARTESIAN_POINT('',(3.81,-10.88,2.56));
+#17982 = SURFACE_CURVE('',#17983,(#17987,#17994),.PCURVE_S1.);
+#17983 = LINE('',#17984,#17985);
+#17984 = CARTESIAN_POINT('',(3.6725,-10.88,2.56));
+#17985 = VECTOR('',#17986,1.);
+#17986 = DIRECTION('',(1.,0.,0.));
+#17987 = PCURVE('',#17768,#17988);
+#17988 = DEFINITIONAL_REPRESENTATION('',(#17989),#17993);
+#17989 = LINE('',#17990,#17991);
+#17990 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#17991 = VECTOR('',#17992,1.);
+#17992 = DIRECTION('',(1.,6.704108115824E-59));
+#17993 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#17994 = PCURVE('',#17995,#18000);
+#17995 = PLANE('',#17996);
+#17996 = AXIS2_PLACEMENT_3D('',#17997,#17998,#17999);
+#17997 = CARTESIAN_POINT('',(3.56125,-11.43,2.56));
+#17998 = DIRECTION('',(-1.657312278749E-30,-1.304555144269E-30,1.));
+#17999 = DIRECTION('',(1.,0.,1.657312278749E-30));
+#18000 = DEFINITIONAL_REPRESENTATION('',(#18001),#18005);
+#18001 = LINE('',#18002,#18003);
+#18002 = CARTESIAN_POINT('',(0.11125,0.55));
+#18003 = VECTOR('',#18004,1.);
+#18004 = DIRECTION('',(1.,-2.162055258902E-60));
+#18005 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18006 = ORIENTED_EDGE('',*,*,#18007,.F.);
+#18007 = EDGE_CURVE('',#17746,#17980,#18008,.T.);
+#18008 = SURFACE_CURVE('',#18009,(#18014,#18025),.PCURVE_S1.);
+#18009 = CIRCLE('',#18010,0.1375);
+#18010 = AXIS2_PLACEMENT_3D('',#18011,#18012,#18013);
+#18011 = CARTESIAN_POINT('',(3.81,-10.88,2.4225));
+#18012 = DIRECTION('',(0.,-1.,0.));
+#18013 = DIRECTION('',(0.,0.,1.));
+#18014 = PCURVE('',#17768,#18015);
+#18015 = DEFINITIONAL_REPRESENTATION('',(#18016),#18024);
+#18016 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#18017,#18018,#18019,#18020
+ ,#18021,#18022,#18023),.UNSPECIFIED.,.F.,.F.)
+B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),(-2.094395102393,0.,
+ 2.094395102393,4.188790204786,6.28318530718,8.377580409573),
+.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM()
+RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM(
+ '') );
+#18017 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#18018 = CARTESIAN_POINT('',(-0.152935195362,-0.978971790679));
+#18019 = CARTESIAN_POINT('',(-3.38567023417E-02,-0.772721790679));
+#18020 = CARTESIAN_POINT('',(8.522179067866E-02,-0.566471790679));
+#18021 = CARTESIAN_POINT('',(0.204300283699,-0.772721790679));
+#18022 = CARTESIAN_POINT('',(0.323378776719,-0.978971790679));
+#18023 = CARTESIAN_POINT('',(8.522179067866E-02,-0.978971790679));
+#18024 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18025 = PCURVE('',#17962,#18026);
+#18026 = DEFINITIONAL_REPRESENTATION('',(#18027),#18031);
+#18027 = LINE('',#18028,#18029);
+#18028 = CARTESIAN_POINT('',(4.712388980385,1.1));
+#18029 = VECTOR('',#18030,1.);
+#18030 = DIRECTION('',(-1.,0.));
+#18031 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18032 = ORIENTED_EDGE('',*,*,#17745,.T.);
+#18033 = ORIENTED_EDGE('',*,*,#18034,.F.);
+#18034 = EDGE_CURVE('',#18035,#17748,#18037,.T.);
+#18035 = VERTEX_POINT('',#18036);
+#18036 = CARTESIAN_POINT('',(3.6725,-10.88,0.275));
+#18037 = SURFACE_CURVE('',#18038,(#18042,#18049),.PCURVE_S1.);
+#18038 = LINE('',#18039,#18040);
+#18039 = CARTESIAN_POINT('',(3.6725,-10.88,0.275));
+#18040 = VECTOR('',#18041,1.);
+#18041 = DIRECTION('',(1.,0.,0.));
+#18042 = PCURVE('',#17768,#18043);
+#18043 = DEFINITIONAL_REPRESENTATION('',(#18044),#18048);
+#18044 = LINE('',#18045,#18046);
+#18045 = CARTESIAN_POINT('',(-5.227820932134E-02,1.306028209321));
+#18046 = VECTOR('',#18047,1.);
+#18047 = DIRECTION('',(1.,6.704108115824E-59));
+#18048 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18049 = PCURVE('',#17796,#18050);
+#18050 = DEFINITIONAL_REPRESENTATION('',(#18051),#18055);
+#18051 = LINE('',#18052,#18053);
+#18052 = CARTESIAN_POINT('',(4.710277376051E-16,0.));
+#18053 = VECTOR('',#18054,1.);
+#18054 = DIRECTION('',(0.,-1.));
+#18055 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18056 = ORIENTED_EDGE('',*,*,#18057,.F.);
+#18057 = EDGE_CURVE('',#18058,#18035,#18060,.T.);
+#18058 = VERTEX_POINT('',#18059);
+#18059 = CARTESIAN_POINT('',(3.6725,-10.88,2.285));
+#18060 = SURFACE_CURVE('',#18061,(#18065,#18072),.PCURVE_S1.);
+#18061 = LINE('',#18062,#18063);
+#18062 = CARTESIAN_POINT('',(3.6725,-10.88,2.56));
+#18063 = VECTOR('',#18064,1.);
+#18064 = DIRECTION('',(0.,0.,-1.));
+#18065 = PCURVE('',#17768,#18066);
+#18066 = DEFINITIONAL_REPRESENTATION('',(#18067),#18071);
+#18067 = LINE('',#18068,#18069);
+#18068 = CARTESIAN_POINT('',(-5.227820932134E-02,-0.978971790679));
+#18069 = VECTOR('',#18070,1.);
+#18070 = DIRECTION('',(0.,1.));
+#18071 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18072 = PCURVE('',#18073,#18078);
+#18073 = PLANE('',#18074);
+#18074 = AXIS2_PLACEMENT_3D('',#18075,#18076,#18077);
+#18075 = CARTESIAN_POINT('',(3.6725,-11.43,-0.34105853382));
+#18076 = DIRECTION('',(-1.,2.269450372577E-30,9.8088568672E-33));
+#18077 = DIRECTION('',(-2.269450372577E-30,-1.,0.));
+#18078 = DEFINITIONAL_REPRESENTATION('',(#18079),#18083);
+#18079 = LINE('',#18080,#18081);
+#18080 = CARTESIAN_POINT('',(-0.55,2.90105853382));
+#18081 = VECTOR('',#18082,1.);
+#18082 = DIRECTION('',(0.,-1.));
+#18083 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18084 = ORIENTED_EDGE('',*,*,#18085,.F.);
+#18085 = EDGE_CURVE('',#18086,#18058,#18088,.T.);
+#18086 = VERTEX_POINT('',#18087);
+#18087 = CARTESIAN_POINT('',(3.175,-10.88,2.285));
+#18088 = SURFACE_CURVE('',#18089,(#18093,#18100),.PCURVE_S1.);
+#18089 = LINE('',#18090,#18091);
+#18090 = CARTESIAN_POINT('',(3.175,-10.88,2.285));
+#18091 = VECTOR('',#18092,1.);
+#18092 = DIRECTION('',(1.,0.,0.));
+#18093 = PCURVE('',#17768,#18094);
+#18094 = DEFINITIONAL_REPRESENTATION('',(#18095),#18099);
+#18095 = LINE('',#18096,#18097);
+#18096 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#18097 = VECTOR('',#18098,1.);
+#18098 = DIRECTION('',(1.,6.704108115824E-59));
+#18099 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18100 = PCURVE('',#18101,#18106);
+#18101 = PLANE('',#18102);
+#18102 = AXIS2_PLACEMENT_3D('',#18103,#18104,#18105);
+#18103 = CARTESIAN_POINT('',(3.175,-11.98,2.285));
+#18104 = DIRECTION('',(0.,0.,1.));
+#18105 = DIRECTION('',(1.,0.,0.));
+#18106 = DEFINITIONAL_REPRESENTATION('',(#18107),#18111);
+#18107 = LINE('',#18108,#18109);
+#18108 = CARTESIAN_POINT('',(0.,1.1));
+#18109 = VECTOR('',#18110,1.);
+#18110 = DIRECTION('',(1.,0.));
+#18111 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18112 = ORIENTED_EDGE('',*,*,#18113,.T.);
+#18113 = EDGE_CURVE('',#18086,#17978,#18114,.T.);
+#18114 = SURFACE_CURVE('',#18115,(#18119,#18126),.PCURVE_S1.);
+#18115 = LINE('',#18116,#18117);
+#18116 = CARTESIAN_POINT('',(3.175,-10.88,2.285));
+#18117 = VECTOR('',#18118,1.);
+#18118 = DIRECTION('',(0.,0.,1.));
+#18119 = PCURVE('',#17768,#18120);
+#18120 = DEFINITIONAL_REPRESENTATION('',(#18121),#18125);
+#18121 = LINE('',#18122,#18123);
+#18122 = CARTESIAN_POINT('',(-0.549778209321,-0.703971790679));
+#18123 = VECTOR('',#18124,1.);
+#18124 = DIRECTION('',(0.,-1.));
+#18125 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18126 = PCURVE('',#18127,#18132);
+#18127 = PLANE('',#18128);
+#18128 = AXIS2_PLACEMENT_3D('',#18129,#18130,#18131);
+#18129 = CARTESIAN_POINT('',(3.175,-11.98,2.285));
+#18130 = DIRECTION('',(1.,0.,0.));
+#18131 = DIRECTION('',(0.,0.,1.));
+#18132 = DEFINITIONAL_REPRESENTATION('',(#18133),#18137);
+#18133 = LINE('',#18134,#18135);
+#18134 = CARTESIAN_POINT('',(0.,-1.1));
+#18135 = VECTOR('',#18136,1.);
+#18136 = DIRECTION('',(1.,0.));
+#18137 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18138 = ADVANCED_FACE('',(#18139),#17962,.T.);
+#18139 = FACE_BOUND('',#18140,.F.);
+#18140 = EDGE_LOOP('',(#18141,#18165,#18186,#18187));
+#18141 = ORIENTED_EDGE('',*,*,#18142,.T.);
+#18142 = EDGE_CURVE('',#17921,#18143,#18145,.T.);
+#18143 = VERTEX_POINT('',#18144);
+#18144 = CARTESIAN_POINT('',(3.81,-11.98,2.56));
+#18145 = SURFACE_CURVE('',#18146,(#18151,#18158),.PCURVE_S1.);
+#18146 = CIRCLE('',#18147,0.1375);
+#18147 = AXIS2_PLACEMENT_3D('',#18148,#18149,#18150);
+#18148 = CARTESIAN_POINT('',(3.81,-11.98,2.4225));
+#18149 = DIRECTION('',(0.,-1.,0.));
+#18150 = DIRECTION('',(0.,0.,1.));
+#18151 = PCURVE('',#17962,#18152);
+#18152 = DEFINITIONAL_REPRESENTATION('',(#18153),#18157);
+#18153 = LINE('',#18154,#18155);
+#18154 = CARTESIAN_POINT('',(4.712388980385,-1.7763568394E-15));
+#18155 = VECTOR('',#18156,1.);
+#18156 = DIRECTION('',(-1.,0.));
+#18157 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18158 = PCURVE('',#17936,#18159);
+#18159 = DEFINITIONAL_REPRESENTATION('',(#18160),#18164);
+#18160 = CIRCLE('',#18161,0.1375);
+#18161 = AXIS2_PLACEMENT_2D('',#18162,#18163);
+#18162 = CARTESIAN_POINT('',(-8.522179067866E-02,-0.841471790679));
+#18163 = DIRECTION('',(0.,-1.));
+#18164 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18165 = ORIENTED_EDGE('',*,*,#18166,.T.);
+#18166 = EDGE_CURVE('',#18143,#17980,#18167,.T.);
+#18167 = SURFACE_CURVE('',#18168,(#18172,#18179),.PCURVE_S1.);
+#18168 = LINE('',#18169,#18170);
+#18169 = CARTESIAN_POINT('',(3.81,-11.98,2.56));
+#18170 = VECTOR('',#18171,1.);
+#18171 = DIRECTION('',(0.,1.,0.));
+#18172 = PCURVE('',#17962,#18173);
+#18173 = DEFINITIONAL_REPRESENTATION('',(#18174),#18178);
+#18174 = LINE('',#18175,#18176);
+#18175 = CARTESIAN_POINT('',(-1.570796326795,0.));
+#18176 = VECTOR('',#18177,1.);
+#18177 = DIRECTION('',(-0.,1.));
+#18178 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18179 = PCURVE('',#17995,#18180);
+#18180 = DEFINITIONAL_REPRESENTATION('',(#18181),#18185);
+#18181 = LINE('',#18182,#18183);
+#18182 = CARTESIAN_POINT('',(0.24875,-0.55));
+#18183 = VECTOR('',#18184,1.);
+#18184 = DIRECTION('',(0.,1.));
+#18185 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18186 = ORIENTED_EDGE('',*,*,#18007,.F.);
+#18187 = ORIENTED_EDGE('',*,*,#17948,.F.);
+#18188 = ADVANCED_FACE('',(#18189),#17796,.T.);
+#18189 = FACE_BOUND('',#18190,.T.);
+#18190 = EDGE_LOOP('',(#18191,#18192,#18193,#18216));
+#18191 = ORIENTED_EDGE('',*,*,#18034,.T.);
+#18192 = ORIENTED_EDGE('',*,*,#17780,.T.);
+#18193 = ORIENTED_EDGE('',*,*,#18194,.F.);
+#18194 = EDGE_CURVE('',#18195,#17781,#18197,.T.);
+#18195 = VERTEX_POINT('',#18196);
+#18196 = CARTESIAN_POINT('',(3.6725,-11.155,0.));
+#18197 = SURFACE_CURVE('',#18198,(#18202,#18209),.PCURVE_S1.);
+#18198 = LINE('',#18199,#18200);
+#18199 = CARTESIAN_POINT('',(3.6725,-11.155,0.));
+#18200 = VECTOR('',#18201,1.);
+#18201 = DIRECTION('',(1.,0.,0.));
+#18202 = PCURVE('',#17796,#18203);
+#18203 = DEFINITIONAL_REPRESENTATION('',(#18204),#18208);
+#18204 = LINE('',#18205,#18206);
+#18205 = CARTESIAN_POINT('',(0.388908729653,0.));
+#18206 = VECTOR('',#18207,1.);
+#18207 = DIRECTION('',(0.,-1.));
+#18208 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18209 = PCURVE('',#17824,#18210);
+#18210 = DEFINITIONAL_REPRESENTATION('',(#18211),#18215);
+#18211 = LINE('',#18212,#18213);
+#18212 = CARTESIAN_POINT('',(0.,0.));
+#18213 = VECTOR('',#18214,1.);
+#18214 = DIRECTION('',(0.,-1.));
+#18215 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18216 = ORIENTED_EDGE('',*,*,#18217,.F.);
+#18217 = EDGE_CURVE('',#18035,#18195,#18218,.T.);
+#18218 = SURFACE_CURVE('',#18219,(#18223,#18230),.PCURVE_S1.);
+#18219 = LINE('',#18220,#18221);
+#18220 = CARTESIAN_POINT('',(3.6725,-10.88,0.275));
+#18221 = VECTOR('',#18222,1.);
+#18222 = DIRECTION('',(0.,-0.707106781187,-0.707106781187));
+#18223 = PCURVE('',#17796,#18224);
+#18224 = DEFINITIONAL_REPRESENTATION('',(#18225),#18229);
+#18225 = LINE('',#18226,#18227);
+#18226 = CARTESIAN_POINT('',(0.,0.));
+#18227 = VECTOR('',#18228,1.);
+#18228 = DIRECTION('',(1.,0.));
+#18229 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18230 = PCURVE('',#18073,#18231);
+#18231 = DEFINITIONAL_REPRESENTATION('',(#18232),#18236);
+#18232 = LINE('',#18233,#18234);
+#18233 = CARTESIAN_POINT('',(-0.55,0.61605853382));
+#18234 = VECTOR('',#18235,1.);
+#18235 = DIRECTION('',(0.707106781187,-0.707106781187));
+#18236 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18237 = ADVANCED_FACE('',(#18238),#17936,.T.);
+#18238 = FACE_BOUND('',#18239,.T.);
+#18239 = EDGE_LOOP('',(#18240,#18241,#18242,#18265,#18288,#18311,#18334)
+ );
+#18240 = ORIENTED_EDGE('',*,*,#17920,.T.);
+#18241 = ORIENTED_EDGE('',*,*,#18142,.T.);
+#18242 = ORIENTED_EDGE('',*,*,#18243,.F.);
+#18243 = EDGE_CURVE('',#18244,#18143,#18246,.T.);
+#18244 = VERTEX_POINT('',#18245);
+#18245 = CARTESIAN_POINT('',(3.175,-11.98,2.56));
+#18246 = SURFACE_CURVE('',#18247,(#18251,#18258),.PCURVE_S1.);
+#18247 = LINE('',#18248,#18249);
+#18248 = CARTESIAN_POINT('',(3.6725,-11.98,2.56));
+#18249 = VECTOR('',#18250,1.);
+#18250 = DIRECTION('',(1.,0.,0.));
+#18251 = PCURVE('',#17936,#18252);
+#18252 = DEFINITIONAL_REPRESENTATION('',(#18253),#18257);
+#18253 = LINE('',#18254,#18255);
+#18254 = CARTESIAN_POINT('',(5.227820932134E-02,-0.978971790679));
+#18255 = VECTOR('',#18256,1.);
+#18256 = DIRECTION('',(-1.,1.51269824963E-59));
+#18257 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18258 = PCURVE('',#17995,#18259);
+#18259 = DEFINITIONAL_REPRESENTATION('',(#18260),#18264);
+#18260 = LINE('',#18261,#18262);
+#18261 = CARTESIAN_POINT('',(0.11125,-0.55));
+#18262 = VECTOR('',#18263,1.);
+#18263 = DIRECTION('',(1.,-2.162055258902E-60));
+#18264 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18265 = ORIENTED_EDGE('',*,*,#18266,.F.);
+#18266 = EDGE_CURVE('',#18267,#18244,#18269,.T.);
+#18267 = VERTEX_POINT('',#18268);
+#18268 = CARTESIAN_POINT('',(3.175,-11.98,2.285));
+#18269 = SURFACE_CURVE('',#18270,(#18274,#18281),.PCURVE_S1.);
+#18270 = LINE('',#18271,#18272);
+#18271 = CARTESIAN_POINT('',(3.175,-11.98,2.285));
+#18272 = VECTOR('',#18273,1.);
+#18273 = DIRECTION('',(0.,0.,1.));
+#18274 = PCURVE('',#17936,#18275);
+#18275 = DEFINITIONAL_REPRESENTATION('',(#18276),#18280);
+#18276 = LINE('',#18277,#18278);
+#18277 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#18278 = VECTOR('',#18279,1.);
+#18279 = DIRECTION('',(0.,-1.));
+#18280 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18281 = PCURVE('',#18127,#18282);
+#18282 = DEFINITIONAL_REPRESENTATION('',(#18283),#18287);
+#18283 = LINE('',#18284,#18285);
+#18284 = CARTESIAN_POINT('',(0.,0.));
+#18285 = VECTOR('',#18286,1.);
+#18286 = DIRECTION('',(1.,0.));
+#18287 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18288 = ORIENTED_EDGE('',*,*,#18289,.T.);
+#18289 = EDGE_CURVE('',#18267,#18290,#18292,.T.);
+#18290 = VERTEX_POINT('',#18291);
+#18291 = CARTESIAN_POINT('',(3.6725,-11.98,2.285));
+#18292 = SURFACE_CURVE('',#18293,(#18297,#18304),.PCURVE_S1.);
+#18293 = LINE('',#18294,#18295);
+#18294 = CARTESIAN_POINT('',(3.175,-11.98,2.285));
+#18295 = VECTOR('',#18296,1.);
+#18296 = DIRECTION('',(1.,0.,0.));
+#18297 = PCURVE('',#17936,#18298);
+#18298 = DEFINITIONAL_REPRESENTATION('',(#18299),#18303);
+#18299 = LINE('',#18300,#18301);
+#18300 = CARTESIAN_POINT('',(0.549778209321,-0.703971790679));
+#18301 = VECTOR('',#18302,1.);
+#18302 = DIRECTION('',(-1.,1.51269824963E-59));
+#18303 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18304 = PCURVE('',#18101,#18305);
+#18305 = DEFINITIONAL_REPRESENTATION('',(#18306),#18310);
+#18306 = LINE('',#18307,#18308);
+#18307 = CARTESIAN_POINT('',(0.,0.));
+#18308 = VECTOR('',#18309,1.);
+#18309 = DIRECTION('',(1.,0.));
+#18310 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18311 = ORIENTED_EDGE('',*,*,#18312,.F.);
+#18312 = EDGE_CURVE('',#18313,#18290,#18315,.T.);
+#18313 = VERTEX_POINT('',#18314);
+#18314 = CARTESIAN_POINT('',(3.6725,-11.98,0.275));
+#18315 = SURFACE_CURVE('',#18316,(#18320,#18327),.PCURVE_S1.);
+#18316 = LINE('',#18317,#18318);
+#18317 = CARTESIAN_POINT('',(3.6725,-11.98,0.275));
+#18318 = VECTOR('',#18319,1.);
+#18319 = DIRECTION('',(0.,0.,1.));
+#18320 = PCURVE('',#17936,#18321);
+#18321 = DEFINITIONAL_REPRESENTATION('',(#18322),#18326);
+#18322 = LINE('',#18323,#18324);
+#18323 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#18324 = VECTOR('',#18325,1.);
+#18325 = DIRECTION('',(0.,-1.));
+#18326 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18327 = PCURVE('',#18073,#18328);
+#18328 = DEFINITIONAL_REPRESENTATION('',(#18329),#18333);
+#18329 = LINE('',#18330,#18331);
+#18330 = CARTESIAN_POINT('',(0.55,0.61605853382));
+#18331 = VECTOR('',#18332,1.);
+#18332 = DIRECTION('',(0.,1.));
+#18333 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18334 = ORIENTED_EDGE('',*,*,#18335,.T.);
+#18335 = EDGE_CURVE('',#18313,#17893,#18336,.T.);
+#18336 = SURFACE_CURVE('',#18337,(#18341,#18348),.PCURVE_S1.);
+#18337 = LINE('',#18338,#18339);
+#18338 = CARTESIAN_POINT('',(3.6725,-11.98,0.275));
+#18339 = VECTOR('',#18340,1.);
+#18340 = DIRECTION('',(1.,0.,0.));
+#18341 = PCURVE('',#17936,#18342);
+#18342 = DEFINITIONAL_REPRESENTATION('',(#18343),#18347);
+#18343 = LINE('',#18344,#18345);
+#18344 = CARTESIAN_POINT('',(5.227820932134E-02,1.306028209321));
+#18345 = VECTOR('',#18346,1.);
+#18346 = DIRECTION('',(-1.,1.51269824963E-59));
+#18347 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18348 = PCURVE('',#17908,#18349);
+#18349 = DEFINITIONAL_REPRESENTATION('',(#18350),#18354);
+#18350 = LINE('',#18351,#18352);
+#18351 = CARTESIAN_POINT('',(0.388908729653,0.));
+#18352 = VECTOR('',#18353,1.);
+#18353 = DIRECTION('',(0.,-1.));
+#18354 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18355 = ADVANCED_FACE('',(#18356),#17824,.T.);
+#18356 = FACE_BOUND('',#18357,.T.);
+#18357 = EDGE_LOOP('',(#18358,#18359,#18360,#18383));
+#18358 = ORIENTED_EDGE('',*,*,#18194,.T.);
+#18359 = ORIENTED_EDGE('',*,*,#17808,.T.);
+#18360 = ORIENTED_EDGE('',*,*,#18361,.F.);
+#18361 = EDGE_CURVE('',#18362,#17809,#18364,.T.);
+#18362 = VERTEX_POINT('',#18363);
+#18363 = CARTESIAN_POINT('',(3.6725,-11.155,-3.5));
+#18364 = SURFACE_CURVE('',#18365,(#18369,#18376),.PCURVE_S1.);
+#18365 = LINE('',#18366,#18367);
+#18366 = CARTESIAN_POINT('',(3.6725,-11.155,-3.5));
+#18367 = VECTOR('',#18368,1.);
+#18368 = DIRECTION('',(1.,0.,0.));
+#18369 = PCURVE('',#17824,#18370);
+#18370 = DEFINITIONAL_REPRESENTATION('',(#18371),#18375);
+#18371 = LINE('',#18372,#18373);
+#18372 = CARTESIAN_POINT('',(3.5,0.));
+#18373 = VECTOR('',#18374,1.);
+#18374 = DIRECTION('',(0.,-1.));
+#18375 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18376 = PCURVE('',#17852,#18377);
+#18377 = DEFINITIONAL_REPRESENTATION('',(#18378),#18382);
+#18378 = LINE('',#18379,#18380);
+#18379 = CARTESIAN_POINT('',(7.771561172376E-16,0.));
+#18380 = VECTOR('',#18381,1.);
+#18381 = DIRECTION('',(0.,-1.));
+#18382 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18383 = ORIENTED_EDGE('',*,*,#18384,.F.);
+#18384 = EDGE_CURVE('',#18195,#18362,#18385,.T.);
+#18385 = SURFACE_CURVE('',#18386,(#18390,#18397),.PCURVE_S1.);
+#18386 = LINE('',#18387,#18388);
+#18387 = CARTESIAN_POINT('',(3.6725,-11.155,0.));
+#18388 = VECTOR('',#18389,1.);
+#18389 = DIRECTION('',(0.,0.,-1.));
+#18390 = PCURVE('',#17824,#18391);
+#18391 = DEFINITIONAL_REPRESENTATION('',(#18392),#18396);
+#18392 = LINE('',#18393,#18394);
+#18393 = CARTESIAN_POINT('',(0.,0.));
+#18394 = VECTOR('',#18395,1.);
+#18395 = DIRECTION('',(1.,0.));
+#18396 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18397 = PCURVE('',#18073,#18398);
+#18398 = DEFINITIONAL_REPRESENTATION('',(#18399),#18403);
+#18399 = LINE('',#18400,#18401);
+#18400 = CARTESIAN_POINT('',(-0.275,0.34105853382));
+#18401 = VECTOR('',#18402,1.);
+#18402 = DIRECTION('',(0.,-1.));
+#18403 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18404 = ADVANCED_FACE('',(#18405),#17908,.T.);
+#18405 = FACE_BOUND('',#18406,.T.);
+#18406 = EDGE_LOOP('',(#18407,#18430,#18431,#18432));
+#18407 = ORIENTED_EDGE('',*,*,#18408,.T.);
+#18408 = EDGE_CURVE('',#18409,#17865,#18411,.T.);
+#18409 = VERTEX_POINT('',#18410);
+#18410 = CARTESIAN_POINT('',(3.6725,-11.705,0.));
+#18411 = SURFACE_CURVE('',#18412,(#18416,#18423),.PCURVE_S1.);
+#18412 = LINE('',#18413,#18414);
+#18413 = CARTESIAN_POINT('',(3.6725,-11.705,0.));
+#18414 = VECTOR('',#18415,1.);
+#18415 = DIRECTION('',(1.,0.,0.));
+#18416 = PCURVE('',#17908,#18417);
+#18417 = DEFINITIONAL_REPRESENTATION('',(#18418),#18422);
+#18418 = LINE('',#18419,#18420);
+#18419 = CARTESIAN_POINT('',(-1.177569344013E-16,0.));
+#18420 = VECTOR('',#18421,1.);
+#18421 = DIRECTION('',(0.,-1.));
+#18422 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18423 = PCURVE('',#17880,#18424);
+#18424 = DEFINITIONAL_REPRESENTATION('',(#18425),#18429);
+#18425 = LINE('',#18426,#18427);
+#18426 = CARTESIAN_POINT('',(3.5,0.));
+#18427 = VECTOR('',#18428,1.);
+#18428 = DIRECTION('',(0.,-1.));
+#18429 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18430 = ORIENTED_EDGE('',*,*,#17892,.T.);
+#18431 = ORIENTED_EDGE('',*,*,#18335,.F.);
+#18432 = ORIENTED_EDGE('',*,*,#18433,.F.);
+#18433 = EDGE_CURVE('',#18409,#18313,#18434,.T.);
+#18434 = SURFACE_CURVE('',#18435,(#18439,#18446),.PCURVE_S1.);
+#18435 = LINE('',#18436,#18437);
+#18436 = CARTESIAN_POINT('',(3.6725,-11.705,0.));
+#18437 = VECTOR('',#18438,1.);
+#18438 = DIRECTION('',(0.,-0.707106781187,0.707106781187));
+#18439 = PCURVE('',#17908,#18440);
+#18440 = DEFINITIONAL_REPRESENTATION('',(#18441),#18445);
+#18441 = LINE('',#18442,#18443);
+#18442 = CARTESIAN_POINT('',(0.,0.));
+#18443 = VECTOR('',#18444,1.);
+#18444 = DIRECTION('',(1.,0.));
+#18445 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18446 = PCURVE('',#18073,#18447);
+#18447 = DEFINITIONAL_REPRESENTATION('',(#18448),#18452);
+#18448 = LINE('',#18449,#18450);
+#18449 = CARTESIAN_POINT('',(0.275,0.34105853382));
+#18450 = VECTOR('',#18451,1.);
+#18451 = DIRECTION('',(0.707106781187,0.707106781187));
+#18452 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18453 = ADVANCED_FACE('',(#18454),#17852,.T.);
+#18454 = FACE_BOUND('',#18455,.T.);
+#18455 = EDGE_LOOP('',(#18456,#18457,#18458,#18481));
+#18456 = ORIENTED_EDGE('',*,*,#18361,.T.);
+#18457 = ORIENTED_EDGE('',*,*,#17836,.T.);
+#18458 = ORIENTED_EDGE('',*,*,#18459,.F.);
+#18459 = EDGE_CURVE('',#18460,#17837,#18462,.T.);
+#18460 = VERTEX_POINT('',#18461);
+#18461 = CARTESIAN_POINT('',(3.6725,-11.705,-3.5));
+#18462 = SURFACE_CURVE('',#18463,(#18467,#18474),.PCURVE_S1.);
+#18463 = LINE('',#18464,#18465);
+#18464 = CARTESIAN_POINT('',(3.6725,-11.705,-3.5));
+#18465 = VECTOR('',#18466,1.);
+#18466 = DIRECTION('',(1.,0.,0.));
+#18467 = PCURVE('',#17852,#18468);
+#18468 = DEFINITIONAL_REPRESENTATION('',(#18469),#18473);
+#18469 = LINE('',#18470,#18471);
+#18470 = CARTESIAN_POINT('',(0.55,0.));
+#18471 = VECTOR('',#18472,1.);
+#18472 = DIRECTION('',(0.,-1.));
+#18473 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18474 = PCURVE('',#17880,#18475);
+#18475 = DEFINITIONAL_REPRESENTATION('',(#18476),#18480);
+#18476 = LINE('',#18477,#18478);
+#18477 = CARTESIAN_POINT('',(0.,0.));
+#18478 = VECTOR('',#18479,1.);
+#18479 = DIRECTION('',(0.,-1.));
+#18480 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18481 = ORIENTED_EDGE('',*,*,#18482,.F.);
+#18482 = EDGE_CURVE('',#18362,#18460,#18483,.T.);
+#18483 = SURFACE_CURVE('',#18484,(#18488,#18495),.PCURVE_S1.);
+#18484 = LINE('',#18485,#18486);
+#18485 = CARTESIAN_POINT('',(3.6725,-11.155,-3.5));
+#18486 = VECTOR('',#18487,1.);
+#18487 = DIRECTION('',(0.,-1.,0.));
+#18488 = PCURVE('',#17852,#18489);
+#18489 = DEFINITIONAL_REPRESENTATION('',(#18490),#18494);
+#18490 = LINE('',#18491,#18492);
+#18491 = CARTESIAN_POINT('',(0.,-0.));
+#18492 = VECTOR('',#18493,1.);
+#18493 = DIRECTION('',(1.,0.));
+#18494 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18495 = PCURVE('',#18073,#18496);
+#18496 = DEFINITIONAL_REPRESENTATION('',(#18497),#18501);
+#18497 = LINE('',#18498,#18499);
+#18498 = CARTESIAN_POINT('',(-0.275,-3.15894146618));
+#18499 = VECTOR('',#18500,1.);
+#18500 = DIRECTION('',(1.,2.226071387182E-62));
+#18501 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18502 = ADVANCED_FACE('',(#18503),#17880,.T.);
+#18503 = FACE_BOUND('',#18504,.T.);
+#18504 = EDGE_LOOP('',(#18505,#18506,#18507,#18508));
+#18505 = ORIENTED_EDGE('',*,*,#18459,.T.);
+#18506 = ORIENTED_EDGE('',*,*,#17864,.T.);
+#18507 = ORIENTED_EDGE('',*,*,#18408,.F.);
+#18508 = ORIENTED_EDGE('',*,*,#18509,.F.);
+#18509 = EDGE_CURVE('',#18460,#18409,#18510,.T.);
+#18510 = SURFACE_CURVE('',#18511,(#18515,#18522),.PCURVE_S1.);
+#18511 = LINE('',#18512,#18513);
+#18512 = CARTESIAN_POINT('',(3.6725,-11.705,-3.5));
+#18513 = VECTOR('',#18514,1.);
+#18514 = DIRECTION('',(0.,0.,1.));
+#18515 = PCURVE('',#17880,#18516);
+#18516 = DEFINITIONAL_REPRESENTATION('',(#18517),#18521);
+#18517 = LINE('',#18518,#18519);
+#18518 = CARTESIAN_POINT('',(0.,0.));
+#18519 = VECTOR('',#18520,1.);
+#18520 = DIRECTION('',(1.,0.));
+#18521 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18522 = PCURVE('',#18073,#18523);
+#18523 = DEFINITIONAL_REPRESENTATION('',(#18524),#18528);
+#18524 = LINE('',#18525,#18526);
+#18525 = CARTESIAN_POINT('',(0.275,-3.15894146618));
+#18526 = VECTOR('',#18527,1.);
+#18527 = DIRECTION('',(0.,1.));
+#18528 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18529 = ADVANCED_FACE('',(#18530),#17995,.T.);
+#18530 = FACE_BOUND('',#18531,.T.);
+#18531 = EDGE_LOOP('',(#18532,#18533,#18534,#18535));
+#18532 = ORIENTED_EDGE('',*,*,#18243,.T.);
+#18533 = ORIENTED_EDGE('',*,*,#18166,.T.);
+#18534 = ORIENTED_EDGE('',*,*,#17977,.F.);
+#18535 = ORIENTED_EDGE('',*,*,#18536,.F.);
+#18536 = EDGE_CURVE('',#18244,#17978,#18537,.T.);
+#18537 = SURFACE_CURVE('',#18538,(#18542,#18549),.PCURVE_S1.);
+#18538 = LINE('',#18539,#18540);
+#18539 = CARTESIAN_POINT('',(3.175,-11.98,2.56));
+#18540 = VECTOR('',#18541,1.);
+#18541 = DIRECTION('',(0.,1.,0.));
+#18542 = PCURVE('',#17995,#18543);
+#18543 = DEFINITIONAL_REPRESENTATION('',(#18544),#18548);
+#18544 = LINE('',#18545,#18546);
+#18545 = CARTESIAN_POINT('',(-0.38625,-0.55));
+#18546 = VECTOR('',#18547,1.);
+#18547 = DIRECTION('',(0.,1.));
+#18548 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18549 = PCURVE('',#18127,#18550);
+#18550 = DEFINITIONAL_REPRESENTATION('',(#18551),#18555);
+#18551 = LINE('',#18552,#18553);
+#18552 = CARTESIAN_POINT('',(0.275,0.));
+#18553 = VECTOR('',#18554,1.);
+#18554 = DIRECTION('',(0.,-1.));
+#18555 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18556 = ADVANCED_FACE('',(#18557),#18127,.F.);
+#18557 = FACE_BOUND('',#18558,.F.);
+#18558 = EDGE_LOOP('',(#18559,#18560,#18581,#18582));
+#18559 = ORIENTED_EDGE('',*,*,#18266,.F.);
+#18560 = ORIENTED_EDGE('',*,*,#18561,.T.);
+#18561 = EDGE_CURVE('',#18267,#18086,#18562,.T.);
+#18562 = SURFACE_CURVE('',#18563,(#18567,#18574),.PCURVE_S1.);
+#18563 = LINE('',#18564,#18565);
+#18564 = CARTESIAN_POINT('',(3.175,-11.98,2.285));
+#18565 = VECTOR('',#18566,1.);
+#18566 = DIRECTION('',(0.,1.,0.));
+#18567 = PCURVE('',#18127,#18568);
+#18568 = DEFINITIONAL_REPRESENTATION('',(#18569),#18573);
+#18569 = LINE('',#18570,#18571);
+#18570 = CARTESIAN_POINT('',(0.,0.));
+#18571 = VECTOR('',#18572,1.);
+#18572 = DIRECTION('',(0.,-1.));
+#18573 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18574 = PCURVE('',#18101,#18575);
+#18575 = DEFINITIONAL_REPRESENTATION('',(#18576),#18580);
+#18576 = LINE('',#18577,#18578);
+#18577 = CARTESIAN_POINT('',(0.,0.));
+#18578 = VECTOR('',#18579,1.);
+#18579 = DIRECTION('',(0.,1.));
+#18580 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18581 = ORIENTED_EDGE('',*,*,#18113,.T.);
+#18582 = ORIENTED_EDGE('',*,*,#18536,.F.);
+#18583 = ADVANCED_FACE('',(#18584),#18101,.F.);
+#18584 = FACE_BOUND('',#18585,.F.);
+#18585 = EDGE_LOOP('',(#18586,#18587,#18588,#18609));
+#18586 = ORIENTED_EDGE('',*,*,#18561,.F.);
+#18587 = ORIENTED_EDGE('',*,*,#18289,.T.);
+#18588 = ORIENTED_EDGE('',*,*,#18589,.T.);
+#18589 = EDGE_CURVE('',#18290,#18058,#18590,.T.);
+#18590 = SURFACE_CURVE('',#18591,(#18595,#18602),.PCURVE_S1.);
+#18591 = LINE('',#18592,#18593);
+#18592 = CARTESIAN_POINT('',(3.6725,-11.98,2.285));
+#18593 = VECTOR('',#18594,1.);
+#18594 = DIRECTION('',(0.,1.,0.));
+#18595 = PCURVE('',#18101,#18596);
+#18596 = DEFINITIONAL_REPRESENTATION('',(#18597),#18601);
+#18597 = LINE('',#18598,#18599);
+#18598 = CARTESIAN_POINT('',(0.4975,0.));
+#18599 = VECTOR('',#18600,1.);
+#18600 = DIRECTION('',(0.,1.));
+#18601 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18602 = PCURVE('',#18073,#18603);
+#18603 = DEFINITIONAL_REPRESENTATION('',(#18604),#18608);
+#18604 = LINE('',#18605,#18606);
+#18605 = CARTESIAN_POINT('',(0.55,2.62605853382));
+#18606 = VECTOR('',#18607,1.);
+#18607 = DIRECTION('',(-1.,-2.226071387182E-62));
+#18608 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2)
+PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE',''
+ ) );
+#18609 = ORIENTED_EDGE('',*,*,#18085,.F.);
+#18610 = ADVANCED_FACE('',(#18611),#18073,.T.);
+#18611 = FACE_BOUND('',#18612,.T.);
+#18612 = EDGE_LOOP('',(#18613,#18614,#18615,#18616,#18617,#18618,#18619,
+ #18620));
+#18613 = ORIENTED_EDGE('',*,*,#18312,.T.);
+#18614 = ORIENTED_EDGE('',*,*,#18589,.T.);
+#18615 = ORIENTED_EDGE('',*,*,#18057,.T.);
+#18616 = ORIENTED_EDGE('',*,*,#18217,.T.);
+#18617 = ORIENTED_EDGE('',*,*,#18384,.T.);
+#18618 = ORIENTED_EDGE('',*,*,#18482,.T.);
+#18619 = ORIENTED_EDGE('',*,*,#18509,.T.);
+#18620 = ORIENTED_EDGE('',*,*,#18433,.T.);
+#18621 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3)
+GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#18625))
+GLOBAL_UNIT_ASSIGNED_CONTEXT((#18622,#18623,#18624))
+REPRESENTATION_CONTEXT('Context #1',
+ '3D Context with UNIT and UNCERTAINTY') );
+#18622 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) );
+#18623 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) );
+#18624 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() );
+#18625 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#18622,
+ 'distance_accuracy_value','confusion accuracy');
+#18626 = SHAPE_DEFINITION_REPRESENTATION(#18627,#980);
+#18627 = PRODUCT_DEFINITION_SHAPE('','',#18628);
+#18628 = PRODUCT_DEFINITION('design','',#18629,#18632);
+#18629 = PRODUCT_DEFINITION_FORMATION('','',#18630);
+#18630 = PRODUCT('PinsArrayLR','PinsArrayLR','',(#18631));
+#18631 = PRODUCT_CONTEXT('',#2,'mechanical');
+#18632 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design');
+#18633 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#18634,#18636);
+#18634 = ( REPRESENTATION_RELATIONSHIP('','',#980,#10)
+REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#18635)
+SHAPE_REPRESENTATION_RELATIONSHIP() );
+#18635 = ITEM_DEFINED_TRANSFORMATION('','',#11,#19);
+#18636 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',
+ #18637);
+#18637 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('2','=>[0:1:1:3]','',#5,#18628,$
+ );
+#18638 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#18630));
+#18639 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(
+ #18640),#962);
+#18640 = STYLED_ITEM('color',(#18641),#30);
+#18641 = PRESENTATION_STYLE_ASSIGNMENT((#18642,#18648));
+#18642 = SURFACE_STYLE_USAGE(.BOTH.,#18643);
+#18643 = SURFACE_SIDE_STYLE('',(#18644));
+#18644 = SURFACE_STYLE_FILL_AREA(#18645);
+#18645 = FILL_AREA_STYLE('',(#18646));
+#18646 = FILL_AREA_STYLE_COLOUR('',#18647);
+#18647 = COLOUR_RGB('',0.300000011921,0.300000011921,0.300000011921);
+#18648 = CURVE_STYLE('',#18649,POSITIVE_LENGTH_MEASURE(0.1),#18647);
+#18649 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18650 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(
+ #18651,#18661,#18670,#18679,#18688,#18697,#18706,#18715,#18724,
+ #18733,#18742,#18751,#18760,#18769,#18778,#18787,#18796,#18805,
+ #18814,#18823),#18621);
+#18651 = STYLED_ITEM('color',(#18652),#981);
+#18652 = PRESENTATION_STYLE_ASSIGNMENT((#18653,#18659));
+#18653 = SURFACE_STYLE_USAGE(.BOTH.,#18654);
+#18654 = SURFACE_SIDE_STYLE('',(#18655));
+#18655 = SURFACE_STYLE_FILL_AREA(#18656);
+#18656 = FILL_AREA_STYLE('',(#18657));
+#18657 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18658 = COLOUR_RGB('',0.73400002718,0.773000001907,0.79699999094);
+#18659 = CURVE_STYLE('',#18660,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18660 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18661 = STYLED_ITEM('color',(#18662),#1863);
+#18662 = PRESENTATION_STYLE_ASSIGNMENT((#18663,#18668));
+#18663 = SURFACE_STYLE_USAGE(.BOTH.,#18664);
+#18664 = SURFACE_SIDE_STYLE('',(#18665));
+#18665 = SURFACE_STYLE_FILL_AREA(#18666);
+#18666 = FILL_AREA_STYLE('',(#18667));
+#18667 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18668 = CURVE_STYLE('',#18669,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18669 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18670 = STYLED_ITEM('color',(#18671),#2745);
+#18671 = PRESENTATION_STYLE_ASSIGNMENT((#18672,#18677));
+#18672 = SURFACE_STYLE_USAGE(.BOTH.,#18673);
+#18673 = SURFACE_SIDE_STYLE('',(#18674));
+#18674 = SURFACE_STYLE_FILL_AREA(#18675);
+#18675 = FILL_AREA_STYLE('',(#18676));
+#18676 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18677 = CURVE_STYLE('',#18678,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18678 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18679 = STYLED_ITEM('color',(#18680),#3627);
+#18680 = PRESENTATION_STYLE_ASSIGNMENT((#18681,#18686));
+#18681 = SURFACE_STYLE_USAGE(.BOTH.,#18682);
+#18682 = SURFACE_SIDE_STYLE('',(#18683));
+#18683 = SURFACE_STYLE_FILL_AREA(#18684);
+#18684 = FILL_AREA_STYLE('',(#18685));
+#18685 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18686 = CURVE_STYLE('',#18687,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18687 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18688 = STYLED_ITEM('color',(#18689),#4509);
+#18689 = PRESENTATION_STYLE_ASSIGNMENT((#18690,#18695));
+#18690 = SURFACE_STYLE_USAGE(.BOTH.,#18691);
+#18691 = SURFACE_SIDE_STYLE('',(#18692));
+#18692 = SURFACE_STYLE_FILL_AREA(#18693);
+#18693 = FILL_AREA_STYLE('',(#18694));
+#18694 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18695 = CURVE_STYLE('',#18696,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18696 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18697 = STYLED_ITEM('color',(#18698),#5391);
+#18698 = PRESENTATION_STYLE_ASSIGNMENT((#18699,#18704));
+#18699 = SURFACE_STYLE_USAGE(.BOTH.,#18700);
+#18700 = SURFACE_SIDE_STYLE('',(#18701));
+#18701 = SURFACE_STYLE_FILL_AREA(#18702);
+#18702 = FILL_AREA_STYLE('',(#18703));
+#18703 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18704 = CURVE_STYLE('',#18705,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18705 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18706 = STYLED_ITEM('color',(#18707),#6273);
+#18707 = PRESENTATION_STYLE_ASSIGNMENT((#18708,#18713));
+#18708 = SURFACE_STYLE_USAGE(.BOTH.,#18709);
+#18709 = SURFACE_SIDE_STYLE('',(#18710));
+#18710 = SURFACE_STYLE_FILL_AREA(#18711);
+#18711 = FILL_AREA_STYLE('',(#18712));
+#18712 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18713 = CURVE_STYLE('',#18714,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18714 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18715 = STYLED_ITEM('color',(#18716),#7155);
+#18716 = PRESENTATION_STYLE_ASSIGNMENT((#18717,#18722));
+#18717 = SURFACE_STYLE_USAGE(.BOTH.,#18718);
+#18718 = SURFACE_SIDE_STYLE('',(#18719));
+#18719 = SURFACE_STYLE_FILL_AREA(#18720);
+#18720 = FILL_AREA_STYLE('',(#18721));
+#18721 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18722 = CURVE_STYLE('',#18723,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18723 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18724 = STYLED_ITEM('color',(#18725),#8037);
+#18725 = PRESENTATION_STYLE_ASSIGNMENT((#18726,#18731));
+#18726 = SURFACE_STYLE_USAGE(.BOTH.,#18727);
+#18727 = SURFACE_SIDE_STYLE('',(#18728));
+#18728 = SURFACE_STYLE_FILL_AREA(#18729);
+#18729 = FILL_AREA_STYLE('',(#18730));
+#18730 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18731 = CURVE_STYLE('',#18732,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18732 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18733 = STYLED_ITEM('color',(#18734),#8919);
+#18734 = PRESENTATION_STYLE_ASSIGNMENT((#18735,#18740));
+#18735 = SURFACE_STYLE_USAGE(.BOTH.,#18736);
+#18736 = SURFACE_SIDE_STYLE('',(#18737));
+#18737 = SURFACE_STYLE_FILL_AREA(#18738);
+#18738 = FILL_AREA_STYLE('',(#18739));
+#18739 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18740 = CURVE_STYLE('',#18741,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18741 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18742 = STYLED_ITEM('color',(#18743),#9801);
+#18743 = PRESENTATION_STYLE_ASSIGNMENT((#18744,#18749));
+#18744 = SURFACE_STYLE_USAGE(.BOTH.,#18745);
+#18745 = SURFACE_SIDE_STYLE('',(#18746));
+#18746 = SURFACE_STYLE_FILL_AREA(#18747);
+#18747 = FILL_AREA_STYLE('',(#18748));
+#18748 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18749 = CURVE_STYLE('',#18750,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18750 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18751 = STYLED_ITEM('color',(#18752),#10683);
+#18752 = PRESENTATION_STYLE_ASSIGNMENT((#18753,#18758));
+#18753 = SURFACE_STYLE_USAGE(.BOTH.,#18754);
+#18754 = SURFACE_SIDE_STYLE('',(#18755));
+#18755 = SURFACE_STYLE_FILL_AREA(#18756);
+#18756 = FILL_AREA_STYLE('',(#18757));
+#18757 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18758 = CURVE_STYLE('',#18759,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18759 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18760 = STYLED_ITEM('color',(#18761),#11565);
+#18761 = PRESENTATION_STYLE_ASSIGNMENT((#18762,#18767));
+#18762 = SURFACE_STYLE_USAGE(.BOTH.,#18763);
+#18763 = SURFACE_SIDE_STYLE('',(#18764));
+#18764 = SURFACE_STYLE_FILL_AREA(#18765);
+#18765 = FILL_AREA_STYLE('',(#18766));
+#18766 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18767 = CURVE_STYLE('',#18768,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18768 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18769 = STYLED_ITEM('color',(#18770),#12447);
+#18770 = PRESENTATION_STYLE_ASSIGNMENT((#18771,#18776));
+#18771 = SURFACE_STYLE_USAGE(.BOTH.,#18772);
+#18772 = SURFACE_SIDE_STYLE('',(#18773));
+#18773 = SURFACE_STYLE_FILL_AREA(#18774);
+#18774 = FILL_AREA_STYLE('',(#18775));
+#18775 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18776 = CURVE_STYLE('',#18777,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18777 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18778 = STYLED_ITEM('color',(#18779),#13329);
+#18779 = PRESENTATION_STYLE_ASSIGNMENT((#18780,#18785));
+#18780 = SURFACE_STYLE_USAGE(.BOTH.,#18781);
+#18781 = SURFACE_SIDE_STYLE('',(#18782));
+#18782 = SURFACE_STYLE_FILL_AREA(#18783);
+#18783 = FILL_AREA_STYLE('',(#18784));
+#18784 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18785 = CURVE_STYLE('',#18786,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18786 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18787 = STYLED_ITEM('color',(#18788),#14211);
+#18788 = PRESENTATION_STYLE_ASSIGNMENT((#18789,#18794));
+#18789 = SURFACE_STYLE_USAGE(.BOTH.,#18790);
+#18790 = SURFACE_SIDE_STYLE('',(#18791));
+#18791 = SURFACE_STYLE_FILL_AREA(#18792);
+#18792 = FILL_AREA_STYLE('',(#18793));
+#18793 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18794 = CURVE_STYLE('',#18795,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18795 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18796 = STYLED_ITEM('color',(#18797),#15093);
+#18797 = PRESENTATION_STYLE_ASSIGNMENT((#18798,#18803));
+#18798 = SURFACE_STYLE_USAGE(.BOTH.,#18799);
+#18799 = SURFACE_SIDE_STYLE('',(#18800));
+#18800 = SURFACE_STYLE_FILL_AREA(#18801);
+#18801 = FILL_AREA_STYLE('',(#18802));
+#18802 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18803 = CURVE_STYLE('',#18804,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18804 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18805 = STYLED_ITEM('color',(#18806),#15975);
+#18806 = PRESENTATION_STYLE_ASSIGNMENT((#18807,#18812));
+#18807 = SURFACE_STYLE_USAGE(.BOTH.,#18808);
+#18808 = SURFACE_SIDE_STYLE('',(#18809));
+#18809 = SURFACE_STYLE_FILL_AREA(#18810);
+#18810 = FILL_AREA_STYLE('',(#18811));
+#18811 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18812 = CURVE_STYLE('',#18813,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18813 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18814 = STYLED_ITEM('color',(#18815),#16857);
+#18815 = PRESENTATION_STYLE_ASSIGNMENT((#18816,#18821));
+#18816 = SURFACE_STYLE_USAGE(.BOTH.,#18817);
+#18817 = SURFACE_SIDE_STYLE('',(#18818));
+#18818 = SURFACE_STYLE_FILL_AREA(#18819);
+#18819 = FILL_AREA_STYLE('',(#18820));
+#18820 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18821 = CURVE_STYLE('',#18822,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18822 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+#18823 = STYLED_ITEM('color',(#18824),#17739);
+#18824 = PRESENTATION_STYLE_ASSIGNMENT((#18825,#18830));
+#18825 = SURFACE_STYLE_USAGE(.BOTH.,#18826);
+#18826 = SURFACE_SIDE_STYLE('',(#18827));
+#18827 = SURFACE_STYLE_FILL_AREA(#18828);
+#18828 = FILL_AREA_STYLE('',(#18829));
+#18829 = FILL_AREA_STYLE_COLOUR('',#18658);
+#18830 = CURVE_STYLE('',#18831,POSITIVE_LENGTH_MEASURE(0.1),#18658);
+#18831 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
+ENDSEC;
+END-ISO-10303-21;
diff --git a/circuit/SN74LS273NE4/3D/SN74LS273NE4.wrl b/circuit/SN74LS273NE4/3D/SN74LS273NE4.wrl
new file mode 100644
index 0000000..2794333
--- /dev/null
+++ b/circuit/SN74LS273NE4/3D/SN74LS273NE4.wrl
@@ -0,0 +1,6541 @@
+#VRML V2.0 utf8
+# META "generator" "CAD Exchanger 3.7.0 (cadexchanger.com)"
+DEF __1 Transform {
+ children [
+ DEF ASSEMBLY Group {
+ children [
+ DEF Body Group {
+ children [
+ DEF Body_1 Shape {
+ appearance DEF __5 Appearance {
+ material DEF __6 Material {
+ ambientIntensity 0.66666662693
+ diffuseColor 0.300000011921 0.300000011921 0.300000011921
+ shininess 0
+ }
+ }
+ geometry DEF __7 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ -0.003175 -0.0132075 0.002285,
+ -0.003175 -0.0132075 0.00256,
+ -0.003175 0.0132075 0.002285,
+ -0.003175 0.0132075 0.00256,
+ 0.003175 -0.0132075 0.002285,
+ 0.003175 -0.0132075 0.00256,
+ -0.00301625 -0.01304875 0.0008226,
+ -0.00301625 0.01304875 0.0008226,
+ -0.00301625 -0.01304875 0.00457,
+ -0.00301625 0.01304875 0.00457,
+ 0.003175 0.0132075 0.002285,
+ 0.003175 0.0132075 0.00256,
+ 0.00301625 -0.01304875 0.0008226,
+ 0.00301625 -0.01304875 0.00457,
+ 0.00301625 0.01304875 0.0008226,
+ 0.00301625 0.01304875 0.00457,
+ 0.000777712993334 0.01304875 0.00457,
+ -0.000777712993334 0.01304875 0.00457,
+ 0.000784215879063 0.0130848439055 0.004113,
+ -0.000784215879063 0.0130848439055 0.004113,
+ -0.000739304040513 0.0129185906748 0.00457,
+ -0.000679284461063 0.0127968764699 0.00457,
+ -0.000599408689764 0.0126871652182 0.00457,
+ -0.000502011578552 0.0125926638938 0.00457,
+ -0.000389940146366 0.0125161348687 0.00457,
+ -0.000266470357822 0.0124598151661 0.00457,
+ -0.000135211363356 0.0124253510693 0.00457,
+ 5.59182111113e-19 0.01241375 0.00457,
+ 0.000135211363356 0.0124253510693 0.00457,
+ 0.000266470357822 0.0124598151661 0.00457,
+ 0.000389940146366 0.0125161348687 0.00457,
+ 0.000502011578552 0.0125926638938 0.00457,
+ 0.000599408689764 0.0126871652182 0.00457,
+ 0.000679284461063 0.0127968764699 0.00457,
+ 0.000739304040513 0.0129185906748 0.00457,
+ -0.000753031112711 0.0129565354491 0.004113,
+ -0.000701007144296 0.0128351721255 0.004113,
+ -0.000629583672619 0.0127241125139 0.004113,
+ -0.000540737253673 0.0126264300516 0.004113,
+ -0.000436926601906 0.0125448279793 0.004113,
+ -0.00032102454835 0.0124815645333 0.004113,
+ -0.000196238538583 0.0124383904509 0.004113,
+ -6.60218706557e-05 0.0124165005214 0.004113,
+ 6.60218706557e-05 0.0124165005214 0.004113,
+ 0.000196238538583 0.0124383904509 0.004113,
+ 0.00032102454835 0.0124815645333 0.004113,
+ 0.000436926601906 0.0125448279793 0.004113,
+ 0.000540737253673 0.0126264300516 0.004113,
+ 0.000629583672619 0.0127241125139 0.004113,
+ 0.000701007144296 0.0128351721255 0.004113,
+ 0.000753031112711 0.0129565354491 0.004113
+
+ ]
+ }
+ normal Normal {
+ vector [
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0.99415952 -1.7533911e-18 -0.10792042,
+ -0.99415952 -1.7533911e-18 -0.10792042,
+ -0.99415952 -1.7533911e-18 -0.10792042,
+ -0.99415952 -1.7533911e-18 -0.10792042,
+ -0.99689561 -1.7696332e-18 0.078734912,
+ -0.99689561 -1.7696332e-18 0.078734912,
+ -0.99689561 -1.7696332e-18 0.078734912,
+ -0.99689561 -1.7696332e-18 0.078734912,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ 0 -0.99415952 -0.10792042,
+ 0 -0.99415952 -0.10792042,
+ 0 -0.99415952 -0.10792042,
+ 0 -0.99415952 -0.10792042,
+ 1.7696332e-18 -0.99689561 0.078734912,
+ 1.7696332e-18 -0.99689561 0.078734912,
+ 1.7696332e-18 -0.99689561 0.078734912,
+ 1.7696332e-18 -0.99689561 0.078734912,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 0.99415952 -0.10792042,
+ -0 0.99415952 -0.10792042,
+ -0 0.99415952 -0.10792042,
+ -0 0.99415952 -0.10792042,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 1.7696332e-18 0.99689561 0.078734912,
+ 1.7696332e-18 0.99689561 0.078734912,
+ 1.7696332e-18 0.99689561 0.078734912,
+ 1.7696332e-18 0.99689561 0.078734912,
+ 1.7696332e-18 0.99689561 0.078734912,
+ 1.7696332e-18 0.99689561 0.078734912,
+ 1.7696332e-18 0.99689561 0.078734912,
+ 1.7696332e-18 0.99689561 0.078734912,
+ 0.99415952 -1.7533911e-18 -0.10792042,
+ 0.99415952 -1.7533911e-18 -0.10792042,
+ 0.99415952 -1.7533911e-18 -0.10792042,
+ 0.99415952 -1.7533911e-18 -0.10792042,
+ 0.99689561 -1.7696332e-18 0.078734912,
+ 0.99689561 -1.7696332e-18 0.078734912,
+ 0.99689561 -1.7696332e-18 0.078734912,
+ 0.99689561 -1.7696332e-18 0.078734912,
+ -0.97979587 0.2 -0,
+ -0.93140668 0.36398026 -0,
+ -0.85579145 0.51732099 -0,
+ -0.75516057 0.65553987 -0,
+ -0.63245553 0.77459669 -0,
+ -0.49126318 0.8710112 -0,
+ -0.33571067 0.94196516 -0,
+ -0.17034502 0.98538446 -0,
+ -7.0448138e-16 1 -0,
+ 0.17034502 0.98538446 -0,
+ 0.33571067 0.94196516 -0,
+ 0.49126318 0.8710112 -0,
+ 0.63245553 0.77459669 -0,
+ 0.75516057 0.65553987 -0,
+ 0.85579145 0.51732099 -0,
+ 0.93140668 0.36398026 -0,
+ 0.97979587 0.2 -0,
+ 0.98798853 0.15452737 -0,
+ 0.94870061 0.31617582 -0,
+ 0.88315862 0.46907449 -0,
+ 0.79317629 0.6089921 -0,
+ 0.68124378 0.73205662 -0,
+ 0.55045873 0.83486241 -0,
+ 0.40444037 0.91456437 -0,
+ 0.24722965 0.96895689 -0,
+ 0.083177157 0.99653476 -0,
+ -0.083177157 0.99653476 -0,
+ -0.24722965 0.96895689 -0,
+ -0.40444037 0.91456437 -0,
+ -0.55045873 0.83486241 -0,
+ -0.68124378 0.73205662 -0,
+ -0.79317629 0.6089921 -0,
+ -0.88315862 0.46907449 -0,
+ -0.94870061 0.31617582 -0,
+ -0.98798853 0.15452737 -0,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1,
+ 0 0 1
+
+ ]
+ }
+ coordIndex [
+ 0 1 2 -1
+ 3 2 1 -1
+ 4 5 0 -1
+ 1 0 5 -1
+ 2 6 0 -1
+ 7 6 2 -1
+ 3 1 8 -1
+ 9 3 8 -1
+ 10 2 11 -1
+ 3 11 2 -1
+ 4 10 5 -1
+ 11 5 10 -1
+ 4 0 6 -1
+ 4 6 12 -1
+ 5 8 1 -1
+ 5 13 8 -1
+ 12 7 14 -1
+ 12 6 7 -1
+ 10 7 2 -1
+ 10 14 7 -1
+ 29 13 15 -1
+ 27 8 13 -1
+ 34 15 16 -1
+ 33 15 34 -1
+ 32 15 33 -1
+ 31 15 32 -1
+ 30 15 31 -1
+ 29 15 30 -1
+ 28 13 29 -1
+ 27 13 28 -1
+ 25 9 8 -1
+ 26 8 27 -1
+ 25 8 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 21 9 22 -1
+ 17 9 20 -1
+ 20 9 21 -1
+ 19 11 3 -1
+ 19 3 9 -1
+ 19 9 17 -1
+ 15 18 16 -1
+ 11 19 18 -1
+ 11 18 15 -1
+ 10 4 12 -1
+ 14 10 12 -1
+ 11 13 5 -1
+ 15 13 11 -1
+ 34 16 50 -1
+ 33 34 49 -1
+ 32 33 48 -1
+ 31 32 47 -1
+ 30 31 46 -1
+ 29 30 45 -1
+ 28 29 44 -1
+ 27 28 43 -1
+ 26 27 42 -1
+ 25 26 41 -1
+ 24 25 40 -1
+ 23 24 39 -1
+ 22 23 38 -1
+ 21 22 37 -1
+ 20 21 36 -1
+ 17 20 35 -1
+ 35 19 17 -1
+ 36 35 20 -1
+ 37 36 21 -1
+ 38 37 22 -1
+ 39 38 23 -1
+ 40 39 24 -1
+ 41 40 25 -1
+ 42 41 26 -1
+ 43 42 27 -1
+ 44 43 28 -1
+ 45 44 29 -1
+ 46 45 30 -1
+ 47 46 31 -1
+ 48 47 32 -1
+ 49 48 33 -1
+ 50 49 34 -1
+ 18 50 16 -1
+ 35 18 19 -1
+ 36 18 35 -1
+ 37 18 36 -1
+ 38 18 37 -1
+ 39 18 38 -1
+ 40 18 39 -1
+ 41 18 40 -1
+ 42 18 41 -1
+ 43 18 42 -1
+ 44 18 43 -1
+ 45 18 44 -1
+ 46 18 45 -1
+ 47 18 46 -1
+ 48 18 47 -1
+ 49 18 48 -1
+ 50 18 49 -1
+ ]
+ normalIndex [
+ 1 0 2 -1
+ 3 2 0 -1
+ 5 4 6 -1
+ 7 6 4 -1
+ 10 8 9 -1
+ 11 8 10 -1
+ 14 13 12 -1
+ 15 14 12 -1
+ 17 18 16 -1
+ 19 16 18 -1
+ 21 22 20 -1
+ 23 20 22 -1
+ 26 27 24 -1
+ 26 24 25 -1
+ 30 28 31 -1
+ 30 29 28 -1
+ 34 32 35 -1
+ 34 33 32 -1
+ 38 36 39 -1
+ 38 37 36 -1
+ 50 42 43 -1
+ 52 41 42 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 47 43 46 -1
+ 48 43 47 -1
+ 49 43 48 -1
+ 50 43 49 -1
+ 51 42 50 -1
+ 52 42 51 -1
+ 54 40 41 -1
+ 53 41 52 -1
+ 54 41 53 -1
+ 55 40 54 -1
+ 56 40 55 -1
+ 57 40 56 -1
+ 58 40 57 -1
+ 60 40 59 -1
+ 59 40 58 -1
+ 63 67 68 -1
+ 63 68 61 -1
+ 63 61 62 -1
+ 66 64 65 -1
+ 67 63 64 -1
+ 67 64 66 -1
+ 71 70 69 -1
+ 72 71 69 -1
+ 75 73 74 -1
+ 76 73 75 -1
+ 78 77 110 -1
+ 79 78 109 -1
+ 80 79 108 -1
+ 81 80 107 -1
+ 82 81 106 -1
+ 83 82 105 -1
+ 84 83 104 -1
+ 85 84 103 -1
+ 86 85 102 -1
+ 87 86 101 -1
+ 88 87 100 -1
+ 89 88 99 -1
+ 90 89 98 -1
+ 91 90 97 -1
+ 92 91 96 -1
+ 93 92 95 -1
+ 95 94 93 -1
+ 96 95 92 -1
+ 97 96 91 -1
+ 98 97 90 -1
+ 99 98 89 -1
+ 100 99 88 -1
+ 101 100 87 -1
+ 102 101 86 -1
+ 103 102 85 -1
+ 104 103 84 -1
+ 105 104 83 -1
+ 106 105 82 -1
+ 107 106 81 -1
+ 108 107 80 -1
+ 109 108 79 -1
+ 110 109 78 -1
+ 111 110 77 -1
+ 114 112 113 -1
+ 115 112 114 -1
+ 116 112 115 -1
+ 117 112 116 -1
+ 118 112 117 -1
+ 119 112 118 -1
+ 120 112 119 -1
+ 121 112 120 -1
+ 122 112 121 -1
+ 123 112 122 -1
+ 124 112 123 -1
+ 125 112 124 -1
+ 126 112 125 -1
+ 127 112 126 -1
+ 128 112 127 -1
+ 129 112 128 -1
+ ]
+ }
+ }
+ ]
+ }
+ DEF PinsArrayLR Group {
+ children [
+ DEF PinsArrayLR_1 Shape {
+ appearance DEF __10 Appearance {
+ material DEF __11 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __12 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ -0.0039475 0.01088 0.0024225,
+ -0.0039475 0.01088 0.000275,
+ -0.0039475 0.011155 0,
+ -0.0039475 0.011155 -0.0035,
+ -0.0039475 0.011705 -0.0035,
+ -0.0039475 0.011705 0,
+ -0.0039475 0.01198 0.000275,
+ -0.0039475 0.01198 0.0024225,
+ -0.003175 0.01088 0.00256,
+ -0.00381 0.01088 0.00256,
+ -0.0036725 0.01088 0.000275,
+ -0.0036725 0.01088 0.002285,
+ -0.003175 0.01088 0.002285,
+ -0.00381 0.01198 0.00256,
+ -0.0036725 0.011155 0,
+ -0.003175 0.01198 0.00256,
+ -0.003175 0.01198 0.002285,
+ -0.0036725 0.01198 0.002285,
+ -0.0036725 0.01198 0.000275,
+ -0.0036725 0.011155 -0.0035,
+ -0.0036725 0.011705 0,
+ -0.0036725 0.011705 -0.0035,
+ -0.00394541106604 0.01088 0.00244637662443,
+ -0.00393920773536 0.01088 0.00246952776971,
+ -0.00392907849302 0.01088 0.00249125,
+ -0.00391533111093 0.01088 0.00251088329633,
+ -0.00389838329633 0.01088 0.00252783111093,
+ -0.00387875 0.01088 0.00254157849302,
+ -0.00385702776971 0.01088 0.00255170773536,
+ -0.00383387662443 0.01088 0.00255791106604,
+ -0.00394541106604 0.01198 0.00244637662443,
+ -0.00393920773536 0.01198 0.00246952776971,
+ -0.00392907849302 0.01198 0.00249125,
+ -0.00391533111093 0.01198 0.00251088329633,
+ -0.00389838329633 0.01198 0.00252783111093,
+ -0.00387875 0.01198 0.00254157849302,
+ -0.00385702776971 0.01198 0.00255170773536,
+ -0.00383387662443 0.01198 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ -1 0 4.4408921e-16,
+ -1 0 4.4408921e-16,
+ -0.98480773 0 0.17364818,
+ -0.93969262 0 0.34202015,
+ -0.86602539 0 0.5,
+ -0.76604444 0 0.64278764,
+ -0.64278764 0 0.76604444,
+ -0.5 0 0.86602539,
+ -0.34202015 0 0.93969262,
+ -0.17364818 0 0.98480773,
+ 0 0 1,
+ 1.030287e-13 0 1,
+ -0.17364818 0 0.98480773,
+ -0.34202015 0 0.93969262,
+ -0.5 0 0.86602539,
+ -0.64278764 0 0.76604444,
+ -0.76604444 0 0.64278764,
+ -0.86602539 0 0.5,
+ -0.93969262 0 0.34202015,
+ -0.98480773 0 0.17364818,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 22 31 -1
+ 32 24 33 -1
+ 34 26 35 -1
+ 36 28 37 -1
+ 37 29 13 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 34 25 26 -1
+ 35 27 36 -1
+ 33 24 25 -1
+ 33 25 34 -1
+ 32 23 24 -1
+ 31 23 32 -1
+ 31 22 23 -1
+ 30 7 22 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 15 9 8 -1
+ 13 9 15 -1
+ 12 16 8 -1
+ 15 8 16 -1
+ 12 17 16 -1
+ 12 11 17 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 25 41 -1
+ 40 27 39 -1
+ 38 29 37 -1
+ 36 31 35 -1
+ 35 32 34 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 38 28 29 -1
+ 37 30 36 -1
+ 39 27 28 -1
+ 39 28 38 -1
+ 40 26 27 -1
+ 41 26 40 -1
+ 41 25 26 -1
+ 42 23 25 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 84 82 -1
+ 85 82 84 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ DEF PinsArrayLR_2 Shape {
+ appearance DEF __14 Appearance {
+ material DEF __15 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __16 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ 0.0039475 0.01198 0.0024225,
+ 0.0039475 0.01198 0.000275,
+ 0.0039475 0.011705 0,
+ 0.0039475 0.011705 -0.0035,
+ 0.0039475 0.011155 -0.0035,
+ 0.0039475 0.011155 0,
+ 0.0039475 0.01088 0.000275,
+ 0.0039475 0.01088 0.0024225,
+ 0.003175 0.01198 0.00256,
+ 0.00381 0.01198 0.00256,
+ 0.0036725 0.01198 0.000275,
+ 0.0036725 0.01198 0.002285,
+ 0.003175 0.01198 0.002285,
+ 0.00381 0.01088 0.00256,
+ 0.0036725 0.011705 0,
+ 0.003175 0.01088 0.00256,
+ 0.003175 0.01088 0.002285,
+ 0.0036725 0.01088 0.002285,
+ 0.0036725 0.01088 0.000275,
+ 0.0036725 0.011705 -0.0035,
+ 0.0036725 0.011155 0,
+ 0.0036725 0.011155 -0.0035,
+ 0.00394541106604 0.01198 0.00244637662443,
+ 0.00393920773536 0.01198 0.00246952776971,
+ 0.00392907849302 0.01198 0.00249125,
+ 0.00391533111093 0.01198 0.00251088329633,
+ 0.00389838329633 0.01198 0.00252783111093,
+ 0.00387875 0.01198 0.00254157849302,
+ 0.00385702776971 0.01198 0.00255170773536,
+ 0.00383387662443 0.01198 0.00255791106604,
+ 0.00394541106604 0.01088 0.00244637662443,
+ 0.00393920773536 0.01088 0.00246952776971,
+ 0.00392907849302 0.01088 0.00249125,
+ 0.00391533111093 0.01088 0.00251088329633,
+ 0.00389838329633 0.01088 0.00252783111093,
+ 0.00387875 0.01088 0.00254157849302,
+ 0.00385702776971 0.01088 0.00255170773536,
+ 0.00383387662443 0.01088 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 1 0 4.4408921e-16,
+ 1 0 4.4408921e-16,
+ 0.98480773 0 0.17364818,
+ 0.93969262 0 0.34202015,
+ 0.86602539 0 0.5,
+ 0.76604444 0 0.64278764,
+ 0.64278764 0 0.76604444,
+ 0.5 0 0.86602539,
+ 0.34202015 0 0.93969262,
+ 0.17364818 0 0.98480773,
+ 0 0 1,
+ -1.030287e-13 0 1,
+ 0.17364818 0 0.98480773,
+ 0.34202015 0 0.93969262,
+ 0.5 0 0.86602539,
+ 0.64278764 0 0.76604444,
+ 0.76604444 0 0.64278764,
+ 0.86602539 0 0.5,
+ 0.93969262 0 0.34202015,
+ 0.98480773 0 0.17364818,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 7 22 -1
+ 31 22 23 -1
+ 32 23 24 -1
+ 33 24 25 -1
+ 34 25 26 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 37 29 13 -1
+ 36 28 37 -1
+ 35 27 36 -1
+ 34 26 35 -1
+ 33 25 34 -1
+ 32 24 33 -1
+ 31 23 32 -1
+ 30 22 31 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 9 15 13 -1
+ 8 15 9 -1
+ 16 15 12 -1
+ 8 12 15 -1
+ 17 12 11 -1
+ 17 16 12 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 23 25 -1
+ 41 25 26 -1
+ 40 26 27 -1
+ 39 27 28 -1
+ 38 28 29 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 35 32 34 -1
+ 36 31 35 -1
+ 37 30 36 -1
+ 38 29 37 -1
+ 39 28 38 -1
+ 40 27 39 -1
+ 41 26 40 -1
+ 42 25 41 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 82 84 -1
+ 85 84 82 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ DEF PinsArrayLR_3 Shape {
+ appearance DEF __18 Appearance {
+ material DEF __19 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __20 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ -0.0039475 0.00834 0.0024225,
+ -0.0039475 0.00834 0.000275,
+ -0.0039475 0.008615 0,
+ -0.0039475 0.008615 -0.0035,
+ -0.0039475 0.009165 -0.0035,
+ -0.0039475 0.009165 0,
+ -0.0039475 0.00944 0.000275,
+ -0.0039475 0.00944 0.0024225,
+ -0.003175 0.00834 0.00256,
+ -0.00381 0.00834 0.00256,
+ -0.0036725 0.00834 0.000275,
+ -0.0036725 0.00834 0.002285,
+ -0.003175 0.00834 0.002285,
+ -0.00381 0.00944 0.00256,
+ -0.0036725 0.008615 0,
+ -0.003175 0.00944 0.00256,
+ -0.003175 0.00944 0.002285,
+ -0.0036725 0.00944 0.002285,
+ -0.0036725 0.00944 0.000275,
+ -0.0036725 0.008615 -0.0035,
+ -0.0036725 0.009165 0,
+ -0.0036725 0.009165 -0.0035,
+ -0.00394541106604 0.00834 0.00244637662443,
+ -0.00393920773536 0.00834 0.00246952776971,
+ -0.00392907849302 0.00834 0.00249125,
+ -0.00391533111093 0.00834 0.00251088329633,
+ -0.00389838329633 0.00834 0.00252783111093,
+ -0.00387875 0.00834 0.00254157849302,
+ -0.00385702776971 0.00834 0.00255170773536,
+ -0.00383387662443 0.00834 0.00255791106604,
+ -0.00394541106604 0.00944 0.00244637662443,
+ -0.00393920773536 0.00944 0.00246952776971,
+ -0.00392907849302 0.00944 0.00249125,
+ -0.00391533111093 0.00944 0.00251088329633,
+ -0.00389838329633 0.00944 0.00252783111093,
+ -0.00387875 0.00944 0.00254157849302,
+ -0.00385702776971 0.00944 0.00255170773536,
+ -0.00383387662443 0.00944 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ -1 0 4.4408921e-16,
+ -1 0 4.4408921e-16,
+ -0.98480773 0 0.17364818,
+ -0.93969262 0 0.34202015,
+ -0.86602539 0 0.5,
+ -0.76604444 0 0.64278764,
+ -0.64278764 0 0.76604444,
+ -0.5 0 0.86602539,
+ -0.34202015 0 0.93969262,
+ -0.17364818 0 0.98480773,
+ 0 0 1,
+ 1.030287e-13 0 1,
+ -0.17364818 0 0.98480773,
+ -0.34202015 0 0.93969262,
+ -0.5 0 0.86602539,
+ -0.64278764 0 0.76604444,
+ -0.76604444 0 0.64278764,
+ -0.86602539 0 0.5,
+ -0.93969262 0 0.34202015,
+ -0.98480773 0 0.17364818,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 22 31 -1
+ 32 24 33 -1
+ 34 26 35 -1
+ 36 28 37 -1
+ 37 29 13 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 34 25 26 -1
+ 35 27 36 -1
+ 33 24 25 -1
+ 33 25 34 -1
+ 32 23 24 -1
+ 31 23 32 -1
+ 31 22 23 -1
+ 30 7 22 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 15 9 8 -1
+ 13 9 15 -1
+ 12 16 8 -1
+ 15 8 16 -1
+ 12 17 16 -1
+ 12 11 17 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 25 41 -1
+ 40 27 39 -1
+ 38 29 37 -1
+ 36 31 35 -1
+ 35 32 34 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 38 28 29 -1
+ 37 30 36 -1
+ 39 27 28 -1
+ 39 28 38 -1
+ 40 26 27 -1
+ 41 26 40 -1
+ 41 25 26 -1
+ 42 23 25 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 84 82 -1
+ 85 82 84 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ DEF PinsArrayLR_4 Shape {
+ appearance DEF __22 Appearance {
+ material DEF __23 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __24 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ 0.0039475 0.00944 0.0024225,
+ 0.0039475 0.00944 0.000275,
+ 0.0039475 0.009165 0,
+ 0.0039475 0.009165 -0.0035,
+ 0.0039475 0.008615 -0.0035,
+ 0.0039475 0.008615 0,
+ 0.0039475 0.00834 0.000275,
+ 0.0039475 0.00834 0.0024225,
+ 0.003175 0.00944 0.00256,
+ 0.00381 0.00944 0.00256,
+ 0.0036725 0.00944 0.000275,
+ 0.0036725 0.00944 0.002285,
+ 0.003175 0.00944 0.002285,
+ 0.00381 0.00834 0.00256,
+ 0.0036725 0.009165 0,
+ 0.003175 0.00834 0.00256,
+ 0.003175 0.00834 0.002285,
+ 0.0036725 0.00834 0.002285,
+ 0.0036725 0.00834 0.000275,
+ 0.0036725 0.009165 -0.0035,
+ 0.0036725 0.008615 0,
+ 0.0036725 0.008615 -0.0035,
+ 0.00394541106604 0.00944 0.00244637662443,
+ 0.00393920773536 0.00944 0.00246952776971,
+ 0.00392907849302 0.00944 0.00249125,
+ 0.00391533111093 0.00944 0.00251088329633,
+ 0.00389838329633 0.00944 0.00252783111093,
+ 0.00387875 0.00944 0.00254157849302,
+ 0.00385702776971 0.00944 0.00255170773536,
+ 0.00383387662443 0.00944 0.00255791106604,
+ 0.00394541106604 0.00834 0.00244637662443,
+ 0.00393920773536 0.00834 0.00246952776971,
+ 0.00392907849302 0.00834 0.00249125,
+ 0.00391533111093 0.00834 0.00251088329633,
+ 0.00389838329633 0.00834 0.00252783111093,
+ 0.00387875 0.00834 0.00254157849302,
+ 0.00385702776971 0.00834 0.00255170773536,
+ 0.00383387662443 0.00834 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 1 0 4.4408921e-16,
+ 1 0 4.4408921e-16,
+ 0.98480773 0 0.17364818,
+ 0.93969262 0 0.34202015,
+ 0.86602539 0 0.5,
+ 0.76604444 0 0.64278764,
+ 0.64278764 0 0.76604444,
+ 0.5 0 0.86602539,
+ 0.34202015 0 0.93969262,
+ 0.17364818 0 0.98480773,
+ 0 0 1,
+ -1.030287e-13 0 1,
+ 0.17364818 0 0.98480773,
+ 0.34202015 0 0.93969262,
+ 0.5 0 0.86602539,
+ 0.64278764 0 0.76604444,
+ 0.76604444 0 0.64278764,
+ 0.86602539 0 0.5,
+ 0.93969262 0 0.34202015,
+ 0.98480773 0 0.17364818,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 7 22 -1
+ 31 22 23 -1
+ 32 23 24 -1
+ 33 24 25 -1
+ 34 25 26 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 37 29 13 -1
+ 36 28 37 -1
+ 35 27 36 -1
+ 34 26 35 -1
+ 33 25 34 -1
+ 32 24 33 -1
+ 31 23 32 -1
+ 30 22 31 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 9 15 13 -1
+ 8 15 9 -1
+ 16 15 12 -1
+ 8 12 15 -1
+ 17 12 11 -1
+ 17 16 12 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 23 25 -1
+ 41 25 26 -1
+ 40 26 27 -1
+ 39 27 28 -1
+ 38 28 29 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 35 32 34 -1
+ 36 31 35 -1
+ 37 30 36 -1
+ 38 29 37 -1
+ 39 28 38 -1
+ 40 27 39 -1
+ 41 26 40 -1
+ 42 25 41 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 82 84 -1
+ 85 84 82 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ DEF PinsArrayLR_5 Shape {
+ appearance DEF __26 Appearance {
+ material DEF __27 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __28 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ -0.0039475 0.0058 0.0024225,
+ -0.0039475 0.0058 0.000275,
+ -0.0039475 0.006075 0,
+ -0.0039475 0.006075 -0.0035,
+ -0.0039475 0.006625 -0.0035,
+ -0.0039475 0.006625 0,
+ -0.0039475 0.0069 0.000275,
+ -0.0039475 0.0069 0.0024225,
+ -0.003175 0.0058 0.00256,
+ -0.00381 0.0058 0.00256,
+ -0.0036725 0.0058 0.000275,
+ -0.0036725 0.0058 0.002285,
+ -0.003175 0.0058 0.002285,
+ -0.00381 0.0069 0.00256,
+ -0.0036725 0.006075 0,
+ -0.003175 0.0069 0.00256,
+ -0.003175 0.0069 0.002285,
+ -0.0036725 0.0069 0.002285,
+ -0.0036725 0.0069 0.000275,
+ -0.0036725 0.006075 -0.0035,
+ -0.0036725 0.006625 0,
+ -0.0036725 0.006625 -0.0035,
+ -0.00394541106604 0.0058 0.00244637662443,
+ -0.00393920773536 0.0058 0.00246952776971,
+ -0.00392907849302 0.0058 0.00249125,
+ -0.00391533111093 0.0058 0.00251088329633,
+ -0.00389838329633 0.0058 0.00252783111093,
+ -0.00387875 0.0058 0.00254157849302,
+ -0.00385702776971 0.0058 0.00255170773536,
+ -0.00383387662443 0.0058 0.00255791106604,
+ -0.00394541106604 0.0069 0.00244637662443,
+ -0.00393920773536 0.0069 0.00246952776971,
+ -0.00392907849302 0.0069 0.00249125,
+ -0.00391533111093 0.0069 0.00251088329633,
+ -0.00389838329633 0.0069 0.00252783111093,
+ -0.00387875 0.0069 0.00254157849302,
+ -0.00385702776971 0.0069 0.00255170773536,
+ -0.00383387662443 0.0069 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ -1 0 4.4408921e-16,
+ -1 0 4.4408921e-16,
+ -0.98480773 0 0.17364818,
+ -0.93969262 0 0.34202015,
+ -0.86602539 0 0.5,
+ -0.76604444 0 0.64278764,
+ -0.64278764 0 0.76604444,
+ -0.5 0 0.86602539,
+ -0.34202015 0 0.93969262,
+ -0.17364818 0 0.98480773,
+ 0 0 1,
+ 1.030287e-13 0 1,
+ -0.17364818 0 0.98480773,
+ -0.34202015 0 0.93969262,
+ -0.5 0 0.86602539,
+ -0.64278764 0 0.76604444,
+ -0.76604444 0 0.64278764,
+ -0.86602539 0 0.5,
+ -0.93969262 0 0.34202015,
+ -0.98480773 0 0.17364818,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 22 31 -1
+ 32 24 33 -1
+ 34 26 35 -1
+ 36 28 37 -1
+ 37 29 13 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 34 25 26 -1
+ 35 27 36 -1
+ 33 24 25 -1
+ 33 25 34 -1
+ 32 23 24 -1
+ 31 23 32 -1
+ 31 22 23 -1
+ 30 7 22 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 15 9 8 -1
+ 13 9 15 -1
+ 12 16 8 -1
+ 15 8 16 -1
+ 12 17 16 -1
+ 12 11 17 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 25 41 -1
+ 40 27 39 -1
+ 38 29 37 -1
+ 36 31 35 -1
+ 35 32 34 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 38 28 29 -1
+ 37 30 36 -1
+ 39 27 28 -1
+ 39 28 38 -1
+ 40 26 27 -1
+ 41 26 40 -1
+ 41 25 26 -1
+ 42 23 25 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 84 82 -1
+ 85 82 84 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ DEF PinsArrayLR_6 Shape {
+ appearance DEF __30 Appearance {
+ material DEF __31 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __32 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ 0.0039475 0.0069 0.0024225,
+ 0.0039475 0.0069 0.000275,
+ 0.0039475 0.006625 0,
+ 0.0039475 0.006625 -0.0035,
+ 0.0039475 0.006075 -0.0035,
+ 0.0039475 0.006075 0,
+ 0.0039475 0.0058 0.000275,
+ 0.0039475 0.0058 0.0024225,
+ 0.003175 0.0069 0.00256,
+ 0.00381 0.0069 0.00256,
+ 0.0036725 0.0069 0.000275,
+ 0.0036725 0.0069 0.002285,
+ 0.003175 0.0069 0.002285,
+ 0.00381 0.0058 0.00256,
+ 0.0036725 0.006625 0,
+ 0.003175 0.0058 0.00256,
+ 0.003175 0.0058 0.002285,
+ 0.0036725 0.0058 0.002285,
+ 0.0036725 0.0058 0.000275,
+ 0.0036725 0.006625 -0.0035,
+ 0.0036725 0.006075 0,
+ 0.0036725 0.006075 -0.0035,
+ 0.00394541106604 0.0069 0.00244637662443,
+ 0.00393920773536 0.0069 0.00246952776971,
+ 0.00392907849302 0.0069 0.00249125,
+ 0.00391533111093 0.0069 0.00251088329633,
+ 0.00389838329633 0.0069 0.00252783111093,
+ 0.00387875 0.0069 0.00254157849302,
+ 0.00385702776971 0.0069 0.00255170773536,
+ 0.00383387662443 0.0069 0.00255791106604,
+ 0.00394541106604 0.0058 0.00244637662443,
+ 0.00393920773536 0.0058 0.00246952776971,
+ 0.00392907849302 0.0058 0.00249125,
+ 0.00391533111093 0.0058 0.00251088329633,
+ 0.00389838329633 0.0058 0.00252783111093,
+ 0.00387875 0.0058 0.00254157849302,
+ 0.00385702776971 0.0058 0.00255170773536,
+ 0.00383387662443 0.0058 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 1 0 4.4408921e-16,
+ 1 0 4.4408921e-16,
+ 0.98480773 0 0.17364818,
+ 0.93969262 0 0.34202015,
+ 0.86602539 0 0.5,
+ 0.76604444 0 0.64278764,
+ 0.64278764 0 0.76604444,
+ 0.5 0 0.86602539,
+ 0.34202015 0 0.93969262,
+ 0.17364818 0 0.98480773,
+ 0 0 1,
+ -1.030287e-13 0 1,
+ 0.17364818 0 0.98480773,
+ 0.34202015 0 0.93969262,
+ 0.5 0 0.86602539,
+ 0.64278764 0 0.76604444,
+ 0.76604444 0 0.64278764,
+ 0.86602539 0 0.5,
+ 0.93969262 0 0.34202015,
+ 0.98480773 0 0.17364818,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 7 22 -1
+ 31 22 23 -1
+ 32 23 24 -1
+ 33 24 25 -1
+ 34 25 26 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 37 29 13 -1
+ 36 28 37 -1
+ 35 27 36 -1
+ 34 26 35 -1
+ 33 25 34 -1
+ 32 24 33 -1
+ 31 23 32 -1
+ 30 22 31 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 9 15 13 -1
+ 8 15 9 -1
+ 16 15 12 -1
+ 8 12 15 -1
+ 17 12 11 -1
+ 17 16 12 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 23 25 -1
+ 41 25 26 -1
+ 40 26 27 -1
+ 39 27 28 -1
+ 38 28 29 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 35 32 34 -1
+ 36 31 35 -1
+ 37 30 36 -1
+ 38 29 37 -1
+ 39 28 38 -1
+ 40 27 39 -1
+ 41 26 40 -1
+ 42 25 41 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 82 84 -1
+ 85 84 82 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ DEF PinsArrayLR_7 Shape {
+ appearance DEF __34 Appearance {
+ material DEF __35 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __36 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ -0.0039475 0.00326 0.0024225,
+ -0.0039475 0.00326 0.000275,
+ -0.0039475 0.003535 0,
+ -0.0039475 0.003535 -0.0035,
+ -0.0039475 0.004085 -0.0035,
+ -0.0039475 0.004085 0,
+ -0.0039475 0.00436 0.000275,
+ -0.0039475 0.00436 0.0024225,
+ -0.003175 0.00326 0.00256,
+ -0.00381 0.00326 0.00256,
+ -0.0036725 0.00326 0.000275,
+ -0.0036725 0.00326 0.002285,
+ -0.003175 0.00326 0.002285,
+ -0.00381 0.00436 0.00256,
+ -0.0036725 0.003535 0,
+ -0.003175 0.00436 0.00256,
+ -0.003175 0.00436 0.002285,
+ -0.0036725 0.00436 0.002285,
+ -0.0036725 0.00436 0.000275,
+ -0.0036725 0.003535 -0.0035,
+ -0.0036725 0.004085 0,
+ -0.0036725 0.004085 -0.0035,
+ -0.00394541106604 0.00326 0.00244637662443,
+ -0.00393920773536 0.00326 0.00246952776971,
+ -0.00392907849302 0.00326 0.00249125,
+ -0.00391533111093 0.00326 0.00251088329633,
+ -0.00389838329633 0.00326 0.00252783111093,
+ -0.00387875 0.00326 0.00254157849302,
+ -0.00385702776971 0.00326 0.00255170773536,
+ -0.00383387662443 0.00326 0.00255791106604,
+ -0.00394541106604 0.00436 0.00244637662443,
+ -0.00393920773536 0.00436 0.00246952776971,
+ -0.00392907849302 0.00436 0.00249125,
+ -0.00391533111093 0.00436 0.00251088329633,
+ -0.00389838329633 0.00436 0.00252783111093,
+ -0.00387875 0.00436 0.00254157849302,
+ -0.00385702776971 0.00436 0.00255170773536,
+ -0.00383387662443 0.00436 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ -1 0 4.4408921e-16,
+ -1 0 4.4408921e-16,
+ -0.98480773 0 0.17364818,
+ -0.93969262 0 0.34202015,
+ -0.86602539 0 0.5,
+ -0.76604444 0 0.64278764,
+ -0.64278764 0 0.76604444,
+ -0.5 0 0.86602539,
+ -0.34202015 0 0.93969262,
+ -0.17364818 0 0.98480773,
+ 0 0 1,
+ 1.030287e-13 0 1,
+ -0.17364818 0 0.98480773,
+ -0.34202015 0 0.93969262,
+ -0.5 0 0.86602539,
+ -0.64278764 0 0.76604444,
+ -0.76604444 0 0.64278764,
+ -0.86602539 0 0.5,
+ -0.93969262 0 0.34202015,
+ -0.98480773 0 0.17364818,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 22 31 -1
+ 32 24 33 -1
+ 34 26 35 -1
+ 36 28 37 -1
+ 37 29 13 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 34 25 26 -1
+ 35 27 36 -1
+ 33 24 25 -1
+ 33 25 34 -1
+ 32 23 24 -1
+ 31 23 32 -1
+ 31 22 23 -1
+ 30 7 22 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 15 9 8 -1
+ 13 9 15 -1
+ 12 16 8 -1
+ 15 8 16 -1
+ 12 17 16 -1
+ 12 11 17 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 25 41 -1
+ 40 27 39 -1
+ 38 29 37 -1
+ 36 31 35 -1
+ 35 32 34 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 38 28 29 -1
+ 37 30 36 -1
+ 39 27 28 -1
+ 39 28 38 -1
+ 40 26 27 -1
+ 41 26 40 -1
+ 41 25 26 -1
+ 42 23 25 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 84 82 -1
+ 85 82 84 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ DEF PinsArrayLR_8 Shape {
+ appearance DEF __38 Appearance {
+ material DEF __39 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __40 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ 0.0039475 0.00436 0.0024225,
+ 0.0039475 0.00436 0.000275,
+ 0.0039475 0.004085 0,
+ 0.0039475 0.004085 -0.0035,
+ 0.0039475 0.003535 -0.0035,
+ 0.0039475 0.003535 0,
+ 0.0039475 0.00326 0.000275,
+ 0.0039475 0.00326 0.0024225,
+ 0.003175 0.00436 0.00256,
+ 0.00381 0.00436 0.00256,
+ 0.0036725 0.00436 0.000275,
+ 0.0036725 0.00436 0.002285,
+ 0.003175 0.00436 0.002285,
+ 0.00381 0.00326 0.00256,
+ 0.0036725 0.004085 0,
+ 0.003175 0.00326 0.00256,
+ 0.003175 0.00326 0.002285,
+ 0.0036725 0.00326 0.002285,
+ 0.0036725 0.00326 0.000275,
+ 0.0036725 0.004085 -0.0035,
+ 0.0036725 0.003535 0,
+ 0.0036725 0.003535 -0.0035,
+ 0.00394541106604 0.00436 0.00244637662443,
+ 0.00393920773536 0.00436 0.00246952776971,
+ 0.00392907849302 0.00436 0.00249125,
+ 0.00391533111093 0.00436 0.00251088329633,
+ 0.00389838329633 0.00436 0.00252783111093,
+ 0.00387875 0.00436 0.00254157849302,
+ 0.00385702776971 0.00436 0.00255170773536,
+ 0.00383387662443 0.00436 0.00255791106604,
+ 0.00394541106604 0.00326 0.00244637662443,
+ 0.00393920773536 0.00326 0.00246952776971,
+ 0.00392907849302 0.00326 0.00249125,
+ 0.00391533111093 0.00326 0.00251088329633,
+ 0.00389838329633 0.00326 0.00252783111093,
+ 0.00387875 0.00326 0.00254157849302,
+ 0.00385702776971 0.00326 0.00255170773536,
+ 0.00383387662443 0.00326 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 1 0 4.4408921e-16,
+ 1 0 4.4408921e-16,
+ 0.98480773 0 0.17364818,
+ 0.93969262 0 0.34202015,
+ 0.86602539 0 0.5,
+ 0.76604444 0 0.64278764,
+ 0.64278764 0 0.76604444,
+ 0.5 0 0.86602539,
+ 0.34202015 0 0.93969262,
+ 0.17364818 0 0.98480773,
+ 0 0 1,
+ -1.030287e-13 0 1,
+ 0.17364818 0 0.98480773,
+ 0.34202015 0 0.93969262,
+ 0.5 0 0.86602539,
+ 0.64278764 0 0.76604444,
+ 0.76604444 0 0.64278764,
+ 0.86602539 0 0.5,
+ 0.93969262 0 0.34202015,
+ 0.98480773 0 0.17364818,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 7 22 -1
+ 31 22 23 -1
+ 32 23 24 -1
+ 33 24 25 -1
+ 34 25 26 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 37 29 13 -1
+ 36 28 37 -1
+ 35 27 36 -1
+ 34 26 35 -1
+ 33 25 34 -1
+ 32 24 33 -1
+ 31 23 32 -1
+ 30 22 31 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 9 15 13 -1
+ 8 15 9 -1
+ 16 15 12 -1
+ 8 12 15 -1
+ 17 12 11 -1
+ 17 16 12 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 23 25 -1
+ 41 25 26 -1
+ 40 26 27 -1
+ 39 27 28 -1
+ 38 28 29 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 35 32 34 -1
+ 36 31 35 -1
+ 37 30 36 -1
+ 38 29 37 -1
+ 39 28 38 -1
+ 40 27 39 -1
+ 41 26 40 -1
+ 42 25 41 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 82 84 -1
+ 85 84 82 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ DEF PinsArrayLR_9 Shape {
+ appearance DEF __42 Appearance {
+ material DEF __43 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __44 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ -0.0039475 0.00072 0.0024225,
+ -0.0039475 0.00072 0.000275,
+ -0.0039475 0.000995 0,
+ -0.0039475 0.000995 -0.0035,
+ -0.0039475 0.001545 -0.0035,
+ -0.0039475 0.001545 0,
+ -0.0039475 0.00182 0.000275,
+ -0.0039475 0.00182 0.0024225,
+ -0.003175 0.00072 0.00256,
+ -0.00381 0.00072 0.00256,
+ -0.0036725 0.00072 0.000275,
+ -0.0036725 0.00072 0.002285,
+ -0.003175 0.00072 0.002285,
+ -0.00381 0.00182 0.00256,
+ -0.0036725 0.000995 0,
+ -0.003175 0.00182 0.00256,
+ -0.003175 0.00182 0.002285,
+ -0.0036725 0.00182 0.002285,
+ -0.0036725 0.00182 0.000275,
+ -0.0036725 0.000995 -0.0035,
+ -0.0036725 0.001545 0,
+ -0.0036725 0.001545 -0.0035,
+ -0.00394541106604 0.00072 0.00244637662443,
+ -0.00393920773536 0.00072 0.00246952776971,
+ -0.00392907849302 0.00072 0.00249125,
+ -0.00391533111093 0.00072 0.00251088329633,
+ -0.00389838329633 0.00072 0.00252783111093,
+ -0.00387875 0.00072 0.00254157849302,
+ -0.00385702776971 0.00072 0.00255170773536,
+ -0.00383387662443 0.00072 0.00255791106604,
+ -0.00394541106604 0.00182 0.00244637662443,
+ -0.00393920773536 0.00182 0.00246952776971,
+ -0.00392907849302 0.00182 0.00249125,
+ -0.00391533111093 0.00182 0.00251088329633,
+ -0.00389838329633 0.00182 0.00252783111093,
+ -0.00387875 0.00182 0.00254157849302,
+ -0.00385702776971 0.00182 0.00255170773536,
+ -0.00383387662443 0.00182 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ -1 0 4.4408921e-16,
+ -1 0 4.4408921e-16,
+ -0.98480773 0 0.17364818,
+ -0.93969262 0 0.34202015,
+ -0.86602539 0 0.5,
+ -0.76604444 0 0.64278764,
+ -0.64278764 0 0.76604444,
+ -0.5 0 0.86602539,
+ -0.34202015 0 0.93969262,
+ -0.17364818 0 0.98480773,
+ 0 0 1,
+ 1.030287e-13 0 1,
+ -0.17364818 0 0.98480773,
+ -0.34202015 0 0.93969262,
+ -0.5 0 0.86602539,
+ -0.64278764 0 0.76604444,
+ -0.76604444 0 0.64278764,
+ -0.86602539 0 0.5,
+ -0.93969262 0 0.34202015,
+ -0.98480773 0 0.17364818,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 22 31 -1
+ 32 24 33 -1
+ 34 26 35 -1
+ 36 28 37 -1
+ 37 29 13 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 34 25 26 -1
+ 35 27 36 -1
+ 33 24 25 -1
+ 33 25 34 -1
+ 32 23 24 -1
+ 31 23 32 -1
+ 31 22 23 -1
+ 30 7 22 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 15 9 8 -1
+ 13 9 15 -1
+ 12 16 8 -1
+ 15 8 16 -1
+ 12 17 16 -1
+ 12 11 17 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 25 41 -1
+ 40 27 39 -1
+ 38 29 37 -1
+ 36 31 35 -1
+ 35 32 34 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 38 28 29 -1
+ 37 30 36 -1
+ 39 27 28 -1
+ 39 28 38 -1
+ 40 26 27 -1
+ 41 26 40 -1
+ 41 25 26 -1
+ 42 23 25 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 84 82 -1
+ 85 82 84 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ DEF PinsArrayLR_10 Shape {
+ appearance DEF __46 Appearance {
+ material DEF __47 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __48 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ 0.0039475 0.00182 0.0024225,
+ 0.0039475 0.00182 0.000275,
+ 0.0039475 0.001545 0,
+ 0.0039475 0.001545 -0.0035,
+ 0.0039475 0.000995 -0.0035,
+ 0.0039475 0.000995 0,
+ 0.0039475 0.00072 0.000275,
+ 0.0039475 0.00072 0.0024225,
+ 0.003175 0.00182 0.00256,
+ 0.00381 0.00182 0.00256,
+ 0.0036725 0.00182 0.000275,
+ 0.0036725 0.00182 0.002285,
+ 0.003175 0.00182 0.002285,
+ 0.00381 0.00072 0.00256,
+ 0.0036725 0.001545 0,
+ 0.003175 0.00072 0.00256,
+ 0.003175 0.00072 0.002285,
+ 0.0036725 0.00072 0.002285,
+ 0.0036725 0.00072 0.000275,
+ 0.0036725 0.001545 -0.0035,
+ 0.0036725 0.000995 0,
+ 0.0036725 0.000995 -0.0035,
+ 0.00394541106604 0.00182 0.00244637662443,
+ 0.00393920773536 0.00182 0.00246952776971,
+ 0.00392907849302 0.00182 0.00249125,
+ 0.00391533111093 0.00182 0.00251088329633,
+ 0.00389838329633 0.00182 0.00252783111093,
+ 0.00387875 0.00182 0.00254157849302,
+ 0.00385702776971 0.00182 0.00255170773536,
+ 0.00383387662443 0.00182 0.00255791106604,
+ 0.00394541106604 0.00072 0.00244637662443,
+ 0.00393920773536 0.00072 0.00246952776971,
+ 0.00392907849302 0.00072 0.00249125,
+ 0.00391533111093 0.00072 0.00251088329633,
+ 0.00389838329633 0.00072 0.00252783111093,
+ 0.00387875 0.00072 0.00254157849302,
+ 0.00385702776971 0.00072 0.00255170773536,
+ 0.00383387662443 0.00072 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 1 0 4.4408921e-16,
+ 1 0 4.4408921e-16,
+ 0.98480773 0 0.17364818,
+ 0.93969262 0 0.34202015,
+ 0.86602539 0 0.5,
+ 0.76604444 0 0.64278764,
+ 0.64278764 0 0.76604444,
+ 0.5 0 0.86602539,
+ 0.34202015 0 0.93969262,
+ 0.17364818 0 0.98480773,
+ 0 0 1,
+ -1.030287e-13 0 1,
+ 0.17364818 0 0.98480773,
+ 0.34202015 0 0.93969262,
+ 0.5 0 0.86602539,
+ 0.64278764 0 0.76604444,
+ 0.76604444 0 0.64278764,
+ 0.86602539 0 0.5,
+ 0.93969262 0 0.34202015,
+ 0.98480773 0 0.17364818,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 7 22 -1
+ 31 22 23 -1
+ 32 23 24 -1
+ 33 24 25 -1
+ 34 25 26 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 37 29 13 -1
+ 36 28 37 -1
+ 35 27 36 -1
+ 34 26 35 -1
+ 33 25 34 -1
+ 32 24 33 -1
+ 31 23 32 -1
+ 30 22 31 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 9 15 13 -1
+ 8 15 9 -1
+ 16 15 12 -1
+ 8 12 15 -1
+ 17 12 11 -1
+ 17 16 12 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 23 25 -1
+ 41 25 26 -1
+ 40 26 27 -1
+ 39 27 28 -1
+ 38 28 29 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 35 32 34 -1
+ 36 31 35 -1
+ 37 30 36 -1
+ 38 29 37 -1
+ 39 28 38 -1
+ 40 27 39 -1
+ 41 26 40 -1
+ 42 25 41 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 82 84 -1
+ 85 84 82 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ DEF PinsArrayLR_11 Shape {
+ appearance DEF __50 Appearance {
+ material DEF __51 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __52 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ -0.0039475 -0.00182 0.0024225,
+ -0.0039475 -0.00182 0.000275,
+ -0.0039475 -0.001545 0,
+ -0.0039475 -0.001545 -0.0035,
+ -0.0039475 -0.000995 -0.0035,
+ -0.0039475 -0.000995 0,
+ -0.0039475 -0.00072 0.000275,
+ -0.0039475 -0.00072 0.0024225,
+ -0.003175 -0.00182 0.00256,
+ -0.00381 -0.00182 0.00256,
+ -0.0036725 -0.00182 0.000275,
+ -0.0036725 -0.00182 0.002285,
+ -0.003175 -0.00182 0.002285,
+ -0.00381 -0.00072 0.00256,
+ -0.0036725 -0.001545 0,
+ -0.003175 -0.00072 0.00256,
+ -0.003175 -0.00072 0.002285,
+ -0.0036725 -0.00072 0.002285,
+ -0.0036725 -0.00072 0.000275,
+ -0.0036725 -0.001545 -0.0035,
+ -0.0036725 -0.000995 0,
+ -0.0036725 -0.000995 -0.0035,
+ -0.00394541106604 -0.00182 0.00244637662443,
+ -0.00393920773536 -0.00182 0.00246952776971,
+ -0.00392907849302 -0.00182 0.00249125,
+ -0.00391533111093 -0.00182 0.00251088329633,
+ -0.00389838329633 -0.00182 0.00252783111093,
+ -0.00387875 -0.00182 0.00254157849302,
+ -0.00385702776971 -0.00182 0.00255170773536,
+ -0.00383387662443 -0.00182 0.00255791106604,
+ -0.00394541106604 -0.00072 0.00244637662443,
+ -0.00393920773536 -0.00072 0.00246952776971,
+ -0.00392907849302 -0.00072 0.00249125,
+ -0.00391533111093 -0.00072 0.00251088329633,
+ -0.00389838329633 -0.00072 0.00252783111093,
+ -0.00387875 -0.00072 0.00254157849302,
+ -0.00385702776971 -0.00072 0.00255170773536,
+ -0.00383387662443 -0.00072 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ -1 0 4.4408921e-16,
+ -1 0 4.4408921e-16,
+ -0.98480773 0 0.17364818,
+ -0.93969262 0 0.34202015,
+ -0.86602539 0 0.5,
+ -0.76604444 0 0.64278764,
+ -0.64278764 0 0.76604444,
+ -0.5 0 0.86602539,
+ -0.34202015 0 0.93969262,
+ -0.17364818 0 0.98480773,
+ 0 0 1,
+ 1.030287e-13 0 1,
+ -0.17364818 0 0.98480773,
+ -0.34202015 0 0.93969262,
+ -0.5 0 0.86602539,
+ -0.64278764 0 0.76604444,
+ -0.76604444 0 0.64278764,
+ -0.86602539 0 0.5,
+ -0.93969262 0 0.34202015,
+ -0.98480773 0 0.17364818,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 22 31 -1
+ 32 24 33 -1
+ 34 26 35 -1
+ 36 28 37 -1
+ 37 29 13 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 34 25 26 -1
+ 35 27 36 -1
+ 33 24 25 -1
+ 33 25 34 -1
+ 32 23 24 -1
+ 31 23 32 -1
+ 31 22 23 -1
+ 30 7 22 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 15 9 8 -1
+ 13 9 15 -1
+ 12 16 8 -1
+ 15 8 16 -1
+ 12 17 16 -1
+ 12 11 17 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 25 41 -1
+ 40 27 39 -1
+ 38 29 37 -1
+ 36 31 35 -1
+ 35 32 34 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 38 28 29 -1
+ 37 30 36 -1
+ 39 27 28 -1
+ 39 28 38 -1
+ 40 26 27 -1
+ 41 26 40 -1
+ 41 25 26 -1
+ 42 23 25 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 84 82 -1
+ 85 82 84 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ DEF PinsArrayLR_12 Shape {
+ appearance DEF __54 Appearance {
+ material DEF __55 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __56 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ 0.0039475 -0.00072 0.0024225,
+ 0.0039475 -0.00072 0.000275,
+ 0.0039475 -0.000995 0,
+ 0.0039475 -0.000995 -0.0035,
+ 0.0039475 -0.001545 -0.0035,
+ 0.0039475 -0.001545 0,
+ 0.0039475 -0.00182 0.000275,
+ 0.0039475 -0.00182 0.0024225,
+ 0.003175 -0.00072 0.00256,
+ 0.00381 -0.00072 0.00256,
+ 0.0036725 -0.00072 0.000275,
+ 0.0036725 -0.00072 0.002285,
+ 0.003175 -0.00072 0.002285,
+ 0.00381 -0.00182 0.00256,
+ 0.0036725 -0.000995 0,
+ 0.003175 -0.00182 0.00256,
+ 0.003175 -0.00182 0.002285,
+ 0.0036725 -0.00182 0.002285,
+ 0.0036725 -0.00182 0.000275,
+ 0.0036725 -0.000995 -0.0035,
+ 0.0036725 -0.001545 0,
+ 0.0036725 -0.001545 -0.0035,
+ 0.00394541106604 -0.00072 0.00244637662443,
+ 0.00393920773536 -0.00072 0.00246952776971,
+ 0.00392907849302 -0.00072 0.00249125,
+ 0.00391533111093 -0.00072 0.00251088329633,
+ 0.00389838329633 -0.00072 0.00252783111093,
+ 0.00387875 -0.00072 0.00254157849302,
+ 0.00385702776971 -0.00072 0.00255170773536,
+ 0.00383387662443 -0.00072 0.00255791106604,
+ 0.00394541106604 -0.00182 0.00244637662443,
+ 0.00393920773536 -0.00182 0.00246952776971,
+ 0.00392907849302 -0.00182 0.00249125,
+ 0.00391533111093 -0.00182 0.00251088329633,
+ 0.00389838329633 -0.00182 0.00252783111093,
+ 0.00387875 -0.00182 0.00254157849302,
+ 0.00385702776971 -0.00182 0.00255170773536,
+ 0.00383387662443 -0.00182 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 1 0 4.4408921e-16,
+ 1 0 4.4408921e-16,
+ 0.98480773 0 0.17364818,
+ 0.93969262 0 0.34202015,
+ 0.86602539 0 0.5,
+ 0.76604444 0 0.64278764,
+ 0.64278764 0 0.76604444,
+ 0.5 0 0.86602539,
+ 0.34202015 0 0.93969262,
+ 0.17364818 0 0.98480773,
+ 0 0 1,
+ -1.030287e-13 0 1,
+ 0.17364818 0 0.98480773,
+ 0.34202015 0 0.93969262,
+ 0.5 0 0.86602539,
+ 0.64278764 0 0.76604444,
+ 0.76604444 0 0.64278764,
+ 0.86602539 0 0.5,
+ 0.93969262 0 0.34202015,
+ 0.98480773 0 0.17364818,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 7 22 -1
+ 31 22 23 -1
+ 32 23 24 -1
+ 33 24 25 -1
+ 34 25 26 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 37 29 13 -1
+ 36 28 37 -1
+ 35 27 36 -1
+ 34 26 35 -1
+ 33 25 34 -1
+ 32 24 33 -1
+ 31 23 32 -1
+ 30 22 31 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 9 15 13 -1
+ 8 15 9 -1
+ 16 15 12 -1
+ 8 12 15 -1
+ 17 12 11 -1
+ 17 16 12 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 23 25 -1
+ 41 25 26 -1
+ 40 26 27 -1
+ 39 27 28 -1
+ 38 28 29 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 35 32 34 -1
+ 36 31 35 -1
+ 37 30 36 -1
+ 38 29 37 -1
+ 39 28 38 -1
+ 40 27 39 -1
+ 41 26 40 -1
+ 42 25 41 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 82 84 -1
+ 85 84 82 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ DEF PinsArrayLR_13 Shape {
+ appearance DEF __58 Appearance {
+ material DEF __59 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __60 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ -0.0039475 -0.00436 0.0024225,
+ -0.0039475 -0.00436 0.000275,
+ -0.0039475 -0.004085 0,
+ -0.0039475 -0.004085 -0.0035,
+ -0.0039475 -0.003535 -0.0035,
+ -0.0039475 -0.003535 0,
+ -0.0039475 -0.00326 0.000275,
+ -0.0039475 -0.00326 0.0024225,
+ -0.003175 -0.00436 0.00256,
+ -0.00381 -0.00436 0.00256,
+ -0.0036725 -0.00436 0.000275,
+ -0.0036725 -0.00436 0.002285,
+ -0.003175 -0.00436 0.002285,
+ -0.00381 -0.00326 0.00256,
+ -0.0036725 -0.004085 0,
+ -0.003175 -0.00326 0.00256,
+ -0.003175 -0.00326 0.002285,
+ -0.0036725 -0.00326 0.002285,
+ -0.0036725 -0.00326 0.000275,
+ -0.0036725 -0.004085 -0.0035,
+ -0.0036725 -0.003535 0,
+ -0.0036725 -0.003535 -0.0035,
+ -0.00394541106604 -0.00436 0.00244637662443,
+ -0.00393920773536 -0.00436 0.00246952776971,
+ -0.00392907849302 -0.00436 0.00249125,
+ -0.00391533111093 -0.00436 0.00251088329633,
+ -0.00389838329633 -0.00436 0.00252783111093,
+ -0.00387875 -0.00436 0.00254157849302,
+ -0.00385702776971 -0.00436 0.00255170773536,
+ -0.00383387662443 -0.00436 0.00255791106604,
+ -0.00394541106604 -0.00326 0.00244637662443,
+ -0.00393920773536 -0.00326 0.00246952776971,
+ -0.00392907849302 -0.00326 0.00249125,
+ -0.00391533111093 -0.00326 0.00251088329633,
+ -0.00389838329633 -0.00326 0.00252783111093,
+ -0.00387875 -0.00326 0.00254157849302,
+ -0.00385702776971 -0.00326 0.00255170773536,
+ -0.00383387662443 -0.00326 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ -1 0 4.4408921e-16,
+ -1 0 4.4408921e-16,
+ -0.98480773 0 0.17364818,
+ -0.93969262 0 0.34202015,
+ -0.86602539 0 0.5,
+ -0.76604444 0 0.64278764,
+ -0.64278764 0 0.76604444,
+ -0.5 0 0.86602539,
+ -0.34202015 0 0.93969262,
+ -0.17364818 0 0.98480773,
+ 0 0 1,
+ 1.030287e-13 0 1,
+ -0.17364818 0 0.98480773,
+ -0.34202015 0 0.93969262,
+ -0.5 0 0.86602539,
+ -0.64278764 0 0.76604444,
+ -0.76604444 0 0.64278764,
+ -0.86602539 0 0.5,
+ -0.93969262 0 0.34202015,
+ -0.98480773 0 0.17364818,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 22 31 -1
+ 32 24 33 -1
+ 34 26 35 -1
+ 36 28 37 -1
+ 37 29 13 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 34 25 26 -1
+ 35 27 36 -1
+ 33 24 25 -1
+ 33 25 34 -1
+ 32 23 24 -1
+ 31 23 32 -1
+ 31 22 23 -1
+ 30 7 22 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 15 9 8 -1
+ 13 9 15 -1
+ 12 16 8 -1
+ 15 8 16 -1
+ 12 17 16 -1
+ 12 11 17 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 25 41 -1
+ 40 27 39 -1
+ 38 29 37 -1
+ 36 31 35 -1
+ 35 32 34 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 38 28 29 -1
+ 37 30 36 -1
+ 39 27 28 -1
+ 39 28 38 -1
+ 40 26 27 -1
+ 41 26 40 -1
+ 41 25 26 -1
+ 42 23 25 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 84 82 -1
+ 85 82 84 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ DEF PinsArrayLR_14 Shape {
+ appearance DEF __62 Appearance {
+ material DEF __63 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __64 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ 0.0039475 -0.00326 0.0024225,
+ 0.0039475 -0.00326 0.000275,
+ 0.0039475 -0.003535 0,
+ 0.0039475 -0.003535 -0.0035,
+ 0.0039475 -0.004085 -0.0035,
+ 0.0039475 -0.004085 0,
+ 0.0039475 -0.00436 0.000275,
+ 0.0039475 -0.00436 0.0024225,
+ 0.003175 -0.00326 0.00256,
+ 0.00381 -0.00326 0.00256,
+ 0.0036725 -0.00326 0.000275,
+ 0.0036725 -0.00326 0.002285,
+ 0.003175 -0.00326 0.002285,
+ 0.00381 -0.00436 0.00256,
+ 0.0036725 -0.003535 0,
+ 0.003175 -0.00436 0.00256,
+ 0.003175 -0.00436 0.002285,
+ 0.0036725 -0.00436 0.002285,
+ 0.0036725 -0.00436 0.000275,
+ 0.0036725 -0.003535 -0.0035,
+ 0.0036725 -0.004085 0,
+ 0.0036725 -0.004085 -0.0035,
+ 0.00394541106604 -0.00326 0.00244637662443,
+ 0.00393920773536 -0.00326 0.00246952776971,
+ 0.00392907849302 -0.00326 0.00249125,
+ 0.00391533111093 -0.00326 0.00251088329633,
+ 0.00389838329633 -0.00326 0.00252783111093,
+ 0.00387875 -0.00326 0.00254157849302,
+ 0.00385702776971 -0.00326 0.00255170773536,
+ 0.00383387662443 -0.00326 0.00255791106604,
+ 0.00394541106604 -0.00436 0.00244637662443,
+ 0.00393920773536 -0.00436 0.00246952776971,
+ 0.00392907849302 -0.00436 0.00249125,
+ 0.00391533111093 -0.00436 0.00251088329633,
+ 0.00389838329633 -0.00436 0.00252783111093,
+ 0.00387875 -0.00436 0.00254157849302,
+ 0.00385702776971 -0.00436 0.00255170773536,
+ 0.00383387662443 -0.00436 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 1 0 4.4408921e-16,
+ 1 0 4.4408921e-16,
+ 0.98480773 0 0.17364818,
+ 0.93969262 0 0.34202015,
+ 0.86602539 0 0.5,
+ 0.76604444 0 0.64278764,
+ 0.64278764 0 0.76604444,
+ 0.5 0 0.86602539,
+ 0.34202015 0 0.93969262,
+ 0.17364818 0 0.98480773,
+ 0 0 1,
+ -1.030287e-13 0 1,
+ 0.17364818 0 0.98480773,
+ 0.34202015 0 0.93969262,
+ 0.5 0 0.86602539,
+ 0.64278764 0 0.76604444,
+ 0.76604444 0 0.64278764,
+ 0.86602539 0 0.5,
+ 0.93969262 0 0.34202015,
+ 0.98480773 0 0.17364818,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 7 22 -1
+ 31 22 23 -1
+ 32 23 24 -1
+ 33 24 25 -1
+ 34 25 26 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 37 29 13 -1
+ 36 28 37 -1
+ 35 27 36 -1
+ 34 26 35 -1
+ 33 25 34 -1
+ 32 24 33 -1
+ 31 23 32 -1
+ 30 22 31 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 9 15 13 -1
+ 8 15 9 -1
+ 16 15 12 -1
+ 8 12 15 -1
+ 17 12 11 -1
+ 17 16 12 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 23 25 -1
+ 41 25 26 -1
+ 40 26 27 -1
+ 39 27 28 -1
+ 38 28 29 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 35 32 34 -1
+ 36 31 35 -1
+ 37 30 36 -1
+ 38 29 37 -1
+ 39 28 38 -1
+ 40 27 39 -1
+ 41 26 40 -1
+ 42 25 41 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 82 84 -1
+ 85 84 82 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ DEF PinsArrayLR_15 Shape {
+ appearance DEF __66 Appearance {
+ material DEF __67 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __68 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ -0.0039475 -0.0069 0.0024225,
+ -0.0039475 -0.0069 0.000275,
+ -0.0039475 -0.006625 0,
+ -0.0039475 -0.006625 -0.0035,
+ -0.0039475 -0.006075 -0.0035,
+ -0.0039475 -0.006075 0,
+ -0.0039475 -0.0058 0.000275,
+ -0.0039475 -0.0058 0.0024225,
+ -0.003175 -0.0069 0.00256,
+ -0.00381 -0.0069 0.00256,
+ -0.0036725 -0.0069 0.000275,
+ -0.0036725 -0.0069 0.002285,
+ -0.003175 -0.0069 0.002285,
+ -0.00381 -0.0058 0.00256,
+ -0.0036725 -0.006625 0,
+ -0.003175 -0.0058 0.00256,
+ -0.003175 -0.0058 0.002285,
+ -0.0036725 -0.0058 0.002285,
+ -0.0036725 -0.0058 0.000275,
+ -0.0036725 -0.006625 -0.0035,
+ -0.0036725 -0.006075 0,
+ -0.0036725 -0.006075 -0.0035,
+ -0.00394541106604 -0.0069 0.00244637662443,
+ -0.00393920773536 -0.0069 0.00246952776971,
+ -0.00392907849302 -0.0069 0.00249125,
+ -0.00391533111093 -0.0069 0.00251088329633,
+ -0.00389838329633 -0.0069 0.00252783111093,
+ -0.00387875 -0.0069 0.00254157849302,
+ -0.00385702776971 -0.0069 0.00255170773536,
+ -0.00383387662443 -0.0069 0.00255791106604,
+ -0.00394541106604 -0.0058 0.00244637662443,
+ -0.00393920773536 -0.0058 0.00246952776971,
+ -0.00392907849302 -0.0058 0.00249125,
+ -0.00391533111093 -0.0058 0.00251088329633,
+ -0.00389838329633 -0.0058 0.00252783111093,
+ -0.00387875 -0.0058 0.00254157849302,
+ -0.00385702776971 -0.0058 0.00255170773536,
+ -0.00383387662443 -0.0058 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ -1 0 4.4408921e-16,
+ -1 0 4.4408921e-16,
+ -0.98480773 0 0.17364818,
+ -0.93969262 0 0.34202015,
+ -0.86602539 0 0.5,
+ -0.76604444 0 0.64278764,
+ -0.64278764 0 0.76604444,
+ -0.5 0 0.86602539,
+ -0.34202015 0 0.93969262,
+ -0.17364818 0 0.98480773,
+ 0 0 1,
+ 1.030287e-13 0 1,
+ -0.17364818 0 0.98480773,
+ -0.34202015 0 0.93969262,
+ -0.5 0 0.86602539,
+ -0.64278764 0 0.76604444,
+ -0.76604444 0 0.64278764,
+ -0.86602539 0 0.5,
+ -0.93969262 0 0.34202015,
+ -0.98480773 0 0.17364818,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 22 31 -1
+ 32 24 33 -1
+ 34 26 35 -1
+ 36 28 37 -1
+ 37 29 13 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 34 25 26 -1
+ 35 27 36 -1
+ 33 24 25 -1
+ 33 25 34 -1
+ 32 23 24 -1
+ 31 23 32 -1
+ 31 22 23 -1
+ 30 7 22 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 15 9 8 -1
+ 13 9 15 -1
+ 12 16 8 -1
+ 15 8 16 -1
+ 12 17 16 -1
+ 12 11 17 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 25 41 -1
+ 40 27 39 -1
+ 38 29 37 -1
+ 36 31 35 -1
+ 35 32 34 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 38 28 29 -1
+ 37 30 36 -1
+ 39 27 28 -1
+ 39 28 38 -1
+ 40 26 27 -1
+ 41 26 40 -1
+ 41 25 26 -1
+ 42 23 25 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 84 82 -1
+ 85 82 84 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ DEF PinsArrayLR_16 Shape {
+ appearance DEF __70 Appearance {
+ material DEF __71 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __72 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ 0.0039475 -0.0058 0.0024225,
+ 0.0039475 -0.0058 0.000275,
+ 0.0039475 -0.006075 0,
+ 0.0039475 -0.006075 -0.0035,
+ 0.0039475 -0.006625 -0.0035,
+ 0.0039475 -0.006625 0,
+ 0.0039475 -0.0069 0.000275,
+ 0.0039475 -0.0069 0.0024225,
+ 0.003175 -0.0058 0.00256,
+ 0.00381 -0.0058 0.00256,
+ 0.0036725 -0.0058 0.000275,
+ 0.0036725 -0.0058 0.002285,
+ 0.003175 -0.0058 0.002285,
+ 0.00381 -0.0069 0.00256,
+ 0.0036725 -0.006075 0,
+ 0.003175 -0.0069 0.00256,
+ 0.003175 -0.0069 0.002285,
+ 0.0036725 -0.0069 0.002285,
+ 0.0036725 -0.0069 0.000275,
+ 0.0036725 -0.006075 -0.0035,
+ 0.0036725 -0.006625 0,
+ 0.0036725 -0.006625 -0.0035,
+ 0.00394541106604 -0.0058 0.00244637662443,
+ 0.00393920773536 -0.0058 0.00246952776971,
+ 0.00392907849302 -0.0058 0.00249125,
+ 0.00391533111093 -0.0058 0.00251088329633,
+ 0.00389838329633 -0.0058 0.00252783111093,
+ 0.00387875 -0.0058 0.00254157849302,
+ 0.00385702776971 -0.0058 0.00255170773536,
+ 0.00383387662443 -0.0058 0.00255791106604,
+ 0.00394541106604 -0.0069 0.00244637662443,
+ 0.00393920773536 -0.0069 0.00246952776971,
+ 0.00392907849302 -0.0069 0.00249125,
+ 0.00391533111093 -0.0069 0.00251088329633,
+ 0.00389838329633 -0.0069 0.00252783111093,
+ 0.00387875 -0.0069 0.00254157849302,
+ 0.00385702776971 -0.0069 0.00255170773536,
+ 0.00383387662443 -0.0069 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 1 0 4.4408921e-16,
+ 1 0 4.4408921e-16,
+ 0.98480773 0 0.17364818,
+ 0.93969262 0 0.34202015,
+ 0.86602539 0 0.5,
+ 0.76604444 0 0.64278764,
+ 0.64278764 0 0.76604444,
+ 0.5 0 0.86602539,
+ 0.34202015 0 0.93969262,
+ 0.17364818 0 0.98480773,
+ 0 0 1,
+ -1.030287e-13 0 1,
+ 0.17364818 0 0.98480773,
+ 0.34202015 0 0.93969262,
+ 0.5 0 0.86602539,
+ 0.64278764 0 0.76604444,
+ 0.76604444 0 0.64278764,
+ 0.86602539 0 0.5,
+ 0.93969262 0 0.34202015,
+ 0.98480773 0 0.17364818,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 7 22 -1
+ 31 22 23 -1
+ 32 23 24 -1
+ 33 24 25 -1
+ 34 25 26 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 37 29 13 -1
+ 36 28 37 -1
+ 35 27 36 -1
+ 34 26 35 -1
+ 33 25 34 -1
+ 32 24 33 -1
+ 31 23 32 -1
+ 30 22 31 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 9 15 13 -1
+ 8 15 9 -1
+ 16 15 12 -1
+ 8 12 15 -1
+ 17 12 11 -1
+ 17 16 12 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 23 25 -1
+ 41 25 26 -1
+ 40 26 27 -1
+ 39 27 28 -1
+ 38 28 29 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 35 32 34 -1
+ 36 31 35 -1
+ 37 30 36 -1
+ 38 29 37 -1
+ 39 28 38 -1
+ 40 27 39 -1
+ 41 26 40 -1
+ 42 25 41 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 82 84 -1
+ 85 84 82 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ DEF PinsArrayLR_17 Shape {
+ appearance DEF __74 Appearance {
+ material DEF __75 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __76 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ -0.0039475 -0.00944 0.0024225,
+ -0.0039475 -0.00944 0.000275,
+ -0.0039475 -0.009165 0,
+ -0.0039475 -0.009165 -0.0035,
+ -0.0039475 -0.008615 -0.0035,
+ -0.0039475 -0.008615 0,
+ -0.0039475 -0.00834 0.000275,
+ -0.0039475 -0.00834 0.0024225,
+ -0.003175 -0.00944 0.00256,
+ -0.00381 -0.00944 0.00256,
+ -0.0036725 -0.00944 0.000275,
+ -0.0036725 -0.00944 0.002285,
+ -0.003175 -0.00944 0.002285,
+ -0.00381 -0.00834 0.00256,
+ -0.0036725 -0.009165 0,
+ -0.003175 -0.00834 0.00256,
+ -0.003175 -0.00834 0.002285,
+ -0.0036725 -0.00834 0.002285,
+ -0.0036725 -0.00834 0.000275,
+ -0.0036725 -0.009165 -0.0035,
+ -0.0036725 -0.008615 0,
+ -0.0036725 -0.008615 -0.0035,
+ -0.00394541106604 -0.00944 0.00244637662443,
+ -0.00393920773536 -0.00944 0.00246952776971,
+ -0.00392907849302 -0.00944 0.00249125,
+ -0.00391533111093 -0.00944 0.00251088329633,
+ -0.00389838329633 -0.00944 0.00252783111093,
+ -0.00387875 -0.00944 0.00254157849302,
+ -0.00385702776971 -0.00944 0.00255170773536,
+ -0.00383387662443 -0.00944 0.00255791106604,
+ -0.00394541106604 -0.00834 0.00244637662443,
+ -0.00393920773536 -0.00834 0.00246952776971,
+ -0.00392907849302 -0.00834 0.00249125,
+ -0.00391533111093 -0.00834 0.00251088329633,
+ -0.00389838329633 -0.00834 0.00252783111093,
+ -0.00387875 -0.00834 0.00254157849302,
+ -0.00385702776971 -0.00834 0.00255170773536,
+ -0.00383387662443 -0.00834 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ -1 0 4.4408921e-16,
+ -1 0 4.4408921e-16,
+ -0.98480773 0 0.17364818,
+ -0.93969262 0 0.34202015,
+ -0.86602539 0 0.5,
+ -0.76604444 0 0.64278764,
+ -0.64278764 0 0.76604444,
+ -0.5 0 0.86602539,
+ -0.34202015 0 0.93969262,
+ -0.17364818 0 0.98480773,
+ 0 0 1,
+ 1.030287e-13 0 1,
+ -0.17364818 0 0.98480773,
+ -0.34202015 0 0.93969262,
+ -0.5 0 0.86602539,
+ -0.64278764 0 0.76604444,
+ -0.76604444 0 0.64278764,
+ -0.86602539 0 0.5,
+ -0.93969262 0 0.34202015,
+ -0.98480773 0 0.17364818,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 22 31 -1
+ 32 24 33 -1
+ 34 26 35 -1
+ 36 28 37 -1
+ 37 29 13 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 34 25 26 -1
+ 35 27 36 -1
+ 33 24 25 -1
+ 33 25 34 -1
+ 32 23 24 -1
+ 31 23 32 -1
+ 31 22 23 -1
+ 30 7 22 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 15 9 8 -1
+ 13 9 15 -1
+ 12 16 8 -1
+ 15 8 16 -1
+ 12 17 16 -1
+ 12 11 17 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 25 41 -1
+ 40 27 39 -1
+ 38 29 37 -1
+ 36 31 35 -1
+ 35 32 34 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 38 28 29 -1
+ 37 30 36 -1
+ 39 27 28 -1
+ 39 28 38 -1
+ 40 26 27 -1
+ 41 26 40 -1
+ 41 25 26 -1
+ 42 23 25 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 84 82 -1
+ 85 82 84 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ DEF PinsArrayLR_18 Shape {
+ appearance DEF __78 Appearance {
+ material DEF __79 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __80 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ 0.0039475 -0.00834 0.0024225,
+ 0.0039475 -0.00834 0.000275,
+ 0.0039475 -0.008615 0,
+ 0.0039475 -0.008615 -0.0035,
+ 0.0039475 -0.009165 -0.0035,
+ 0.0039475 -0.009165 0,
+ 0.0039475 -0.00944 0.000275,
+ 0.0039475 -0.00944 0.0024225,
+ 0.003175 -0.00834 0.00256,
+ 0.00381 -0.00834 0.00256,
+ 0.0036725 -0.00834 0.000275,
+ 0.0036725 -0.00834 0.002285,
+ 0.003175 -0.00834 0.002285,
+ 0.00381 -0.00944 0.00256,
+ 0.0036725 -0.008615 0,
+ 0.003175 -0.00944 0.00256,
+ 0.003175 -0.00944 0.002285,
+ 0.0036725 -0.00944 0.002285,
+ 0.0036725 -0.00944 0.000275,
+ 0.0036725 -0.008615 -0.0035,
+ 0.0036725 -0.009165 0,
+ 0.0036725 -0.009165 -0.0035,
+ 0.00394541106604 -0.00834 0.00244637662443,
+ 0.00393920773536 -0.00834 0.00246952776971,
+ 0.00392907849302 -0.00834 0.00249125,
+ 0.00391533111093 -0.00834 0.00251088329633,
+ 0.00389838329633 -0.00834 0.00252783111093,
+ 0.00387875 -0.00834 0.00254157849302,
+ 0.00385702776971 -0.00834 0.00255170773536,
+ 0.00383387662443 -0.00834 0.00255791106604,
+ 0.00394541106604 -0.00944 0.00244637662443,
+ 0.00393920773536 -0.00944 0.00246952776971,
+ 0.00392907849302 -0.00944 0.00249125,
+ 0.00391533111093 -0.00944 0.00251088329633,
+ 0.00389838329633 -0.00944 0.00252783111093,
+ 0.00387875 -0.00944 0.00254157849302,
+ 0.00385702776971 -0.00944 0.00255170773536,
+ 0.00383387662443 -0.00944 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 1 0 4.4408921e-16,
+ 1 0 4.4408921e-16,
+ 0.98480773 0 0.17364818,
+ 0.93969262 0 0.34202015,
+ 0.86602539 0 0.5,
+ 0.76604444 0 0.64278764,
+ 0.64278764 0 0.76604444,
+ 0.5 0 0.86602539,
+ 0.34202015 0 0.93969262,
+ 0.17364818 0 0.98480773,
+ 0 0 1,
+ -1.030287e-13 0 1,
+ 0.17364818 0 0.98480773,
+ 0.34202015 0 0.93969262,
+ 0.5 0 0.86602539,
+ 0.64278764 0 0.76604444,
+ 0.76604444 0 0.64278764,
+ 0.86602539 0 0.5,
+ 0.93969262 0 0.34202015,
+ 0.98480773 0 0.17364818,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 7 22 -1
+ 31 22 23 -1
+ 32 23 24 -1
+ 33 24 25 -1
+ 34 25 26 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 37 29 13 -1
+ 36 28 37 -1
+ 35 27 36 -1
+ 34 26 35 -1
+ 33 25 34 -1
+ 32 24 33 -1
+ 31 23 32 -1
+ 30 22 31 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 9 15 13 -1
+ 8 15 9 -1
+ 16 15 12 -1
+ 8 12 15 -1
+ 17 12 11 -1
+ 17 16 12 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 23 25 -1
+ 41 25 26 -1
+ 40 26 27 -1
+ 39 27 28 -1
+ 38 28 29 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 35 32 34 -1
+ 36 31 35 -1
+ 37 30 36 -1
+ 38 29 37 -1
+ 39 28 38 -1
+ 40 27 39 -1
+ 41 26 40 -1
+ 42 25 41 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 82 84 -1
+ 85 84 82 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ DEF PinsArrayLR_19 Shape {
+ appearance DEF __82 Appearance {
+ material DEF __83 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __84 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ -0.0039475 -0.01198 0.0024225,
+ -0.0039475 -0.01198 0.000275,
+ -0.0039475 -0.011705 0,
+ -0.0039475 -0.011705 -0.0035,
+ -0.0039475 -0.011155 -0.0035,
+ -0.0039475 -0.011155 0,
+ -0.0039475 -0.01088 0.000275,
+ -0.0039475 -0.01088 0.0024225,
+ -0.003175 -0.01198 0.00256,
+ -0.00381 -0.01198 0.00256,
+ -0.0036725 -0.01198 0.000275,
+ -0.0036725 -0.01198 0.002285,
+ -0.003175 -0.01198 0.002285,
+ -0.00381 -0.01088 0.00256,
+ -0.0036725 -0.011705 0,
+ -0.003175 -0.01088 0.00256,
+ -0.003175 -0.01088 0.002285,
+ -0.0036725 -0.01088 0.002285,
+ -0.0036725 -0.01088 0.000275,
+ -0.0036725 -0.011705 -0.0035,
+ -0.0036725 -0.011155 0,
+ -0.0036725 -0.011155 -0.0035,
+ -0.00394541106604 -0.01198 0.00244637662443,
+ -0.00393920773536 -0.01198 0.00246952776971,
+ -0.00392907849302 -0.01198 0.00249125,
+ -0.00391533111093 -0.01198 0.00251088329633,
+ -0.00389838329633 -0.01198 0.00252783111093,
+ -0.00387875 -0.01198 0.00254157849302,
+ -0.00385702776971 -0.01198 0.00255170773536,
+ -0.00383387662443 -0.01198 0.00255791106604,
+ -0.00394541106604 -0.01088 0.00244637662443,
+ -0.00393920773536 -0.01088 0.00246952776971,
+ -0.00392907849302 -0.01088 0.00249125,
+ -0.00391533111093 -0.01088 0.00251088329633,
+ -0.00389838329633 -0.01088 0.00252783111093,
+ -0.00387875 -0.01088 0.00254157849302,
+ -0.00385702776971 -0.01088 0.00255170773536,
+ -0.00383387662443 -0.01088 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ -1 -2.2694504e-30 -9.8088568e-33,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ 1.5872683e-29 -1 -1.0559192e-30,
+ -1 0 4.4408921e-16,
+ -1 0 4.4408921e-16,
+ -0.98480773 0 0.17364818,
+ -0.93969262 0 0.34202015,
+ -0.86602539 0 0.5,
+ -0.76604444 0 0.64278764,
+ -0.64278764 0 0.76604444,
+ -0.5 0 0.86602539,
+ -0.34202015 0 0.93969262,
+ -0.17364818 0 0.98480773,
+ 0 0 1,
+ 1.030287e-13 0 1,
+ -0.17364818 0 0.98480773,
+ -0.34202015 0 0.93969262,
+ -0.5 0 0.86602539,
+ -0.64278764 0 0.76604444,
+ -0.76604444 0 0.64278764,
+ -0.86602539 0 0.5,
+ -0.93969262 0 0.34202015,
+ -0.98480773 0 0.17364818,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ -0 -0.70710677 -0.70710677,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ 2.6168802e-29 1 -2.3122162e-30,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ -0 -1 -0,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1.6011956e-30 3.9256339e-30 1,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ 1 0 0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33,
+ 1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 22 31 -1
+ 32 24 33 -1
+ 34 26 35 -1
+ 36 28 37 -1
+ 37 29 13 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 34 25 26 -1
+ 35 27 36 -1
+ 33 24 25 -1
+ 33 25 34 -1
+ 32 23 24 -1
+ 31 23 32 -1
+ 31 22 23 -1
+ 30 7 22 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 15 9 8 -1
+ 13 9 15 -1
+ 12 16 8 -1
+ 15 8 16 -1
+ 12 17 16 -1
+ 12 11 17 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 25 41 -1
+ 40 27 39 -1
+ 38 29 37 -1
+ 36 31 35 -1
+ 35 32 34 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 38 28 29 -1
+ 37 30 36 -1
+ 39 27 28 -1
+ 39 28 38 -1
+ 40 26 27 -1
+ 41 26 40 -1
+ 41 25 26 -1
+ 42 23 25 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 84 82 -1
+ 85 82 84 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ DEF PinsArrayLR_20 Shape {
+ appearance DEF __86 Appearance {
+ material DEF __87 Material {
+ ambientIntensity 0.260947436094
+ diffuseColor 0.73400002718 0.773000001907 0.79699999094
+ shininess 0
+ }
+ }
+ geometry DEF __88 IndexedFaceSet {
+ solid FALSE
+ coord Coordinate {
+ point [
+ 0.0039475 -0.01088 0.0024225,
+ 0.0039475 -0.01088 0.000275,
+ 0.0039475 -0.011155 0,
+ 0.0039475 -0.011155 -0.0035,
+ 0.0039475 -0.011705 -0.0035,
+ 0.0039475 -0.011705 0,
+ 0.0039475 -0.01198 0.000275,
+ 0.0039475 -0.01198 0.0024225,
+ 0.003175 -0.01088 0.00256,
+ 0.00381 -0.01088 0.00256,
+ 0.0036725 -0.01088 0.000275,
+ 0.0036725 -0.01088 0.002285,
+ 0.003175 -0.01088 0.002285,
+ 0.00381 -0.01198 0.00256,
+ 0.0036725 -0.011155 0,
+ 0.003175 -0.01198 0.00256,
+ 0.003175 -0.01198 0.002285,
+ 0.0036725 -0.01198 0.002285,
+ 0.0036725 -0.01198 0.000275,
+ 0.0036725 -0.011155 -0.0035,
+ 0.0036725 -0.011705 0,
+ 0.0036725 -0.011705 -0.0035,
+ 0.00394541106604 -0.01088 0.00244637662443,
+ 0.00393920773536 -0.01088 0.00246952776971,
+ 0.00392907849302 -0.01088 0.00249125,
+ 0.00391533111093 -0.01088 0.00251088329633,
+ 0.00389838329633 -0.01088 0.00252783111093,
+ 0.00387875 -0.01088 0.00254157849302,
+ 0.00385702776971 -0.01088 0.00255170773536,
+ 0.00383387662443 -0.01088 0.00255791106604,
+ 0.00394541106604 -0.01198 0.00244637662443,
+ 0.00393920773536 -0.01198 0.00246952776971,
+ 0.00392907849302 -0.01198 0.00249125,
+ 0.00391533111093 -0.01198 0.00251088329633,
+ 0.00389838329633 -0.01198 0.00252783111093,
+ 0.00387875 -0.01198 0.00254157849302,
+ 0.00385702776971 -0.01198 0.00255170773536,
+ 0.00383387662443 -0.01198 0.00255791106604
+
+ ]
+ }
+ normal Normal {
+ vector [
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 1 -2.2694504e-30 -9.8088568e-33,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 3.1745365e-29 1 2.1118384e-30,
+ 1 0 4.4408921e-16,
+ 1 0 4.4408921e-16,
+ 0.98480773 0 0.17364818,
+ 0.93969262 0 0.34202015,
+ 0.86602539 0 0.5,
+ 0.76604444 0 0.64278764,
+ 0.64278764 0 0.76604444,
+ 0.5 0 0.86602539,
+ 0.34202015 0 0.93969262,
+ 0.17364818 0 0.98480773,
+ 0 0 1,
+ -1.030287e-13 0 1,
+ 0.17364818 0 0.98480773,
+ 0.34202015 0 0.93969262,
+ 0.5 0 0.86602539,
+ 0.64278764 0 0.76604444,
+ 0.76604444 0 0.64278764,
+ 0.86602539 0 0.5,
+ 0.93969262 0 0.34202015,
+ 0.98480773 0 0.17364818,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 0 0.70710677 -0.70710677,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 1.3084401e-29 -1 1.1561081e-30,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 1 0,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 -0.70710677 -0.70710677,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 0 -1,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ 0 -1 0,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1.6573124e-30 -1.3045552e-30 1,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -1 -0 -0,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -0 -0 -1,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33,
+ -1 2.2694504e-30 9.8088568e-33
+
+ ]
+ }
+ coordIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 11 8 9 -1
+ 28 9 29 -1
+ 27 9 28 -1
+ 26 9 27 -1
+ 25 9 26 -1
+ 24 9 25 -1
+ 23 9 24 -1
+ 22 9 23 -1
+ 0 9 22 -1
+ 11 12 8 -1
+ 11 0 1 -1
+ 11 9 0 -1
+ 11 1 10 -1
+ 22 7 0 -1
+ 30 7 22 -1
+ 31 22 23 -1
+ 32 23 24 -1
+ 33 24 25 -1
+ 34 25 26 -1
+ 35 26 27 -1
+ 36 27 28 -1
+ 37 28 29 -1
+ 13 29 9 -1
+ 37 29 13 -1
+ 36 28 37 -1
+ 35 27 36 -1
+ 34 26 35 -1
+ 33 25 34 -1
+ 32 24 33 -1
+ 31 23 32 -1
+ 30 22 31 -1
+ 2 10 1 -1
+ 14 10 2 -1
+ 17 18 6 -1
+ 31 7 30 -1
+ 32 7 31 -1
+ 33 7 32 -1
+ 34 7 33 -1
+ 35 7 34 -1
+ 36 7 35 -1
+ 37 7 36 -1
+ 13 7 37 -1
+ 17 7 13 -1
+ 17 13 15 -1
+ 17 6 7 -1
+ 17 15 16 -1
+ 3 14 2 -1
+ 19 14 3 -1
+ 6 20 5 -1
+ 18 20 6 -1
+ 4 19 3 -1
+ 21 19 4 -1
+ 5 21 4 -1
+ 20 21 5 -1
+ 9 15 13 -1
+ 8 15 9 -1
+ 16 15 12 -1
+ 8 12 15 -1
+ 17 12 11 -1
+ 17 16 12 -1
+ 11 18 17 -1
+ 10 18 11 -1
+ 20 14 21 -1
+ 14 18 10 -1
+ 21 14 19 -1
+ 20 18 14 -1
+ ]
+ normalIndex [
+ 6 1 0 -1
+ 4 2 5 -1
+ 4 3 2 -1
+ 5 2 1 -1
+ 6 5 1 -1
+ 7 6 0 -1
+ 21 8 9 -1
+ 11 9 10 -1
+ 12 9 11 -1
+ 13 9 12 -1
+ 14 9 13 -1
+ 15 9 14 -1
+ 16 9 15 -1
+ 17 9 16 -1
+ 18 9 17 -1
+ 21 22 8 -1
+ 21 18 19 -1
+ 21 9 18 -1
+ 21 19 20 -1
+ 25 23 24 -1
+ 42 23 25 -1
+ 41 25 26 -1
+ 40 26 27 -1
+ 39 27 28 -1
+ 38 28 29 -1
+ 37 29 30 -1
+ 36 30 31 -1
+ 35 31 32 -1
+ 34 32 33 -1
+ 35 32 34 -1
+ 36 31 35 -1
+ 37 30 36 -1
+ 38 29 37 -1
+ 39 28 38 -1
+ 40 27 39 -1
+ 41 26 40 -1
+ 42 25 41 -1
+ 45 43 44 -1
+ 46 43 45 -1
+ 60 61 47 -1
+ 50 48 49 -1
+ 51 48 50 -1
+ 52 48 51 -1
+ 53 48 52 -1
+ 54 48 53 -1
+ 55 48 54 -1
+ 56 48 55 -1
+ 57 48 56 -1
+ 60 48 57 -1
+ 60 57 58 -1
+ 60 47 48 -1
+ 60 58 59 -1
+ 64 62 63 -1
+ 65 62 64 -1
+ 68 66 67 -1
+ 69 66 68 -1
+ 72 70 71 -1
+ 73 70 72 -1
+ 76 74 75 -1
+ 77 74 76 -1
+ 80 78 79 -1
+ 81 78 80 -1
+ 83 82 84 -1
+ 85 84 82 -1
+ 88 86 89 -1
+ 88 87 86 -1
+ 92 90 91 -1
+ 93 90 92 -1
+ 97 94 96 -1
+ 94 90 93 -1
+ 96 94 95 -1
+ 97 90 94 -1
+ ]
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/circuit/SN74LS273NE4/Allegro/DIP762W55P254L2642H457Q20N.dra b/circuit/SN74LS273NE4/Allegro/DIP762W55P254L2642H457Q20N.dra
new file mode 100644
index 0000000..3b00184
Binary files /dev/null and b/circuit/SN74LS273NE4/Allegro/DIP762W55P254L2642H457Q20N.dra differ
diff --git a/circuit/SN74LS273NE4/Allegro/c115_h75.pad b/circuit/SN74LS273NE4/Allegro/c115_h75.pad
new file mode 100644
index 0000000..6229bf7
Binary files /dev/null and b/circuit/SN74LS273NE4/Allegro/c115_h75.pad differ
diff --git a/circuit/SN74LS273NE4/Allegro/dip762w55p254l2642h457q20n.psm b/circuit/SN74LS273NE4/Allegro/dip762w55p254l2642h457q20n.psm
new file mode 100644
index 0000000..ec7402e
Binary files /dev/null and b/circuit/SN74LS273NE4/Allegro/dip762w55p254l2642h457q20n.psm differ
diff --git a/circuit/SN74LS273NE4/Allegro/s115_h75.pad b/circuit/SN74LS273NE4/Allegro/s115_h75.pad
new file mode 100644
index 0000000..195aca1
Binary files /dev/null and b/circuit/SN74LS273NE4/Allegro/s115_h75.pad differ
diff --git a/circuit/SN74LS273NE4/Altium/Readme.html b/circuit/SN74LS273NE4/Altium/Readme.html
new file mode 100644
index 0000000..a650308
--- /dev/null
+++ b/circuit/SN74LS273NE4/Altium/Readme.html
@@ -0,0 +1,9 @@
+
+
+
+ Altium Library Loader
+
+
+ To convert the SamacSys ECAD Model file (.epw) to Altium Designer format please install the Altium Library Loader
+
+
diff --git a/circuit/SN74LS273NE4/Altium/SN74LS273NE4.epw b/circuit/SN74LS273NE4/Altium/SN74LS273NE4.epw
new file mode 100644
index 0000000..b449109
--- /dev/null
+++ b/circuit/SN74LS273NE4/Altium/SN74LS273NE4.epw
@@ -0,0 +1,6 @@
+796887
+Message from SamacSys:
+To use this model save to your preferred location and then open within the ECAD Part Wizard tool.
+If you do not yet have a copy of the ECAD Part Wizard tool then please refer to the Instructions provided with this model.
+Source=mouser
+796887/230744/2.46/20/3/Integrated Circuit
\ No newline at end of file
diff --git a/circuit/SN74LS273NE4/CADSTAR/DIP762W55P254L2642H457Q20N.cpa b/circuit/SN74LS273NE4/CADSTAR/DIP762W55P254L2642H457Q20N.cpa
new file mode 100644
index 0000000..ade772e
--- /dev/null
+++ b/circuit/SN74LS273NE4/CADSTAR/DIP762W55P254L2642H457Q20N.cpa
@@ -0,0 +1,255 @@
+(CADSTARPCB
+ (HEADER
+ (FORMAT LIBRARY 2 18)
+ (JOBFILE "")
+ (JOBTITLE "")
+ (GENERATOR "")
+ (RESOLUTION
+ (METRIC HUNDREDTH MICRON)
+ )
+ (TIMESTAMP 2020 04 22 17 25 09)
+ )
+ (ASSIGNMENTS
+ (LAYERDEFS
+ (LAYERSTACK LAY7 LAY9 LAY12 LAY14 LAY18 LAY10 LAY16 LAY6 LAY8 LAY17
+ LAY11 LAY19 LAY15 LAY13
+ )
+ (LAYER LAY0 "(All Layers)"
+ (ALLLAYER)
+ )
+ (LAYER LAY1 "(All Electrical Layers)"
+ (ALLELEC)
+ )
+ (LAYER LAY2 "(All Documentation Layers)"
+ (ALLDOC)
+ )
+ (LAYER LAY3 "(Undefined)"
+ (NOLAYER)
+ )
+ (LAYER LAY4 "(Component Copper)"
+ (ASSCOMPCOPP)
+ )
+ (LAYER LAY5 "(Jumper)"
+ (JUMPERLAYER)
+ )
+ (LAYER LAY6 "Top Elec"
+ (ELEC 1
+ (BIAS UNBIASED)
+ (LAYERHEIGHT 0)
+ )
+ )
+ (LAYER LAY7 "Construction"
+ (DOC)
+ )
+ (LAYER LAY8 "Bottom Elec"
+ (ELEC 2
+ (BIAS UNBIASED)
+ (LAYERHEIGHT 0)
+ )
+ )
+ (LAYER LAY9 "Drill Drawing"
+ (DOC)
+ )
+ (LAYER LAY10 "Top silk"
+ (NONELEC 1)
+ (LASUBTYP LAYERSUBTYPE_SILKSCREEN)
+ )
+ (LAYER LAY11 "Bottom silk"
+ (NONELEC 2)
+ (LASUBTYP LAYERSUBTYPE_SILKSCREEN)
+ )
+ (LAYER LAY12 "Top Placement"
+ (NONELEC 1)
+ (LASUBTYP LAYERSUBTYPE_PLACEMENT)
+ )
+ (LAYER LAY13 "Bottom Placement"
+ (NONELEC 2)
+ (LASUBTYP LAYERSUBTYPE_PLACEMENT)
+ )
+ (LAYER LAY14 "Top Assembly"
+ (NONELEC 1)
+ (LASUBTYP LAYERSUBTYPE_ASSEMBLY)
+ )
+ (LAYER LAY15 "Bottom Assembly"
+ (NONELEC 2)
+ (LASUBTYP LAYERSUBTYPE_ASSEMBLY)
+ )
+ (LAYER LAY16 "Top Solder Resist"
+ (NONELEC 1)
+ (LASUBTYP LAYERSUBTYPE_SOLDERRESIST)
+ )
+ (LAYER LAY17 "Bottom Solder Resist"
+ (NONELEC 2)
+ (LASUBTYP LAYERSUBTYPE_SOLDERRESIST)
+ )
+ (LAYER LAY18 "Top Paste"
+ (NONELEC 1)
+ (LASUBTYP LAYERSUBTYPE_PASTE)
+ )
+ (LAYER LAY19 "Bottom Paste"
+ (NONELEC 2)
+ (LASUBTYP LAYERSUBTYPE_PASTE)
+ )
+ )
+ (CODEDEFS
+ (LINECODE LC11 "Silkscreen Outline 1" 2540
+ (STYLE SOLID)
+ )
+ (LINECODE LC14 "Assembly Outline 1" 2540
+ (STYLE SOLID)
+ )
+ (LINECODE LC15 "Placement Outline 1" 2540
+ (STYLE SOLID)
+ )
+ (TEXTCODE TC10 "Component Name" 3000 60000 40000)
+ (SPACINGCODE P_P 100000)
+ (SPACINGCODE P_C 100000)
+ (SPACINGCODE C_C 100000)
+ (SPACINGCODE H_H 100000)
+ (PADCODE PC0 "c115_h75"
+ (ROUND 115000)
+ (DRILL 75000)
+ )
+ (PADCODE PC1 "s115_h75"
+ (SQUARE 115000)
+ (DRILL 75000)
+ )
+ (ATTRNAME AT0 "Component Category"
+ (ATTROWNER COMPONENT)
+ )
+ (ATTRNAME AT1 "assembly_name"
+ (ATTROWNER COMPONENT)
+ )
+ (ATTRNAME AT2 "Value"
+ (ATTROWNER COMPONENT)
+ )
+ (ATTRNAME AT3 "thm_power_diss"
+ (ATTROWNER COMPONENT)
+ )
+ (ATTRNAME AT4 "placement"
+ (ATTROWNER COMPONENT)
+ )
+ (ATTRNAME AT5 "silkscrn_name"
+ (ATTROWNER COMPONENT)
+ )
+ (ATTRNAME AT6 "Manufacturers Part Number"
+ (ATTROWNER COMPONENT)
+ )
+ (ATTRNAME AT7 "Height"
+ (ATTROWNER SYMDEF)
+ )
+ (ATTRNAME AT8 "Drawing_Name"
+ (ATTROWNER DOCSYMBOL)
+ )
+ (ATTRNAME AT9 "Client"
+ (ATTROWNER DOCSYMBOL)
+ )
+ (ATTRNAME AT10 "RefDes"
+ (ATTROWNER COMPONENT)
+ )
+ )
+ (TECHNOLOGY
+ (UNITS MM)
+ (UNITSPRECISION 2)
+ (INTERLINEGAP 20)
+ (BARLINEGAP 20)
+ (ALLOWBARTEXT)
+ (ANGULARPRECISION 1)
+ (MAXPHYSLAYER 2)
+ (DESIGNORIGIN (PT 0 0))
+ (DESIGNAREA (PT 0 0) (PT 100000000 100000000))
+ (PINNOOFFSET 50800)
+ (PINNOANGLE 0)
+ (DESIGNLIMIT (PT 100000000 100000000))
+ )
+ )
+ (LIBRARY
+ (HIERARCHY
+ (ROOTFOLDER F0 "root"
+ (SYMDEFLIST L0)
+ )
+ )
+ (SYMDEF L0 "DIP762W55P254L2642H457Q20N" "" (PT 50000000 50000000)
+ (VERSION 1)
+ (FIGURE FIG0 LC15 LAY12
+ (OUTLINE (PT 49536500 51383500) (PT 50463500 51383500) (PT 50463500 48616500) (PT 49536500 48616500) (PT 49536500 51383500))
+ )
+ (FIGURE FIG1 LC14 LAY14
+ (OUTLINE (PT 49670000 51358500) (PT 50330000 51358500) (PT 50330000 48641500) (PT 49670000 48641500) (PT 49670000 51358500))
+ )
+ (FIGURE FIG2 LC14 LAY14
+ (OPENSHAPE (PT 49670000 51231500) (PT 49797000 51358500))
+ )
+ (FIGURE FIG3 LC11 LAY10
+ (OPENSHAPE (PT 49561500 51358500) (PT 50330000 51358500))
+ )
+ (FIGURE FIG4 LC11 LAY10
+ (OPENSHAPE (PT 49670000 48641500) (PT 50330000 48641500))
+ )
+ (PAD 1 (PT 49619000 51143000) PC1 THRU
+ (FIRSTPAD)
+ (PADIDENTIFIER "1")
+ )
+ (PAD 2 (PT 49619000 50889000) PC0 THRU
+ (PADIDENTIFIER "2")
+ )
+ (PAD 3 (PT 49619000 50635000) PC0 THRU
+ (PADIDENTIFIER "3")
+ )
+ (PAD 4 (PT 49619000 50381000) PC0 THRU
+ (PADIDENTIFIER "4")
+ )
+ (PAD 5 (PT 49619000 50127000) PC0 THRU
+ (PADIDENTIFIER "5")
+ )
+ (PAD 6 (PT 49619000 49873000) PC0 THRU
+ (PADIDENTIFIER "6")
+ )
+ (PAD 7 (PT 49619000 49619000) PC0 THRU
+ (PADIDENTIFIER "7")
+ )
+ (PAD 8 (PT 49619000 49365000) PC0 THRU
+ (PADIDENTIFIER "8")
+ )
+ (PAD 9 (PT 49619000 49111000) PC0 THRU
+ (PADIDENTIFIER "9")
+ )
+ (PAD 10 (PT 49619000 48857000) PC0 THRU
+ (PADIDENTIFIER "10")
+ )
+ (PAD 11 (PT 50381000 48857000) PC0 THRU
+ (PADIDENTIFIER "11")
+ )
+ (PAD 12 (PT 50381000 49111000) PC0 THRU
+ (PADIDENTIFIER "12")
+ )
+ (PAD 13 (PT 50381000 49365000) PC0 THRU
+ (PADIDENTIFIER "13")
+ )
+ (PAD 14 (PT 50381000 49619000) PC0 THRU
+ (PADIDENTIFIER "14")
+ )
+ (PAD 15 (PT 50381000 49873000) PC0 THRU
+ (PADIDENTIFIER "15")
+ )
+ (PAD 16 (PT 50381000 50127000) PC0 THRU
+ (PADIDENTIFIER "16")
+ )
+ (PAD 17 (PT 50381000 50381000) PC0 THRU
+ (PADIDENTIFIER "17")
+ )
+ (PAD 18 (PT 50381000 50635000) PC0 THRU
+ (PADIDENTIFIER "18")
+ )
+ (PAD 19 (PT 50381000 50889000) PC0 THRU
+ (PADIDENTIFIER "19")
+ )
+ (PAD 20 (PT 50381000 51143000) PC0 THRU
+ (PADIDENTIFIER "20")
+ )
+ (TEXTLOC COMP_NAME TC10 LAY10 (PT 50000000 50000000)
+ (ALIGN CENTERCENTER)
+ )
+ )
+ )
+)
diff --git a/circuit/SN74LS273NE4/CADSTAR/SN74LS273NE4.csa b/circuit/SN74LS273NE4/CADSTAR/SN74LS273NE4.csa
new file mode 100644
index 0000000..e2c32b0
--- /dev/null
+++ b/circuit/SN74LS273NE4/CADSTAR/SN74LS273NE4.csa
@@ -0,0 +1,290 @@
+(CADSTARSCM
+ (HEADER
+ (FORMAT SYMBOL 2 16)
+ (JOBFILE "")
+ (JOBTITLE "SamacSys ECAD Model")
+ (GENERATOR "796887/230744/2.46/20/3/Integrated Circuit")
+ (RESOLUTION(METRIC HUNDREDTH MICRON))
+ (TIMESTAMP 2020 04 22 17 25 09)
+ )
+ (ASSIGNMENTS
+ (CODEDEFS
+ (LINECODE LC1 "Line 10" 25400
+ (STYLE SOLID)
+ )
+ (TEXTCODE TC0 "(Pin Name/Number)" 15240 152400 152400)
+ (TEXTCODE TC5 "Text Size 60/43/6" 15240 152400 109220)
+ (TEXTCODE TC8 "Symbol Name" 10000 200000 0
+ (FONT "Arial" 400 0)
+ )
+ (TERMINALCODE TC0 "Terminal"
+ (CROSS 127000 0)
+ )
+ (ATTRNAME AT0 "pcb_zone"
+ (ATTROWNER ALL_ITEMS)
+ )
+ (ATTRNAME AT1 "tolerance"
+ (ATTROWNER ALL_ITEMS)
+ )
+ (ATTRNAME AT2 "voltage"
+ (ATTROWNER ALL_ITEMS)
+ )
+ (ATTRNAME AT3 "wattage"
+ (ATTROWNER ALL_ITEMS)
+ )
+ (ATTRNAME AT4 "Value"
+ (ATTROWNER ALL_ITEMS)
+ )
+ (ATTRNAME AT5 "sim_model"
+ (ATTROWNER ALL_ITEMS)
+ )
+ (ATTRNAME AT6 "Description"
+ (ATTROWNER SYMBOL)
+ )
+ )
+ (GRIDS
+ (WORKINGGRID
+ (STEPGRID "" 50800 50800)
+ )
+ (SCREENGRID
+ (STEPGRID "(Screen Grid)" 254000 254000)
+ )
+ )
+ (SETTINGS
+ (UNITS THOU)
+ (UNITSPRECISION 1)
+ (INTERLINEGAP 0)
+ (BARLINEGAP 0)
+ (ALLOWBARTEXT)
+ (DESIGNORIGIN (PT 0 0))
+ (DESIGNAREA (PT 0 0) (PT 100000000 100000000))
+ (DESIGNLIMIT (PT 100000000 100000000))
+ (ANGULARPRECISION 1)
+ )
+ )
+ (DEFAULTS
+ (DFLTSHAPETYPE OUTLINE)
+ (OUTLDFLTS LC1
+ (CLEAR)
+ )
+ (TEXTDFLTS TC5)
+ (ORIGINDFLTS TC8)
+ (ATTRDFLTS TC8)
+ (PINNOOFFSET 50800)
+ (PINNOANGLE 0)
+ )
+ (LIBRARY
+ (SYMDEF L0 "SN74LS273NE4" "" (PT 4572000 7620000)
+ (VERSION 1)
+ (FIGURE FIG0 LC1 NO_SHEET
+ (OPENSHAPE (PT 5080000 7874000) (PT 6858000 7874000) (PT 6858000 5080000) (PT 5080000 5080000) (PT 5080000 7874000))
+ )
+ (FIGURE FIG1 LC1 NO_SHEET
+ (OPENSHAPE (PT 4572000 7620000) (PT 5080000 7620000))
+ )
+ (FIGURE FIG2 LC1 NO_SHEET
+ (OPENSHAPE (PT 4572000 7366000) (PT 5080000 7366000))
+ )
+ (FIGURE FIG3 LC1 NO_SHEET
+ (OPENSHAPE (PT 4572000 7112000) (PT 5080000 7112000))
+ )
+ (FIGURE FIG4 LC1 NO_SHEET
+ (OPENSHAPE (PT 4572000 6858000) (PT 5080000 6858000))
+ )
+ (FIGURE FIG5 LC1 NO_SHEET
+ (OPENSHAPE (PT 4572000 6604000) (PT 5080000 6604000))
+ )
+ (FIGURE FIG6 LC1 NO_SHEET
+ (OPENSHAPE (PT 4572000 6350000) (PT 5080000 6350000))
+ )
+ (FIGURE FIG7 LC1 NO_SHEET
+ (OPENSHAPE (PT 4572000 6096000) (PT 5080000 6096000))
+ )
+ (FIGURE FIG8 LC1 NO_SHEET
+ (OPENSHAPE (PT 4572000 5842000) (PT 5080000 5842000))
+ )
+ (FIGURE FIG9 LC1 NO_SHEET
+ (OPENSHAPE (PT 4572000 5588000) (PT 5080000 5588000))
+ )
+ (FIGURE FIG10 LC1 NO_SHEET
+ (OPENSHAPE (PT 4572000 5334000) (PT 5080000 5334000))
+ )
+ (FIGURE FIG11 LC1 NO_SHEET
+ (OPENSHAPE (PT 7366000 7620000) (PT 6858000 7620000))
+ )
+ (FIGURE FIG12 LC1 NO_SHEET
+ (OPENSHAPE (PT 7366000 7366000) (PT 6858000 7366000))
+ )
+ (FIGURE FIG13 LC1 NO_SHEET
+ (OPENSHAPE (PT 7366000 7112000) (PT 6858000 7112000))
+ )
+ (FIGURE FIG14 LC1 NO_SHEET
+ (OPENSHAPE (PT 7366000 6858000) (PT 6858000 6858000))
+ )
+ (FIGURE FIG15 LC1 NO_SHEET
+ (OPENSHAPE (PT 7366000 6604000) (PT 6858000 6604000))
+ )
+ (FIGURE FIG16 LC1 NO_SHEET
+ (OPENSHAPE (PT 7366000 6350000) (PT 6858000 6350000))
+ )
+ (FIGURE FIG17 LC1 NO_SHEET
+ (OPENSHAPE (PT 7366000 6096000) (PT 6858000 6096000))
+ )
+ (FIGURE FIG18 LC1 NO_SHEET
+ (OPENSHAPE (PT 7366000 5842000) (PT 6858000 5842000))
+ )
+ (FIGURE FIG19 LC1 NO_SHEET
+ (OPENSHAPE (PT 7366000 5588000) (PT 6858000 5588000))
+ )
+ (FIGURE FIG20 LC1 NO_SHEET
+ (OPENSHAPE (PT 7366000 5334000) (PT 6858000 5334000))
+ )
+ (TERMINAL 1 TC0 (PT 4572000 7620000))
+ (TERMINAL 2 TC0 (PT 4572000 7366000))
+ (TERMINAL 3 TC0 (PT 4572000 7112000))
+ (TERMINAL 4 TC0 (PT 4572000 6858000))
+ (TERMINAL 5 TC0 (PT 4572000 6604000))
+ (TERMINAL 6 TC0 (PT 4572000 6350000))
+ (TERMINAL 7 TC0 (PT 4572000 6096000))
+ (TERMINAL 8 TC0 (PT 4572000 5842000))
+ (TERMINAL 9 TC0 (PT 4572000 5588000))
+ (TERMINAL 10 TC0 (PT 4572000 5334000))
+ (TERMINAL 11 TC0 (PT 7366000 7620000))
+ (TERMINAL 12 TC0 (PT 7366000 7366000))
+ (TERMINAL 13 TC0 (PT 7366000 7112000))
+ (TERMINAL 14 TC0 (PT 7366000 6858000))
+ (TERMINAL 15 TC0 (PT 7366000 6604000))
+ (TERMINAL 16 TC0 (PT 7366000 6350000))
+ (TERMINAL 17 TC0 (PT 7366000 6096000))
+ (TERMINAL 18 TC0 (PT 7366000 5842000))
+ (TERMINAL 19 TC0 (PT 7366000 5588000))
+ (TERMINAL 20 TC0 (PT 7366000 5334000))
+ (TEXTLOC SYMBOL_NAME TC8 (PT 6985000 8382000)
+ (ALIGN CENTERLEFT)
+ )
+ (TEXTLOC PART_NAME TC8 (PT 6985000 8128000)
+ (ALIGN CENTERLEFT)
+ )
+ (PINNUMNAMELOC 1 TC8 (PT 4927600 7620000)
+ (ALIGN BOTTOMRIGHT)
+ )
+ (PINNUMNAMELOC 2 TC8 (PT 4927600 7366000)
+ (ALIGN BOTTOMRIGHT)
+ )
+ (PINNUMNAMELOC 3 TC8 (PT 4927600 7112000)
+ (ALIGN BOTTOMRIGHT)
+ )
+ (PINNUMNAMELOC 4 TC8 (PT 4927600 6858000)
+ (ALIGN BOTTOMRIGHT)
+ )
+ (PINNUMNAMELOC 5 TC8 (PT 4927600 6604000)
+ (ALIGN BOTTOMRIGHT)
+ )
+ (PINNUMNAMELOC 6 TC8 (PT 4927600 6350000)
+ (ALIGN BOTTOMRIGHT)
+ )
+ (PINNUMNAMELOC 7 TC8 (PT 4927600 6096000)
+ (ALIGN BOTTOMRIGHT)
+ )
+ (PINNUMNAMELOC 8 TC8 (PT 4927600 5842000)
+ (ALIGN BOTTOMRIGHT)
+ )
+ (PINNUMNAMELOC 9 TC8 (PT 4927600 5588000)
+ (ALIGN BOTTOMRIGHT)
+ )
+ (PINNUMNAMELOC 10 TC8 (PT 4927600 5334000)
+ (ALIGN BOTTOMRIGHT)
+ )
+ (PINNUMNAMELOC 11 TC8 (PT 7010400 7620000)
+ (ALIGN BOTTOMLEFT)
+ )
+ (PINNUMNAMELOC 12 TC8 (PT 7010400 7366000)
+ (ALIGN BOTTOMLEFT)
+ )
+ (PINNUMNAMELOC 13 TC8 (PT 7010400 7112000)
+ (ALIGN BOTTOMLEFT)
+ )
+ (PINNUMNAMELOC 14 TC8 (PT 7010400 6858000)
+ (ALIGN BOTTOMLEFT)
+ )
+ (PINNUMNAMELOC 15 TC8 (PT 7010400 6604000)
+ (ALIGN BOTTOMLEFT)
+ )
+ (PINNUMNAMELOC 16 TC8 (PT 7010400 6350000)
+ (ALIGN BOTTOMLEFT)
+ )
+ (PINNUMNAMELOC 17 TC8 (PT 7010400 6096000)
+ (ALIGN BOTTOMLEFT)
+ )
+ (PINNUMNAMELOC 18 TC8 (PT 7010400 5842000)
+ (ALIGN BOTTOMLEFT)
+ )
+ (PINNUMNAMELOC 19 TC8 (PT 7010400 5588000)
+ (ALIGN BOTTOMLEFT)
+ )
+ (PINNUMNAMELOC 20 TC8 (PT 7010400 5334000)
+ (ALIGN BOTTOMLEFT)
+ )
+ (PINLABELLOC 1 TC8 (PT 5156200 7620000)
+ (ALIGN CENTERLEFT)
+ )
+ (PINLABELLOC 2 TC8 (PT 5156200 7366000)
+ (ALIGN CENTERLEFT)
+ )
+ (PINLABELLOC 3 TC8 (PT 5156200 7112000)
+ (ALIGN CENTERLEFT)
+ )
+ (PINLABELLOC 4 TC8 (PT 5156200 6858000)
+ (ALIGN CENTERLEFT)
+ )
+ (PINLABELLOC 5 TC8 (PT 5156200 6604000)
+ (ALIGN CENTERLEFT)
+ )
+ (PINLABELLOC 6 TC8 (PT 5156200 6350000)
+ (ALIGN CENTERLEFT)
+ )
+ (PINLABELLOC 7 TC8 (PT 5156200 6096000)
+ (ALIGN CENTERLEFT)
+ )
+ (PINLABELLOC 8 TC8 (PT 5156200 5842000)
+ (ALIGN CENTERLEFT)
+ )
+ (PINLABELLOC 9 TC8 (PT 5156200 5588000)
+ (ALIGN CENTERLEFT)
+ )
+ (PINLABELLOC 10 TC8 (PT 5156200 5334000)
+ (ALIGN CENTERLEFT)
+ )
+ (PINLABELLOC 11 TC8 (PT 6781800 7620000)
+ (ALIGN CENTERRIGHT)
+ )
+ (PINLABELLOC 12 TC8 (PT 6781800 7366000)
+ (ALIGN CENTERRIGHT)
+ )
+ (PINLABELLOC 13 TC8 (PT 6781800 7112000)
+ (ALIGN CENTERRIGHT)
+ )
+ (PINLABELLOC 14 TC8 (PT 6781800 6858000)
+ (ALIGN CENTERRIGHT)
+ )
+ (PINLABELLOC 15 TC8 (PT 6781800 6604000)
+ (ALIGN CENTERRIGHT)
+ )
+ (PINLABELLOC 16 TC8 (PT 6781800 6350000)
+ (ALIGN CENTERRIGHT)
+ )
+ (PINLABELLOC 17 TC8 (PT 6781800 6096000)
+ (ALIGN CENTERRIGHT)
+ )
+ (PINLABELLOC 18 TC8 (PT 6781800 5842000)
+ (ALIGN CENTERRIGHT)
+ )
+ (PINLABELLOC 19 TC8 (PT 6781800 5588000)
+ (ALIGN CENTERRIGHT)
+ )
+ (PINLABELLOC 20 TC8 (PT 6781800 5334000)
+ (ALIGN CENTERRIGHT)
+ )
+ )
+ )
+)
diff --git a/circuit/SN74LS273NE4/CADSTAR/SN74LS273NE4.lib b/circuit/SN74LS273NE4/CADSTAR/SN74LS273NE4.lib
new file mode 100644
index 0000000..9a59bef
--- /dev/null
+++ b/circuit/SN74LS273NE4/CADSTAR/SN74LS273NE4.lib
@@ -0,0 +1,16 @@
+.SN74LS273NE4 :1 ;Flip Flops Octal D-Type Flip-Flop w/Clear
+DIP762W55P254L2642H457Q20N
+*STM IC
+*NGS
+*PLB 1="'CLR'" 2="1Q" 3="1D" 4="2D" 5="2Q" 6="3Q" 7="3D" 8="4D" 9="4Q" 10="GND" 11="CLK" 12="5Q" 13="5D" 14="6D" 15="6Q" 16="7Q" 17="7D" 18="8D" 19="8Q" 20="VCC"
+*MXP 20
+*DFN SN74LS273NE4
+~!Mouser2 Part Number (595-SN74LS273NE4)
+~!Link Mouser2 Price/Stock (https://www.mouser.com/Search/Refine.aspx?Keyword=595-SN74LS273NE4)
+~!Manufacturer_Name (Texas Instruments)
+~!Manufacturer_Part_Number (SN74LS273NE4)
+~!Link Datasheet (http://www.ti.com/lit/ds/sdls090/sdls090.pdf)
+~!Height (4.57mm)
+~!3D_Model (SN74LS273NE4)
+SN74LS273NE4
+1.1!I 2.1!Y 3.1!I 4.1!I 5.1!Y 6.1!Y 7.1!I 8.1!I 9.1!Y 10.1!G 20.1!P 19.1!Y 18.1!I 17.1!I 16.1!Y 15.1!Y 14.1!I 13.1!I 12.1!Y 11.1!I
diff --git a/circuit/SN74LS273NE4/CR-5000/DIP762W55P254L2642H457Q20N.ftf b/circuit/SN74LS273NE4/CR-5000/DIP762W55P254L2642H457Q20N.ftf
new file mode 100644
index 0000000..c111adb
--- /dev/null
+++ b/circuit/SN74LS273NE4/CR-5000/DIP762W55P254L2642H457Q20N.ftf
@@ -0,0 +1,523 @@
+(ftf
+ (header
+ (version 2.0)
+ (unit DBUNIT)
+ )
+ (TechnologyContainer
+ (technology SamacSys_Footprint
+ (footprintLayer
+ (layer Top (type Conductive))
+ (layer Inner (type Conductive))
+ (layer Bottom (type Conductive))
+ (layer Silk-Top (type Symbolmark))
+ (layer Silk-Bottom (type Symbolmark))
+ (layer Resist-Top (type Solderresist))
+ (layer Resist-Bottom (type Solderresist))
+ (layer MetalMask-Top (type Metalmask))
+ (layer MetalMask-Bottom (type Metalmask))
+ (layer CompArea-Top (type Comparea))
+ (layer CompArea-Bottom (type Comparea))
+ (layer Assembly-Top (type Undefined))
+ (layer Assembly-Bottom (type Undefined))
+ (layer Hole (type Hole))
+ )
+ )
+ )
+ (footprintContainer
+ (commonParameters
+ (dimensionParameters
+ (arrowLength 100000)
+ (arrowAngle 15.000000)
+ (dotDiameter 100000)
+ (textFrameOffset 100000)
+ (arrowOffset 100000)
+ (dimAssistOffset 100000)
+ (dimLineWidth 10000)
+ (drawTextFrame NO)
+ (textFrameRange ALL)
+ (textClip NO)
+ (standard JIS)
+ )
+ )
+ (padstackGroups
+ (padstackGroup default)
+ )
+ (pads
+ (pad c115
+ (photo FLASH)
+ (panelUse NO)
+ (geometry
+ (circle 57500
+ (pt 0 0)
+ )
+ )
+ )
+ (pad r115_115
+ (photo FLASH)
+ (panelUse NO)
+ (geometry
+ (rectangle
+ (pt 0 0)
+ (width 115000)
+ (height 115000)
+ (rAngle 0.000000)
+ (outlineWidth 0)
+ (fillWidth 0)
+ (fillAngle 0.000000)
+ )
+ )
+ )
+ ); End of pads
+ (padstacks
+ (padstack c115h75
+ (type PLATED)
+ (throughMode THROUGH)
+ (panelUse NO)
+ (Hole (footLayer Hole)
+ (geometry
+ (circle 37500
+ (pt 0 0)
+ )
+ )
+ )
+ (padSet (footLayer Top)
+ (connect (pad c115))
+ (noconnect (pad c115))
+ )
+ (padSet (footLayer Resist-Top)
+ (connect (pad c115))
+ (noconnect (pad c115))
+ )
+ (padSet (footLayer Resist-Bottom)
+ (connect (pad c115))
+ (noconnect (pad c115))
+ )
+ (padSet (footLayer Inner)
+ (clearance (pad c115))
+ (connect (pad c115))
+ (noconnect (pad c115))
+ )
+ (padSet (footLayer Bottom)
+ (connect (pad c115))
+ (noconnect (pad c115))
+ )
+ )
+ (padstack r115_115h75
+ (type PLATED)
+ (throughMode THROUGH)
+ (panelUse NO)
+ (Hole (footLayer Hole)
+ (geometry
+ (circle 37500
+ (pt 0 0)
+ )
+ )
+ )
+ (padSet (footLayer Top)
+ (connect (pad r115_115))
+ (noconnect (pad r115_115))
+ )
+ (padSet (footLayer Resist-Top)
+ (connect (pad r115_115))
+ (noconnect (pad r115_115))
+ )
+ (padSet (footLayer Resist-Bottom)
+ (connect (pad r115_115))
+ (noconnect (pad r115_115))
+ )
+ (padSet (footLayer Inner)
+ (clearance (pad c115))
+ (connect (pad c115))
+ (noconnect (pad c115))
+ )
+ (padSet (footLayer Bottom)
+ (connect (pad r115_115))
+ (noconnect (pad r115_115))
+ )
+ )
+ ); End of padstacks
+ (footprints
+ (footprint "DIP762W55P254L2642H457Q20N"
+ (polarity YES)
+ (panelUse NO)
+ (heelprint
+ (layout
+ (layer (footLayer CompArea-Top)
+ (area
+ (geometry
+ (surface
+ (outlineWidth 0)
+ (fillWidth 0)
+ (fillAngle 0.000000)
+ (vertex
+ (pt 463500 1383500)
+ (pt 463500 -1383500)
+ (pt -463500 -1383500)
+ (pt -463500 1383500)
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Assembly-Top)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt -330000 1358500
+ (width 10000)
+ )
+ (pt 330000 1358500
+ (width 10000)
+ )
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Assembly-Top)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt 330000 1358500
+ (width 10000)
+ )
+ (pt 330000 -1358500
+ (width 10000)
+ )
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Assembly-Top)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt 330000 -1358500
+ (width 10000)
+ )
+ (pt -330000 -1358500
+ (width 10000)
+ )
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Assembly-Top)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt -330000 -1358500
+ (width 10000)
+ )
+ (pt -330000 1358500
+ (width 10000)
+ )
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Assembly-Top)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt -330000 1231500
+ (width 10000)
+ )
+ (pt -203000 1358500
+ (width 10000)
+ )
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Silk-Top)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt -438500 1358500
+ (width 20000)
+ )
+ (pt 330000 1358500
+ (width 20000)
+ )
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Silk-Top)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt -330000 -1358500
+ (width 20000)
+ )
+ (pt 330000 -1358500
+ (width 20000)
+ )
+ )
+ )
+ )
+ )
+ )
+ ); End of layout
+ ); End of heelprint
+ (toeprint
+ (pin 1
+ (pt -381000 1143000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 1143000)
+ (angle 90)
+ (padstackGroup default (padstack r115_115h75))
+ )
+ )
+ )
+ )
+ (pin 2
+ (pt -381000 889000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 889000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 3
+ (pt -381000 635000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 635000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 4
+ (pt -381000 381000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 381000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 5
+ (pt -381000 127000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 127000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 6
+ (pt -381000 -127000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 -127000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 7
+ (pt -381000 -381000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 -381000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 8
+ (pt -381000 -635000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 -635000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 9
+ (pt -381000 -889000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 -889000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 10
+ (pt -381000 -1143000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 -1143000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 11
+ (pt 381000 -1143000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 -1143000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 12
+ (pt 381000 -889000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 -889000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 13
+ (pt 381000 -635000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 -635000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 14
+ (pt 381000 -381000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 -381000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 15
+ (pt 381000 -127000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 -127000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 16
+ (pt 381000 127000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 127000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 17
+ (pt 381000 381000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 381000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 18
+ (pt 381000 635000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 635000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 19
+ (pt 381000 889000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 889000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 20
+ (pt 381000 1143000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 1143000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ ); End of toeprint
+ (propertyS accurateShape SN74LS273NE4.stp)
+ ); End of footprint
+ ); End of footprints
+ ); End of footprintContainer
+); End of ftf
+
diff --git a/circuit/SN74LS273NE4/CR-5000/DIP762W55P254L2642H457Q20N.pkf b/circuit/SN74LS273NE4/CR-5000/DIP762W55P254L2642H457Q20N.pkf
new file mode 100644
index 0000000..5bd3801
--- /dev/null
+++ b/circuit/SN74LS273NE4/CR-5000/DIP762W55P254L2642H457Q20N.pkf
@@ -0,0 +1,10 @@
+(unit MM)
+
+(package "DIP762W55P254L2642H457Q20N"
+ (type UNDEF)
+ (uver 2)
+ (mountForm default
+ (footprintRef "DIP762W55P254L2642H457Q20N")
+ (spec "default")
+ )
+)
diff --git a/circuit/SN74LS273NE4/CR-5000/SN74LS273NE4.cdf b/circuit/SN74LS273NE4/CR-5000/SN74LS273NE4.cdf
new file mode 100644
index 0000000..0e8881b
--- /dev/null
+++ b/circuit/SN74LS273NE4/CR-5000/SN74LS273NE4.cdf
@@ -0,0 +1,39 @@
+(part "SN74LS273NE4"
+ (packageRef "DIP762W55P254L2642H457Q20N")
+ (interface
+ (port "1" (symbPinId 1) (portName "%CLR%") (portType INPUT))
+ (port "2" (symbPinId 2) (portName "1Q") (portType OUTPUT))
+ (port "3" (symbPinId 3) (portName "1D") (portType INPUT))
+ (port "4" (symbPinId 4) (portName "2D") (portType INPUT))
+ (port "5" (symbPinId 5) (portName "2Q") (portType OUTPUT))
+ (port "6" (symbPinId 6) (portName "3Q") (portType OUTPUT))
+ (port "7" (symbPinId 7) (portName "3D") (portType INPUT))
+ (port "8" (symbPinId 8) (portName "4D") (portType INPUT))
+ (port "9" (symbPinId 9) (portName "4Q") (portType OUTPUT))
+ (port "10" (symbPinId 10) (portName "GND") (portType GROUND))
+ (port "11" (symbPinId 11) (portName "CLK") (portType INPUT))
+ (port "12" (symbPinId 12) (portName "5Q") (portType OUTPUT))
+ (port "13" (symbPinId 13) (portName "5D") (portType INPUT))
+ (port "14" (symbPinId 14) (portName "6D") (portType INPUT))
+ (port "15" (symbPinId 15) (portName "6Q") (portType OUTPUT))
+ (port "16" (symbPinId 16) (portName "7Q") (portType OUTPUT))
+ (port "17" (symbPinId 17) (portName "7D") (portType INPUT))
+ (port "18" (symbPinId 18) (portName "8D") (portType INPUT))
+ (port "19" (symbPinId 19) (portName "8Q") (portType OUTPUT))
+ (port "20" (symbPinId 20) (portName "VCC") (portType POWER))
+ )
+ (partClass UNDEF)
+ (useInSchema Y)
+ (useInLayout Y)
+ (inPartsList Y)
+ (partType NORMAL)
+ (placeRestriction FREE)
+ (property "compKind" "101")
+ (property "Mouser2_Part_Number" "595-SN74LS273NE4")
+ (property "Mouser2_Price/Stock" "https://www.mouser.com/Search/Refine.aspx?Keyword=595-SN74LS273NE4")
+ (property "Manufacturer_Name" "Texas Instruments")
+ (property "Manufacturer_Part_Number" "SN74LS273NE4")
+ (property "Description" "Flip Flops Octal D-Type Flip-Flop w/Clear")
+ (property "Datasheet_Link" "http://www.ti.com/lit/ds/sdls090/sdls090.pdf")
+ (property "symbolName1" "SN74LS273NE4")
+)
diff --git a/circuit/SN74LS273NE4/CR-5000/SN74LS273NE4.laf b/circuit/SN74LS273NE4/CR-5000/SN74LS273NE4.laf
new file mode 100644
index 0000000..af00cad
--- /dev/null
+++ b/circuit/SN74LS273NE4/CR-5000/SN74LS273NE4.laf
@@ -0,0 +1,304 @@
+LIB SN74LS273NE4
+ZONE 1 2 1 50.000 50.000 0.000 0.000 0 A 1
+GRID 1 1 1 1 1 1 1 4
+SHT 1 1 1 0 20 22 22
+PROP 0 componentType 1
+parts
+ENDPROP
+PROP 0 componentKind 1
+101
+ENDPROP
+PROP 0 partName 1
+SN74LS273NE4
+ENDPROP
+VIEW 1 1 0 -1 -1 19 6 0 1.000 3 reference
+VIEW 1 1 0 -1 -1 19 4 0 1.000 3 partName
+ENDSHT
+LINE 1 -1 -1 -1 0 0 0
+POINT - 4 2
+POINT - 18 2
+POINT - 18 -20
+POINT - 4 -20
+POINT - 4 2
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 0
+POINT - 4 0
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 -2
+POINT - 4 -2
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 -4
+POINT - 4 -4
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 -6
+POINT - 4 -6
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 -8
+POINT - 4 -8
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 -10
+POINT - 4 -10
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 -12
+POINT - 4 -12
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 -14
+POINT - 4 -14
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 -16
+POINT - 4 -16
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 -18
+POINT - 4 -18
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 0
+POINT - 18 0
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 -2
+POINT - 18 -2
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 -4
+POINT - 18 -4
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 -6
+POINT - 18 -6
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 -8
+POINT - 18 -8
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 -10
+POINT - 18 -10
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 -12
+POINT - 18 -12
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 -14
+POINT - 18 -14
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 -16
+POINT - 18 -16
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 -18
+POINT - 18 -18
+ENDLIN
+PIN 1 1 0 0
+PROP 0 pinLabel 1
+%CLR%
+ENDPROP
+PROP 0 pinNumber 1
+1
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 0.4 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 0 0 1.000 3 pinLabel
+ENDPIN
+PIN 2 1 0 -2
+PROP 0 pinLabel 1
+1Q
+ENDPROP
+PROP 0 pinNumber 1
+2
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 -1.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -2 0 1.000 3 pinLabel
+ENDPIN
+PIN 3 1 0 -4
+PROP 0 pinLabel 1
+1D
+ENDPROP
+PROP 0 pinNumber 1
+3
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 -3.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -4 0 1.000 3 pinLabel
+ENDPIN
+PIN 4 1 0 -6
+PROP 0 pinLabel 1
+2D
+ENDPROP
+PROP 0 pinNumber 1
+4
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 -5.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -6 0 1.000 3 pinLabel
+ENDPIN
+PIN 5 1 0 -8
+PROP 0 pinLabel 1
+2Q
+ENDPROP
+PROP 0 pinNumber 1
+5
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 -7.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -8 0 1.000 3 pinLabel
+ENDPIN
+PIN 6 1 0 -10
+PROP 0 pinLabel 1
+3Q
+ENDPROP
+PROP 0 pinNumber 1
+6
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 -9.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -10 0 1.000 3 pinLabel
+ENDPIN
+PIN 7 1 0 -12
+PROP 0 pinLabel 1
+3D
+ENDPROP
+PROP 0 pinNumber 1
+7
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 -11.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -12 0 1.000 3 pinLabel
+ENDPIN
+PIN 8 1 0 -14
+PROP 0 pinLabel 1
+4D
+ENDPROP
+PROP 0 pinNumber 1
+8
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 -13.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -14 0 1.000 3 pinLabel
+ENDPIN
+PIN 9 1 0 -16
+PROP 0 pinLabel 1
+4Q
+ENDPROP
+PROP 0 pinNumber 1
+9
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 -15.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -16 0 1.000 3 pinLabel
+ENDPIN
+PIN 10 1 0 -18
+PROP 0 pinLabel 1
+GND
+ENDPROP
+PROP 0 pinNumber 1
+10
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 -17.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -18 0 1.000 3 pinLabel
+ENDPIN
+PIN 11 1 22 0
+PROP 0 pinLabel 1
+VCC
+ENDPROP
+PROP 0 pinNumber 1
+20
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 0.4 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 0 0 1.000 5 pinLabel
+ENDPIN
+PIN 12 1 22 -2
+PROP 0 pinLabel 1
+8Q
+ENDPROP
+PROP 0 pinNumber 1
+19
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 -1.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -2 0 1.000 5 pinLabel
+ENDPIN
+PIN 13 1 22 -4
+PROP 0 pinLabel 1
+8D
+ENDPROP
+PROP 0 pinNumber 1
+18
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 -3.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -4 0 1.000 5 pinLabel
+ENDPIN
+PIN 14 1 22 -6
+PROP 0 pinLabel 1
+7D
+ENDPROP
+PROP 0 pinNumber 1
+17
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 -5.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -6 0 1.000 5 pinLabel
+ENDPIN
+PIN 15 1 22 -8
+PROP 0 pinLabel 1
+7Q
+ENDPROP
+PROP 0 pinNumber 1
+16
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 -7.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -8 0 1.000 5 pinLabel
+ENDPIN
+PIN 16 1 22 -10
+PROP 0 pinLabel 1
+6Q
+ENDPROP
+PROP 0 pinNumber 1
+15
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 -9.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -10 0 1.000 5 pinLabel
+ENDPIN
+PIN 17 1 22 -12
+PROP 0 pinLabel 1
+6D
+ENDPROP
+PROP 0 pinNumber 1
+14
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 -11.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -12 0 1.000 5 pinLabel
+ENDPIN
+PIN 18 1 22 -14
+PROP 0 pinLabel 1
+5D
+ENDPROP
+PROP 0 pinNumber 1
+13
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 -13.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -14 0 1.000 5 pinLabel
+ENDPIN
+PIN 19 1 22 -16
+PROP 0 pinLabel 1
+5Q
+ENDPROP
+PROP 0 pinNumber 1
+12
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 -15.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -16 0 1.000 5 pinLabel
+ENDPIN
+PIN 20 1 22 -18
+PROP 0 pinLabel 1
+CLK
+ENDPROP
+PROP 0 pinNumber 1
+11
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 -17.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -18 0 1.000 5 pinLabel
+ENDPIN
+ENDLIB
diff --git a/circuit/SN74LS273NE4/CR-8000/DIP762W55P254L2642H457Q20N.ftf b/circuit/SN74LS273NE4/CR-8000/DIP762W55P254L2642H457Q20N.ftf
new file mode 100644
index 0000000..c111adb
--- /dev/null
+++ b/circuit/SN74LS273NE4/CR-8000/DIP762W55P254L2642H457Q20N.ftf
@@ -0,0 +1,523 @@
+(ftf
+ (header
+ (version 2.0)
+ (unit DBUNIT)
+ )
+ (TechnologyContainer
+ (technology SamacSys_Footprint
+ (footprintLayer
+ (layer Top (type Conductive))
+ (layer Inner (type Conductive))
+ (layer Bottom (type Conductive))
+ (layer Silk-Top (type Symbolmark))
+ (layer Silk-Bottom (type Symbolmark))
+ (layer Resist-Top (type Solderresist))
+ (layer Resist-Bottom (type Solderresist))
+ (layer MetalMask-Top (type Metalmask))
+ (layer MetalMask-Bottom (type Metalmask))
+ (layer CompArea-Top (type Comparea))
+ (layer CompArea-Bottom (type Comparea))
+ (layer Assembly-Top (type Undefined))
+ (layer Assembly-Bottom (type Undefined))
+ (layer Hole (type Hole))
+ )
+ )
+ )
+ (footprintContainer
+ (commonParameters
+ (dimensionParameters
+ (arrowLength 100000)
+ (arrowAngle 15.000000)
+ (dotDiameter 100000)
+ (textFrameOffset 100000)
+ (arrowOffset 100000)
+ (dimAssistOffset 100000)
+ (dimLineWidth 10000)
+ (drawTextFrame NO)
+ (textFrameRange ALL)
+ (textClip NO)
+ (standard JIS)
+ )
+ )
+ (padstackGroups
+ (padstackGroup default)
+ )
+ (pads
+ (pad c115
+ (photo FLASH)
+ (panelUse NO)
+ (geometry
+ (circle 57500
+ (pt 0 0)
+ )
+ )
+ )
+ (pad r115_115
+ (photo FLASH)
+ (panelUse NO)
+ (geometry
+ (rectangle
+ (pt 0 0)
+ (width 115000)
+ (height 115000)
+ (rAngle 0.000000)
+ (outlineWidth 0)
+ (fillWidth 0)
+ (fillAngle 0.000000)
+ )
+ )
+ )
+ ); End of pads
+ (padstacks
+ (padstack c115h75
+ (type PLATED)
+ (throughMode THROUGH)
+ (panelUse NO)
+ (Hole (footLayer Hole)
+ (geometry
+ (circle 37500
+ (pt 0 0)
+ )
+ )
+ )
+ (padSet (footLayer Top)
+ (connect (pad c115))
+ (noconnect (pad c115))
+ )
+ (padSet (footLayer Resist-Top)
+ (connect (pad c115))
+ (noconnect (pad c115))
+ )
+ (padSet (footLayer Resist-Bottom)
+ (connect (pad c115))
+ (noconnect (pad c115))
+ )
+ (padSet (footLayer Inner)
+ (clearance (pad c115))
+ (connect (pad c115))
+ (noconnect (pad c115))
+ )
+ (padSet (footLayer Bottom)
+ (connect (pad c115))
+ (noconnect (pad c115))
+ )
+ )
+ (padstack r115_115h75
+ (type PLATED)
+ (throughMode THROUGH)
+ (panelUse NO)
+ (Hole (footLayer Hole)
+ (geometry
+ (circle 37500
+ (pt 0 0)
+ )
+ )
+ )
+ (padSet (footLayer Top)
+ (connect (pad r115_115))
+ (noconnect (pad r115_115))
+ )
+ (padSet (footLayer Resist-Top)
+ (connect (pad r115_115))
+ (noconnect (pad r115_115))
+ )
+ (padSet (footLayer Resist-Bottom)
+ (connect (pad r115_115))
+ (noconnect (pad r115_115))
+ )
+ (padSet (footLayer Inner)
+ (clearance (pad c115))
+ (connect (pad c115))
+ (noconnect (pad c115))
+ )
+ (padSet (footLayer Bottom)
+ (connect (pad r115_115))
+ (noconnect (pad r115_115))
+ )
+ )
+ ); End of padstacks
+ (footprints
+ (footprint "DIP762W55P254L2642H457Q20N"
+ (polarity YES)
+ (panelUse NO)
+ (heelprint
+ (layout
+ (layer (footLayer CompArea-Top)
+ (area
+ (geometry
+ (surface
+ (outlineWidth 0)
+ (fillWidth 0)
+ (fillAngle 0.000000)
+ (vertex
+ (pt 463500 1383500)
+ (pt 463500 -1383500)
+ (pt -463500 -1383500)
+ (pt -463500 1383500)
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Assembly-Top)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt -330000 1358500
+ (width 10000)
+ )
+ (pt 330000 1358500
+ (width 10000)
+ )
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Assembly-Top)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt 330000 1358500
+ (width 10000)
+ )
+ (pt 330000 -1358500
+ (width 10000)
+ )
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Assembly-Top)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt 330000 -1358500
+ (width 10000)
+ )
+ (pt -330000 -1358500
+ (width 10000)
+ )
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Assembly-Top)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt -330000 -1358500
+ (width 10000)
+ )
+ (pt -330000 1358500
+ (width 10000)
+ )
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Assembly-Top)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt -330000 1231500
+ (width 10000)
+ )
+ (pt -203000 1358500
+ (width 10000)
+ )
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Silk-Top)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt -438500 1358500
+ (width 20000)
+ )
+ (pt 330000 1358500
+ (width 20000)
+ )
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Silk-Top)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt -330000 -1358500
+ (width 20000)
+ )
+ (pt 330000 -1358500
+ (width 20000)
+ )
+ )
+ )
+ )
+ )
+ )
+ ); End of layout
+ ); End of heelprint
+ (toeprint
+ (pin 1
+ (pt -381000 1143000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 1143000)
+ (angle 90)
+ (padstackGroup default (padstack r115_115h75))
+ )
+ )
+ )
+ )
+ (pin 2
+ (pt -381000 889000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 889000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 3
+ (pt -381000 635000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 635000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 4
+ (pt -381000 381000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 381000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 5
+ (pt -381000 127000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 127000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 6
+ (pt -381000 -127000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 -127000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 7
+ (pt -381000 -381000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 -381000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 8
+ (pt -381000 -635000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 -635000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 9
+ (pt -381000 -889000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 -889000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 10
+ (pt -381000 -1143000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 -1143000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 11
+ (pt 381000 -1143000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 -1143000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 12
+ (pt 381000 -889000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 -889000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 13
+ (pt 381000 -635000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 -635000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 14
+ (pt 381000 -381000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 -381000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 15
+ (pt 381000 -127000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 -127000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 16
+ (pt 381000 127000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 127000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 17
+ (pt 381000 381000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 381000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 18
+ (pt 381000 635000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 635000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 19
+ (pt 381000 889000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 889000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 20
+ (pt 381000 1143000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 1143000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ ); End of toeprint
+ (propertyS accurateShape SN74LS273NE4.stp)
+ ); End of footprint
+ ); End of footprints
+ ); End of footprintContainer
+); End of ftf
+
diff --git a/circuit/SN74LS273NE4/CR-8000/DIP762W55P254L2642H457Q20N.pkf b/circuit/SN74LS273NE4/CR-8000/DIP762W55P254L2642H457Q20N.pkf
new file mode 100644
index 0000000..5bd3801
--- /dev/null
+++ b/circuit/SN74LS273NE4/CR-8000/DIP762W55P254L2642H457Q20N.pkf
@@ -0,0 +1,10 @@
+(unit MM)
+
+(package "DIP762W55P254L2642H457Q20N"
+ (type UNDEF)
+ (uver 2)
+ (mountForm default
+ (footprintRef "DIP762W55P254L2642H457Q20N")
+ (spec "default")
+ )
+)
diff --git a/circuit/SN74LS273NE4/CR-8000/SN74LS273NE4.cdf b/circuit/SN74LS273NE4/CR-8000/SN74LS273NE4.cdf
new file mode 100644
index 0000000..0e8881b
--- /dev/null
+++ b/circuit/SN74LS273NE4/CR-8000/SN74LS273NE4.cdf
@@ -0,0 +1,39 @@
+(part "SN74LS273NE4"
+ (packageRef "DIP762W55P254L2642H457Q20N")
+ (interface
+ (port "1" (symbPinId 1) (portName "%CLR%") (portType INPUT))
+ (port "2" (symbPinId 2) (portName "1Q") (portType OUTPUT))
+ (port "3" (symbPinId 3) (portName "1D") (portType INPUT))
+ (port "4" (symbPinId 4) (portName "2D") (portType INPUT))
+ (port "5" (symbPinId 5) (portName "2Q") (portType OUTPUT))
+ (port "6" (symbPinId 6) (portName "3Q") (portType OUTPUT))
+ (port "7" (symbPinId 7) (portName "3D") (portType INPUT))
+ (port "8" (symbPinId 8) (portName "4D") (portType INPUT))
+ (port "9" (symbPinId 9) (portName "4Q") (portType OUTPUT))
+ (port "10" (symbPinId 10) (portName "GND") (portType GROUND))
+ (port "11" (symbPinId 11) (portName "CLK") (portType INPUT))
+ (port "12" (symbPinId 12) (portName "5Q") (portType OUTPUT))
+ (port "13" (symbPinId 13) (portName "5D") (portType INPUT))
+ (port "14" (symbPinId 14) (portName "6D") (portType INPUT))
+ (port "15" (symbPinId 15) (portName "6Q") (portType OUTPUT))
+ (port "16" (symbPinId 16) (portName "7Q") (portType OUTPUT))
+ (port "17" (symbPinId 17) (portName "7D") (portType INPUT))
+ (port "18" (symbPinId 18) (portName "8D") (portType INPUT))
+ (port "19" (symbPinId 19) (portName "8Q") (portType OUTPUT))
+ (port "20" (symbPinId 20) (portName "VCC") (portType POWER))
+ )
+ (partClass UNDEF)
+ (useInSchema Y)
+ (useInLayout Y)
+ (inPartsList Y)
+ (partType NORMAL)
+ (placeRestriction FREE)
+ (property "compKind" "101")
+ (property "Mouser2_Part_Number" "595-SN74LS273NE4")
+ (property "Mouser2_Price/Stock" "https://www.mouser.com/Search/Refine.aspx?Keyword=595-SN74LS273NE4")
+ (property "Manufacturer_Name" "Texas Instruments")
+ (property "Manufacturer_Part_Number" "SN74LS273NE4")
+ (property "Description" "Flip Flops Octal D-Type Flip-Flop w/Clear")
+ (property "Datasheet_Link" "http://www.ti.com/lit/ds/sdls090/sdls090.pdf")
+ (property "symbolName1" "SN74LS273NE4")
+)
diff --git a/circuit/SN74LS273NE4/CR-8000/SN74LS273NE4.laf b/circuit/SN74LS273NE4/CR-8000/SN74LS273NE4.laf
new file mode 100644
index 0000000..af00cad
--- /dev/null
+++ b/circuit/SN74LS273NE4/CR-8000/SN74LS273NE4.laf
@@ -0,0 +1,304 @@
+LIB SN74LS273NE4
+ZONE 1 2 1 50.000 50.000 0.000 0.000 0 A 1
+GRID 1 1 1 1 1 1 1 4
+SHT 1 1 1 0 20 22 22
+PROP 0 componentType 1
+parts
+ENDPROP
+PROP 0 componentKind 1
+101
+ENDPROP
+PROP 0 partName 1
+SN74LS273NE4
+ENDPROP
+VIEW 1 1 0 -1 -1 19 6 0 1.000 3 reference
+VIEW 1 1 0 -1 -1 19 4 0 1.000 3 partName
+ENDSHT
+LINE 1 -1 -1 -1 0 0 0
+POINT - 4 2
+POINT - 18 2
+POINT - 18 -20
+POINT - 4 -20
+POINT - 4 2
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 0
+POINT - 4 0
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 -2
+POINT - 4 -2
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 -4
+POINT - 4 -4
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 -6
+POINT - 4 -6
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 -8
+POINT - 4 -8
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 -10
+POINT - 4 -10
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 -12
+POINT - 4 -12
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 -14
+POINT - 4 -14
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 -16
+POINT - 4 -16
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0 -18
+POINT - 4 -18
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 0
+POINT - 18 0
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 -2
+POINT - 18 -2
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 -4
+POINT - 18 -4
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 -6
+POINT - 18 -6
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 -8
+POINT - 18 -8
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 -10
+POINT - 18 -10
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 -12
+POINT - 18 -12
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 -14
+POINT - 18 -14
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 -16
+POINT - 18 -16
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22 -18
+POINT - 18 -18
+ENDLIN
+PIN 1 1 0 0
+PROP 0 pinLabel 1
+%CLR%
+ENDPROP
+PROP 0 pinNumber 1
+1
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 0.4 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 0 0 1.000 3 pinLabel
+ENDPIN
+PIN 2 1 0 -2
+PROP 0 pinLabel 1
+1Q
+ENDPROP
+PROP 0 pinNumber 1
+2
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 -1.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -2 0 1.000 3 pinLabel
+ENDPIN
+PIN 3 1 0 -4
+PROP 0 pinLabel 1
+1D
+ENDPROP
+PROP 0 pinNumber 1
+3
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 -3.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -4 0 1.000 3 pinLabel
+ENDPIN
+PIN 4 1 0 -6
+PROP 0 pinLabel 1
+2D
+ENDPROP
+PROP 0 pinNumber 1
+4
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 -5.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -6 0 1.000 3 pinLabel
+ENDPIN
+PIN 5 1 0 -8
+PROP 0 pinLabel 1
+2Q
+ENDPROP
+PROP 0 pinNumber 1
+5
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 -7.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -8 0 1.000 3 pinLabel
+ENDPIN
+PIN 6 1 0 -10
+PROP 0 pinLabel 1
+3Q
+ENDPROP
+PROP 0 pinNumber 1
+6
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 -9.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -10 0 1.000 3 pinLabel
+ENDPIN
+PIN 7 1 0 -12
+PROP 0 pinLabel 1
+3D
+ENDPROP
+PROP 0 pinNumber 1
+7
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 -11.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -12 0 1.000 3 pinLabel
+ENDPIN
+PIN 8 1 0 -14
+PROP 0 pinLabel 1
+4D
+ENDPROP
+PROP 0 pinNumber 1
+8
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 -13.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -14 0 1.000 3 pinLabel
+ENDPIN
+PIN 9 1 0 -16
+PROP 0 pinLabel 1
+4Q
+ENDPROP
+PROP 0 pinNumber 1
+9
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 -15.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -16 0 1.000 3 pinLabel
+ENDPIN
+PIN 10 1 0 -18
+PROP 0 pinLabel 1
+GND
+ENDPROP
+PROP 0 pinNumber 1
+10
+ENDPROP
+VIEW 1 1 0 -1 -1 2.8 -17.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -18 0 1.000 3 pinLabel
+ENDPIN
+PIN 11 1 22 0
+PROP 0 pinLabel 1
+VCC
+ENDPROP
+PROP 0 pinNumber 1
+20
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 0.4 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 0 0 1.000 5 pinLabel
+ENDPIN
+PIN 12 1 22 -2
+PROP 0 pinLabel 1
+8Q
+ENDPROP
+PROP 0 pinNumber 1
+19
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 -1.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -2 0 1.000 5 pinLabel
+ENDPIN
+PIN 13 1 22 -4
+PROP 0 pinLabel 1
+8D
+ENDPROP
+PROP 0 pinNumber 1
+18
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 -3.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -4 0 1.000 5 pinLabel
+ENDPIN
+PIN 14 1 22 -6
+PROP 0 pinLabel 1
+7D
+ENDPROP
+PROP 0 pinNumber 1
+17
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 -5.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -6 0 1.000 5 pinLabel
+ENDPIN
+PIN 15 1 22 -8
+PROP 0 pinLabel 1
+7Q
+ENDPROP
+PROP 0 pinNumber 1
+16
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 -7.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -8 0 1.000 5 pinLabel
+ENDPIN
+PIN 16 1 22 -10
+PROP 0 pinLabel 1
+6Q
+ENDPROP
+PROP 0 pinNumber 1
+15
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 -9.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -10 0 1.000 5 pinLabel
+ENDPIN
+PIN 17 1 22 -12
+PROP 0 pinLabel 1
+6D
+ENDPROP
+PROP 0 pinNumber 1
+14
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 -11.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -12 0 1.000 5 pinLabel
+ENDPIN
+PIN 18 1 22 -14
+PROP 0 pinLabel 1
+5D
+ENDPROP
+PROP 0 pinNumber 1
+13
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 -13.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -14 0 1.000 5 pinLabel
+ENDPIN
+PIN 19 1 22 -16
+PROP 0 pinLabel 1
+5Q
+ENDPROP
+PROP 0 pinNumber 1
+12
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 -15.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -16 0 1.000 5 pinLabel
+ENDPIN
+PIN 20 1 22 -18
+PROP 0 pinLabel 1
+CLK
+ENDPROP
+PROP 0 pinNumber 1
+11
+ENDPROP
+VIEW 1 1 0 -1 -1 19.2 -17.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -18 0 1.000 5 pinLabel
+ENDPIN
+ENDLIB
diff --git a/circuit/SN74LS273NE4/Capture/SN74LS273NE4.xml b/circuit/SN74LS273NE4/Capture/SN74LS273NE4.xml
new file mode 100644
index 0000000..317f776
--- /dev/null
+++ b/circuit/SN74LS273NE4/Capture/SN74LS273NE4.xml
@@ -0,0 +1,874 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/circuit/SN74LS273NE4/CircuitStudio/SN74LS273NE4.lbr b/circuit/SN74LS273NE4/CircuitStudio/SN74LS273NE4.lbr
new file mode 100644
index 0000000..cbfd46f
--- /dev/null
+++ b/circuit/SN74LS273NE4/CircuitStudio/SN74LS273NE4.lbr
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<Flip Flops Octal D-Type Flip-Flop w/Clear</b><p>
+<author>Created by SamacSys</author>
+
+
+<b>CASE 738–03</b><br>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+>NAME
+>VALUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+>NAME
+>VALUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<b>Flip Flops Octal D-Type Flip-Flop w/Clear</b><p>
+Source: <a href="http://www.ti.com/lit/ds/sdls090/sdls090.pdf"> Datasheet </a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/circuit/SN74LS273NE4/DEHDL/sn74ls273ne4/chips/chips.prt b/circuit/SN74LS273NE4/DEHDL/sn74ls273ne4/chips/chips.prt
new file mode 100644
index 0000000..da7f51f
--- /dev/null
+++ b/circuit/SN74LS273NE4/DEHDL/sn74ls273ne4/chips/chips.prt
@@ -0,0 +1,134 @@
+FILE_TYPE=LIBRARY_PARTS;
+PRIMITIVE 'SN74LS273NE4';
+ PIN
+ 'CLR*':
+ PIN_NUMBER='(1)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='INPUT';
+ '1Q':
+ PIN_NUMBER='(2)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='OUTPUT';
+ '1D':
+ PIN_NUMBER='(3)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='INPUT';
+ '2D':
+ PIN_NUMBER='(4)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='INPUT';
+ '2Q':
+ PIN_NUMBER='(5)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='OUTPUT';
+ '3Q':
+ PIN_NUMBER='(6)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='OUTPUT';
+ '3D':
+ PIN_NUMBER='(7)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='INPUT';
+ '4D':
+ PIN_NUMBER='(8)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='INPUT';
+ '4Q':
+ PIN_NUMBER='(9)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='OUTPUT';
+ 'GND':
+ PIN_NUMBER='(10)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='GROUND';
+ 'VCC':
+ PIN_NUMBER='(20)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='POWER';
+ '8Q':
+ PIN_NUMBER='(19)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='OUTPUT';
+ '8D':
+ PIN_NUMBER='(18)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='INPUT';
+ '7D':
+ PIN_NUMBER='(17)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='INPUT';
+ '7Q':
+ PIN_NUMBER='(16)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='OUTPUT';
+ '6Q':
+ PIN_NUMBER='(15)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='OUTPUT';
+ '6D':
+ PIN_NUMBER='(14)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='INPUT';
+ '5D':
+ PIN_NUMBER='(13)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='INPUT';
+ '5Q':
+ PIN_NUMBER='(12)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='OUTPUT';
+ 'CLK':
+ PIN_NUMBER='(11)';
+ NO_LOAD_CHECK=BOTH;
+ NO_IO_CHECK=BOTH;
+ ALLOW_CONNECT=TRUE;
+ PINUSE='INPUT';
+ END_PIN;
+ BODY
+ PART_NAME='SN74LS273NE4';
+ PHYS_DES_PREFIX='IC';
+ NO_LOAD_CHECK='TRUE';
+ PIN_COUNT='20';
+ BODY_NAME='SN74LS273NE4';
+ JEDEC_TYPE='DIP762W55P254L2642H457Q20N';
+ END_BODY;
+END_PRIMITIVE;
+END.
diff --git a/circuit/SN74LS273NE4/DEHDL/sn74ls273ne4/part_table/part.ptf b/circuit/SN74LS273NE4/DEHDL/sn74ls273ne4/part_table/part.ptf
new file mode 100644
index 0000000..c4acf7d
--- /dev/null
+++ b/circuit/SN74LS273NE4/DEHDL/sn74ls273ne4/part_table/part.ptf
@@ -0,0 +1,11 @@
+FILE_TYPE = MULTI_PHYS_TABLE;
+
+PART 'SN74LS273NE4'
+CLASS = IC
+{========================================================================================}
+:"MANUFACTURER_NAME", "MANUFACTURER_PART_NUMBER"= "PART_NUMBER", "JEDEC_TYPE", "PACK_TYPE", "MOUSER2_PART_NUMBER", "MOUSER2_PRICE/STOCK", "DESCRIPTION", "DATASHEET", "HEIGHT";
+{========================================================================================}
+ "Texas Instruments", "SN74LS273NE4" (!) = "", "DIP762W55P254L2642H457Q20N", "Dual-In-Line Packages", "595-SN74LS273NE4", "https://www.mouser.com/Search/Refine.aspx?Keyword=595-SN74LS273NE4", "Flip Flops Octal D-Type Flip-Flop w/Clear", "http://www.ti.com/lit/ds/sdls090/sdls090.pdf", "4.57 mm"
+END_PART
+
+END.
diff --git a/circuit/SN74LS273NE4/DEHDL/sn74ls273ne4/sym_1/symbol.css b/circuit/SN74LS273NE4/DEHDL/sn74ls273ne4/sym_1/symbol.css
new file mode 100644
index 0000000..f658baa
--- /dev/null
+++ b/circuit/SN74LS273NE4/DEHDL/sn74ls273ne4/sym_1/symbol.css
@@ -0,0 +1,67 @@
+C 0 0 "CLR*" 0 0 0 0 60 0 L
+X "PIN_TEXT" "CLR*" 230 -30 0 0.00 60 0 0 0 0 0 1 0 74
+L 200 0 0 0 -1 0
+C 0 -100 "1Q" 0 -100 0 0 60 0 L
+X "PIN_TEXT" "1Q" 230 -130 0 0.00 60 0 0 0 0 0 1 0 74
+L 200 -100 0 -100 -1 0
+C 0 -200 "1D" 0 -200 0 0 60 0 L
+X "PIN_TEXT" "1D" 230 -230 0 0.00 60 0 0 0 0 0 1 0 74
+L 200 -200 0 -200 -1 0
+C 0 -300 "2D" 0 -300 0 0 60 0 L
+X "PIN_TEXT" "2D" 230 -330 0 0.00 60 0 0 0 0 0 1 0 74
+L 200 -300 0 -300 -1 0
+C 0 -400 "2Q" 0 -400 0 0 60 0 L
+X "PIN_TEXT" "2Q" 230 -430 0 0.00 60 0 0 0 0 0 1 0 74
+L 200 -400 0 -400 -1 0
+C 0 -500 "3Q" 0 -500 0 0 60 0 L
+X "PIN_TEXT" "3Q" 230 -530 0 0.00 60 0 0 0 0 0 1 0 74
+L 200 -500 0 -500 -1 0
+C 0 -600 "3D" 0 -600 0 0 60 0 L
+X "PIN_TEXT" "3D" 230 -630 0 0.00 60 0 0 0 0 0 1 0 74
+L 200 -600 0 -600 -1 0
+C 0 -700 "4D" 0 -700 0 0 60 0 L
+X "PIN_TEXT" "4D" 230 -730 0 0.00 60 0 0 0 0 0 1 0 74
+L 200 -700 0 -700 -1 0
+C 0 -800 "4Q" 0 -800 0 0 60 0 L
+X "PIN_TEXT" "4Q" 230 -830 0 0.00 60 0 0 0 0 0 1 0 74
+L 200 -800 0 -800 -1 0
+C 0 -900 "GND" 0 -900 0 0 60 0 L
+X "PIN_TEXT" "GND" 230 -930 0 0.00 60 0 0 0 0 0 1 0 74
+L 200 -900 0 -900 -1 0
+C 1100 0 "VCC" 1100 0 0 0 60 0 R
+X "PIN_TEXT" "VCC" 870 -30 0 0.00 60 0 0 2 0 0 1 0 74
+L 900 0 1100 0 -1 0
+C 1100 -100 "8Q" 1100 -100 0 0 60 0 R
+X "PIN_TEXT" "8Q" 870 -130 0 0.00 60 0 0 2 0 0 1 0 74
+L 900 -100 1100 -100 -1 0
+C 1100 -200 "8D" 1100 -200 0 0 60 0 R
+X "PIN_TEXT" "8D" 870 -230 0 0.00 60 0 0 2 0 0 1 0 74
+L 900 -200 1100 -200 -1 0
+C 1100 -300 "7D" 1100 -300 0 0 60 0 R
+X "PIN_TEXT" "7D" 870 -330 0 0.00 60 0 0 2 0 0 1 0 74
+L 900 -300 1100 -300 -1 0
+C 1100 -400 "7Q" 1100 -400 0 0 60 0 R
+X "PIN_TEXT" "7Q" 870 -430 0 0.00 60 0 0 2 0 0 1 0 74
+L 900 -400 1100 -400 -1 0
+C 1100 -500 "6Q" 1100 -500 0 0 60 0 R
+X "PIN_TEXT" "6Q" 870 -530 0 0.00 60 0 0 2 0 0 1 0 74
+L 900 -500 1100 -500 -1 0
+C 1100 -600 "6D" 1100 -600 0 0 60 0 R
+X "PIN_TEXT" "6D" 870 -630 0 0.00 60 0 0 2 0 0 1 0 74
+L 900 -600 1100 -600 -1 0
+C 1100 -700 "5D" 1100 -700 0 0 60 0 R
+X "PIN_TEXT" "5D" 870 -730 0 0.00 60 0 0 2 0 0 1 0 74
+L 900 -700 1100 -700 -1 0
+C 1100 -800 "5Q" 1100 -800 0 0 60 0 R
+X "PIN_TEXT" "5Q" 870 -830 0 0.00 60 0 0 2 0 0 1 0 74
+L 900 -800 1100 -800 -1 0
+C 1100 -900 "CLK" 1100 -900 0 0 60 0 R
+X "PIN_TEXT" "CLK" 870 -930 0 0.00 60 0 0 2 0 0 1 0 74
+L 900 -900 1100 -900 -1 0
+L 200 100 900 100 -1 0
+L 900 -1000 900 100 -1 0
+L 900 -1000 200 -1000 -1 0
+L 200 100 200 -1000 -1 0
+P "$LOCATION" "?" 950 270 0 0 60 0 0 0 0 0 1 0 32
+P "PACK_TYPE" "?" 0 -50 0 0 100 0 0 1 0 0 0 0 32
+
diff --git a/circuit/SN74LS273NE4/DesignSpark PCB PRO/SN74LS273NE4.dsl b/circuit/SN74LS273NE4/DesignSpark PCB PRO/SN74LS273NE4.dsl
new file mode 100644
index 0000000..86a7739
--- /dev/null
+++ b/circuit/SN74LS273NE4/DesignSpark PCB PRO/SN74LS273NE4.dsl
@@ -0,0 +1,194 @@
+SamacSys ECAD Model
+796887/230744/2.46/20/3/Integrated Circuit
+
+DESIGNSPARK_INTERMEDIATE_ASCII
+
+(asciiHeader
+ (fileUnits MM)
+)
+(library Library_1
+ (padStyleDef "c115_h75"
+ (holeDiam 0.75)
+ (padShape (layerNumRef 1) (padShapeType Ellipse) (shapeWidth 1.15) (shapeHeight 1.15))
+ (padShape (layerNumRef 16) (padShapeType Ellipse) (shapeWidth 1.15) (shapeHeight 1.15))
+ )
+ (padStyleDef "s115_h75"
+ (holeDiam 0.75)
+ (padShape (layerNumRef 1) (padShapeType Rect) (shapeWidth 1.15) (shapeHeight 1.15))
+ (padShape (layerNumRef 16) (padShapeType Rect) (shapeWidth 1.15) (shapeHeight 1.15))
+ )
+ (textStyleDef "Default"
+ (font
+ (fontType Stroke)
+ (fontFace "Helvetica")
+ (fontHeight 50 mils)
+ (strokeWidth 5 mils)
+ )
+ )
+ (patternDef "DIP762W55P254L2642H457Q20N" (originalName "DIP762W55P254L2642H457Q20N")
+ (multiLayer
+ (pad (padNum 1) (padStyleRef s115_h75) (pt -3.81, 11.43) (rotation 90))
+ (pad (padNum 2) (padStyleRef c115_h75) (pt -3.81, 8.89) (rotation 90))
+ (pad (padNum 3) (padStyleRef c115_h75) (pt -3.81, 6.35) (rotation 90))
+ (pad (padNum 4) (padStyleRef c115_h75) (pt -3.81, 3.81) (rotation 90))
+ (pad (padNum 5) (padStyleRef c115_h75) (pt -3.81, 1.27) (rotation 90))
+ (pad (padNum 6) (padStyleRef c115_h75) (pt -3.81, -1.27) (rotation 90))
+ (pad (padNum 7) (padStyleRef c115_h75) (pt -3.81, -3.81) (rotation 90))
+ (pad (padNum 8) (padStyleRef c115_h75) (pt -3.81, -6.35) (rotation 90))
+ (pad (padNum 9) (padStyleRef c115_h75) (pt -3.81, -8.89) (rotation 90))
+ (pad (padNum 10) (padStyleRef c115_h75) (pt -3.81, -11.43) (rotation 90))
+ (pad (padNum 11) (padStyleRef c115_h75) (pt 3.81, -11.43) (rotation 90))
+ (pad (padNum 12) (padStyleRef c115_h75) (pt 3.81, -8.89) (rotation 90))
+ (pad (padNum 13) (padStyleRef c115_h75) (pt 3.81, -6.35) (rotation 90))
+ (pad (padNum 14) (padStyleRef c115_h75) (pt 3.81, -3.81) (rotation 90))
+ (pad (padNum 15) (padStyleRef c115_h75) (pt 3.81, -1.27) (rotation 90))
+ (pad (padNum 16) (padStyleRef c115_h75) (pt 3.81, 1.27) (rotation 90))
+ (pad (padNum 17) (padStyleRef c115_h75) (pt 3.81, 3.81) (rotation 90))
+ (pad (padNum 18) (padStyleRef c115_h75) (pt 3.81, 6.35) (rotation 90))
+ (pad (padNum 19) (padStyleRef c115_h75) (pt 3.81, 8.89) (rotation 90))
+ (pad (padNum 20) (padStyleRef c115_h75) (pt 3.81, 11.43) (rotation 90))
+ )
+ (layerContents (layerNumRef 18)
+ (attr "RefDes" "RefDes" (pt 0, 0) (textStyleRef "Default") (isVisible True))
+ )
+ (layerContents (layerNumRef 30)
+ (line (pt -4.635 13.835) (pt 4.635 13.835) (width 0.05))
+ )
+ (layerContents (layerNumRef 30)
+ (line (pt 4.635 13.835) (pt 4.635 -13.835) (width 0.05))
+ )
+ (layerContents (layerNumRef 30)
+ (line (pt 4.635 -13.835) (pt -4.635 -13.835) (width 0.05))
+ )
+ (layerContents (layerNumRef 30)
+ (line (pt -4.635 -13.835) (pt -4.635 13.835) (width 0.05))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt -3.3 13.585) (pt 3.3 13.585) (width 0.1))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt 3.3 13.585) (pt 3.3 -13.585) (width 0.1))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt 3.3 -13.585) (pt -3.3 -13.585) (width 0.1))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt -3.3 -13.585) (pt -3.3 13.585) (width 0.1))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt -3.3 12.315) (pt -2.03 13.585) (width 0.1))
+ )
+ (layerContents (layerNumRef 18)
+ (line (pt -4.385 13.585) (pt 3.3 13.585) (width 0.2))
+ )
+ (layerContents (layerNumRef 18)
+ (line (pt -3.3 -13.585) (pt 3.3 -13.585) (width 0.2))
+ )
+ )
+ (symbolDef "SN74LS273NE4" (originalName "SN74LS273NE4")
+
+ (pin (pinNum 1) (pt 0 mils 0 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -25 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 2) (pt 0 mils -100 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -125 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 3) (pt 0 mils -200 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -225 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 4) (pt 0 mils -300 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -325 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 5) (pt 0 mils -400 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -425 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 6) (pt 0 mils -500 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -525 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 7) (pt 0 mils -600 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -625 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 8) (pt 0 mils -700 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -725 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 9) (pt 0 mils -800 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -825 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 10) (pt 0 mils -900 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -925 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 11) (pt 1100 mils 0 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -25 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 12) (pt 1100 mils -100 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -125 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 13) (pt 1100 mils -200 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -225 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 14) (pt 1100 mils -300 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -325 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 15) (pt 1100 mils -400 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -425 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 16) (pt 1100 mils -500 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -525 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 17) (pt 1100 mils -600 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -625 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 18) (pt 1100 mils -700 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -725 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 19) (pt 1100 mils -800 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -825 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 20) (pt 1100 mils -900 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -925 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (line (pt 200 mils 100 mils) (pt 900 mils 100 mils) (width 6 mils))
+ (line (pt 900 mils 100 mils) (pt 900 mils -1000 mils) (width 6 mils))
+ (line (pt 900 mils -1000 mils) (pt 200 mils -1000 mils) (width 6 mils))
+ (line (pt 200 mils -1000 mils) (pt 200 mils 100 mils) (width 6 mils))
+ (attr "RefDes" "RefDes" (pt 950 mils 300 mils) (justify Left) (isVisible True) (textStyleRef "Default"))
+
+ )
+ (compDef "SN74LS273NE4" (originalName "SN74LS273NE4") (compHeader (numPins 20) (numParts 1) (refDesPrefix IC)
+ )
+ (compPin "1" (pinName "__CLR") (partNum 1) (symPinNum 1) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "2" (pinName "1Q") (partNum 1) (symPinNum 2) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "3" (pinName "1D") (partNum 1) (symPinNum 3) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "4" (pinName "2D") (partNum 1) (symPinNum 4) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "5" (pinName "2Q") (partNum 1) (symPinNum 5) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "6" (pinName "3Q") (partNum 1) (symPinNum 6) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "7" (pinName "3D") (partNum 1) (symPinNum 7) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "8" (pinName "4D") (partNum 1) (symPinNum 8) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "9" (pinName "4Q") (partNum 1) (symPinNum 9) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "10" (pinName "GND") (partNum 1) (symPinNum 10) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "20" (pinName "VCC") (partNum 1) (symPinNum 11) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "19" (pinName "8Q") (partNum 1) (symPinNum 12) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "18" (pinName "8D") (partNum 1) (symPinNum 13) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "17" (pinName "7D") (partNum 1) (symPinNum 14) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "16" (pinName "7Q") (partNum 1) (symPinNum 15) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "15" (pinName "6Q") (partNum 1) (symPinNum 16) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "14" (pinName "6D") (partNum 1) (symPinNum 17) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "13" (pinName "5D") (partNum 1) (symPinNum 18) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "12" (pinName "5Q") (partNum 1) (symPinNum 19) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "11" (pinName "CLK") (partNum 1) (symPinNum 20) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (attachedSymbol (partNum 1) (altType Normal) (symbolName "SN74LS273NE4"))
+ (attachedPattern (patternNum 1) (patternName "DIP762W55P254L2642H457Q20N")
+ (numPads 20)
+ (padPinMap
+ (padNum 1) (compPinRef "1")
+ (padNum 2) (compPinRef "2")
+ (padNum 3) (compPinRef "3")
+ (padNum 4) (compPinRef "4")
+ (padNum 5) (compPinRef "5")
+ (padNum 6) (compPinRef "6")
+ (padNum 7) (compPinRef "7")
+ (padNum 8) (compPinRef "8")
+ (padNum 9) (compPinRef "9")
+ (padNum 10) (compPinRef "10")
+ (padNum 11) (compPinRef "11")
+ (padNum 12) (compPinRef "12")
+ (padNum 13) (compPinRef "13")
+ (padNum 14) (compPinRef "14")
+ (padNum 15) (compPinRef "15")
+ (padNum 16) (compPinRef "16")
+ (padNum 17) (compPinRef "17")
+ (padNum 18) (compPinRef "18")
+ (padNum 19) (compPinRef "19")
+ (padNum 20) (compPinRef "20")
+ )
+ )
+ (attr "Mouser2 Part Number" "595-SN74LS273NE4")
+ (attr "Mouser2 Price/Stock" "https://www.mouser.com/Search/Refine.aspx?Keyword=595-SN74LS273NE4")
+ (attr "Manufacturer_Name" "Texas Instruments")
+ (attr "Manufacturer_Part_Number" "SN74LS273NE4")
+ (attr "Description" "Flip Flops Octal D-Type Flip-Flop w/Clear")
+ (attr "Datasheet Link" "http://www.ti.com/lit/ds/sdls090/sdls090.pdf")
+ (attr "Height" "4.57 mm")
+ )
+
+)
diff --git a/circuit/SN74LS273NE4/DesignSpark PCB/SN74LS273NE4.dsl b/circuit/SN74LS273NE4/DesignSpark PCB/SN74LS273NE4.dsl
new file mode 100644
index 0000000..86a7739
--- /dev/null
+++ b/circuit/SN74LS273NE4/DesignSpark PCB/SN74LS273NE4.dsl
@@ -0,0 +1,194 @@
+SamacSys ECAD Model
+796887/230744/2.46/20/3/Integrated Circuit
+
+DESIGNSPARK_INTERMEDIATE_ASCII
+
+(asciiHeader
+ (fileUnits MM)
+)
+(library Library_1
+ (padStyleDef "c115_h75"
+ (holeDiam 0.75)
+ (padShape (layerNumRef 1) (padShapeType Ellipse) (shapeWidth 1.15) (shapeHeight 1.15))
+ (padShape (layerNumRef 16) (padShapeType Ellipse) (shapeWidth 1.15) (shapeHeight 1.15))
+ )
+ (padStyleDef "s115_h75"
+ (holeDiam 0.75)
+ (padShape (layerNumRef 1) (padShapeType Rect) (shapeWidth 1.15) (shapeHeight 1.15))
+ (padShape (layerNumRef 16) (padShapeType Rect) (shapeWidth 1.15) (shapeHeight 1.15))
+ )
+ (textStyleDef "Default"
+ (font
+ (fontType Stroke)
+ (fontFace "Helvetica")
+ (fontHeight 50 mils)
+ (strokeWidth 5 mils)
+ )
+ )
+ (patternDef "DIP762W55P254L2642H457Q20N" (originalName "DIP762W55P254L2642H457Q20N")
+ (multiLayer
+ (pad (padNum 1) (padStyleRef s115_h75) (pt -3.81, 11.43) (rotation 90))
+ (pad (padNum 2) (padStyleRef c115_h75) (pt -3.81, 8.89) (rotation 90))
+ (pad (padNum 3) (padStyleRef c115_h75) (pt -3.81, 6.35) (rotation 90))
+ (pad (padNum 4) (padStyleRef c115_h75) (pt -3.81, 3.81) (rotation 90))
+ (pad (padNum 5) (padStyleRef c115_h75) (pt -3.81, 1.27) (rotation 90))
+ (pad (padNum 6) (padStyleRef c115_h75) (pt -3.81, -1.27) (rotation 90))
+ (pad (padNum 7) (padStyleRef c115_h75) (pt -3.81, -3.81) (rotation 90))
+ (pad (padNum 8) (padStyleRef c115_h75) (pt -3.81, -6.35) (rotation 90))
+ (pad (padNum 9) (padStyleRef c115_h75) (pt -3.81, -8.89) (rotation 90))
+ (pad (padNum 10) (padStyleRef c115_h75) (pt -3.81, -11.43) (rotation 90))
+ (pad (padNum 11) (padStyleRef c115_h75) (pt 3.81, -11.43) (rotation 90))
+ (pad (padNum 12) (padStyleRef c115_h75) (pt 3.81, -8.89) (rotation 90))
+ (pad (padNum 13) (padStyleRef c115_h75) (pt 3.81, -6.35) (rotation 90))
+ (pad (padNum 14) (padStyleRef c115_h75) (pt 3.81, -3.81) (rotation 90))
+ (pad (padNum 15) (padStyleRef c115_h75) (pt 3.81, -1.27) (rotation 90))
+ (pad (padNum 16) (padStyleRef c115_h75) (pt 3.81, 1.27) (rotation 90))
+ (pad (padNum 17) (padStyleRef c115_h75) (pt 3.81, 3.81) (rotation 90))
+ (pad (padNum 18) (padStyleRef c115_h75) (pt 3.81, 6.35) (rotation 90))
+ (pad (padNum 19) (padStyleRef c115_h75) (pt 3.81, 8.89) (rotation 90))
+ (pad (padNum 20) (padStyleRef c115_h75) (pt 3.81, 11.43) (rotation 90))
+ )
+ (layerContents (layerNumRef 18)
+ (attr "RefDes" "RefDes" (pt 0, 0) (textStyleRef "Default") (isVisible True))
+ )
+ (layerContents (layerNumRef 30)
+ (line (pt -4.635 13.835) (pt 4.635 13.835) (width 0.05))
+ )
+ (layerContents (layerNumRef 30)
+ (line (pt 4.635 13.835) (pt 4.635 -13.835) (width 0.05))
+ )
+ (layerContents (layerNumRef 30)
+ (line (pt 4.635 -13.835) (pt -4.635 -13.835) (width 0.05))
+ )
+ (layerContents (layerNumRef 30)
+ (line (pt -4.635 -13.835) (pt -4.635 13.835) (width 0.05))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt -3.3 13.585) (pt 3.3 13.585) (width 0.1))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt 3.3 13.585) (pt 3.3 -13.585) (width 0.1))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt 3.3 -13.585) (pt -3.3 -13.585) (width 0.1))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt -3.3 -13.585) (pt -3.3 13.585) (width 0.1))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt -3.3 12.315) (pt -2.03 13.585) (width 0.1))
+ )
+ (layerContents (layerNumRef 18)
+ (line (pt -4.385 13.585) (pt 3.3 13.585) (width 0.2))
+ )
+ (layerContents (layerNumRef 18)
+ (line (pt -3.3 -13.585) (pt 3.3 -13.585) (width 0.2))
+ )
+ )
+ (symbolDef "SN74LS273NE4" (originalName "SN74LS273NE4")
+
+ (pin (pinNum 1) (pt 0 mils 0 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -25 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 2) (pt 0 mils -100 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -125 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 3) (pt 0 mils -200 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -225 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 4) (pt 0 mils -300 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -325 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 5) (pt 0 mils -400 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -425 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 6) (pt 0 mils -500 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -525 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 7) (pt 0 mils -600 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -625 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 8) (pt 0 mils -700 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -725 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 9) (pt 0 mils -800 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -825 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 10) (pt 0 mils -900 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -925 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 11) (pt 1100 mils 0 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -25 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 12) (pt 1100 mils -100 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -125 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 13) (pt 1100 mils -200 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -225 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 14) (pt 1100 mils -300 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -325 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 15) (pt 1100 mils -400 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -425 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 16) (pt 1100 mils -500 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -525 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 17) (pt 1100 mils -600 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -625 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 18) (pt 1100 mils -700 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -725 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 19) (pt 1100 mils -800 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -825 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 20) (pt 1100 mils -900 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -925 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (line (pt 200 mils 100 mils) (pt 900 mils 100 mils) (width 6 mils))
+ (line (pt 900 mils 100 mils) (pt 900 mils -1000 mils) (width 6 mils))
+ (line (pt 900 mils -1000 mils) (pt 200 mils -1000 mils) (width 6 mils))
+ (line (pt 200 mils -1000 mils) (pt 200 mils 100 mils) (width 6 mils))
+ (attr "RefDes" "RefDes" (pt 950 mils 300 mils) (justify Left) (isVisible True) (textStyleRef "Default"))
+
+ )
+ (compDef "SN74LS273NE4" (originalName "SN74LS273NE4") (compHeader (numPins 20) (numParts 1) (refDesPrefix IC)
+ )
+ (compPin "1" (pinName "__CLR") (partNum 1) (symPinNum 1) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "2" (pinName "1Q") (partNum 1) (symPinNum 2) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "3" (pinName "1D") (partNum 1) (symPinNum 3) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "4" (pinName "2D") (partNum 1) (symPinNum 4) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "5" (pinName "2Q") (partNum 1) (symPinNum 5) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "6" (pinName "3Q") (partNum 1) (symPinNum 6) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "7" (pinName "3D") (partNum 1) (symPinNum 7) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "8" (pinName "4D") (partNum 1) (symPinNum 8) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "9" (pinName "4Q") (partNum 1) (symPinNum 9) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "10" (pinName "GND") (partNum 1) (symPinNum 10) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "20" (pinName "VCC") (partNum 1) (symPinNum 11) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "19" (pinName "8Q") (partNum 1) (symPinNum 12) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "18" (pinName "8D") (partNum 1) (symPinNum 13) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "17" (pinName "7D") (partNum 1) (symPinNum 14) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "16" (pinName "7Q") (partNum 1) (symPinNum 15) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "15" (pinName "6Q") (partNum 1) (symPinNum 16) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "14" (pinName "6D") (partNum 1) (symPinNum 17) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "13" (pinName "5D") (partNum 1) (symPinNum 18) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "12" (pinName "5Q") (partNum 1) (symPinNum 19) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "11" (pinName "CLK") (partNum 1) (symPinNum 20) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (attachedSymbol (partNum 1) (altType Normal) (symbolName "SN74LS273NE4"))
+ (attachedPattern (patternNum 1) (patternName "DIP762W55P254L2642H457Q20N")
+ (numPads 20)
+ (padPinMap
+ (padNum 1) (compPinRef "1")
+ (padNum 2) (compPinRef "2")
+ (padNum 3) (compPinRef "3")
+ (padNum 4) (compPinRef "4")
+ (padNum 5) (compPinRef "5")
+ (padNum 6) (compPinRef "6")
+ (padNum 7) (compPinRef "7")
+ (padNum 8) (compPinRef "8")
+ (padNum 9) (compPinRef "9")
+ (padNum 10) (compPinRef "10")
+ (padNum 11) (compPinRef "11")
+ (padNum 12) (compPinRef "12")
+ (padNum 13) (compPinRef "13")
+ (padNum 14) (compPinRef "14")
+ (padNum 15) (compPinRef "15")
+ (padNum 16) (compPinRef "16")
+ (padNum 17) (compPinRef "17")
+ (padNum 18) (compPinRef "18")
+ (padNum 19) (compPinRef "19")
+ (padNum 20) (compPinRef "20")
+ )
+ )
+ (attr "Mouser2 Part Number" "595-SN74LS273NE4")
+ (attr "Mouser2 Price/Stock" "https://www.mouser.com/Search/Refine.aspx?Keyword=595-SN74LS273NE4")
+ (attr "Manufacturer_Name" "Texas Instruments")
+ (attr "Manufacturer_Part_Number" "SN74LS273NE4")
+ (attr "Description" "Flip Flops Octal D-Type Flip-Flop w/Clear")
+ (attr "Datasheet Link" "http://www.ti.com/lit/ds/sdls090/sdls090.pdf")
+ (attr "Height" "4.57 mm")
+ )
+
+)
diff --git a/circuit/SN74LS273NE4/DipTrace/SN74LS273NE4.asc b/circuit/SN74LS273NE4/DipTrace/SN74LS273NE4.asc
new file mode 100644
index 0000000..3583529
--- /dev/null
+++ b/circuit/SN74LS273NE4/DipTrace/SN74LS273NE4.asc
@@ -0,0 +1,1109 @@
+(Source "DipTrace-ElementLibrary")
+ (Library
+ (Name "SN74LS273NE4")
+ (Hint "SN74LS273NE4")
+ (Subfolders
+ )
+ (Categories 0
+ )
+ (Components
+ (Component
+ (Part "SN74LS273NE4" "IC"
+ (Enabled "Y")
+ (PartType 0)
+ (PartName "SN74LS273NE4")
+ (ShowNumbers 1)
+ (Type 0)
+ (Number1 0)
+ (Number2 0)
+ (Width 60.96)
+ (Height 91.44)
+ (Value "")
+ (LockProperties "N")
+ (OriginX 0)
+ (OriginY 0)
+ (Datasheet "http://www.ti.com/lit/ds/sdls090/sdls090.pdf")
+ (ModelType 0)
+ (ModelString "")
+ (ModelBody
+ )
+ (Manufacturer "Texas Instruments")
+ (CategoryName "")
+ (CategoryIndex -1)
+ (CategoryTypes 0
+ )
+ (SubfolderIndex 0)
+ (Verification "N" "N" "N" "N" "N" "N" "N")
+ (Pins
+ (Pin 0 15.24 -0
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 0)
+ (Number 1)
+ (Length 15.24)
+ (Name "~CLR")
+ (StringNumber "1")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ (Pin 1 15.24 7.62
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 0)
+ (Number 2)
+ (Length 15.24)
+ (Name "1Q")
+ (StringNumber "2")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ (Pin 2 15.24 15.24
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 0)
+ (Number 3)
+ (Length 15.24)
+ (Name "1D")
+ (StringNumber "3")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ (Pin 3 15.24 22.86
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 0)
+ (Number 4)
+ (Length 15.24)
+ (Name "2D")
+ (StringNumber "4")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ (Pin 4 15.24 30.48
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 0)
+ (Number 5)
+ (Length 15.24)
+ (Name "2Q")
+ (StringNumber "5")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ (Pin 5 15.24 38.1
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 0)
+ (Number 6)
+ (Length 15.24)
+ (Name "3Q")
+ (StringNumber "6")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ (Pin 6 15.24 45.72
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 0)
+ (Number 7)
+ (Length 15.24)
+ (Name "3D")
+ (StringNumber "7")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ (Pin 7 15.24 53.34
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 0)
+ (Number 8)
+ (Length 15.24)
+ (Name "4D")
+ (StringNumber "8")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ (Pin 8 15.24 60.96
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 0)
+ (Number 9)
+ (Length 15.24)
+ (Name "4Q")
+ (StringNumber "9")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ (Pin 9 15.24 68.58
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 0)
+ (Number 10)
+ (Length 15.24)
+ (Name "GND")
+ (StringNumber "10")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ (Pin 10 68.58 -0
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 2)
+ (Number 11)
+ (Length 15.24)
+ (Name "VCC")
+ (StringNumber "20")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ (Pin 11 68.58 7.62
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 2)
+ (Number 12)
+ (Length 15.24)
+ (Name "8Q")
+ (StringNumber "19")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ (Pin 12 68.58 15.24
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 2)
+ (Number 13)
+ (Length 15.24)
+ (Name "8D")
+ (StringNumber "18")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ (Pin 13 68.58 22.86
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 2)
+ (Number 14)
+ (Length 15.24)
+ (Name "7D")
+ (StringNumber "17")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ (Pin 14 68.58 30.48
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 2)
+ (Number 15)
+ (Length 15.24)
+ (Name "7Q")
+ (StringNumber "16")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ (Pin 15 68.58 38.1
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 2)
+ (Number 16)
+ (Length 15.24)
+ (Name "6Q")
+ (StringNumber "15")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ (Pin 16 68.58 45.72
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 2)
+ (Number 17)
+ (Length 15.24)
+ (Name "6D")
+ (StringNumber "14")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ (Pin 17 68.58 53.34
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 2)
+ (Number 18)
+ (Length 15.24)
+ (Name "5D")
+ (StringNumber "13")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ (Pin 18 68.58 60.96
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 2)
+ (Number 19)
+ (Length 15.24)
+ (Name "5Q")
+ (StringNumber "12")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ (Pin 19 68.58 68.58
+ (Enabled "Y")
+ (Locked "N")
+ (ModelSig "")
+ (Type 0)
+ (Orientation 2)
+ (Number 20)
+ (Length 15.24)
+ (Name "CLK")
+ (StringNumber "11")
+ (ShowName "Y")
+ (PinNumXShift 0)
+ (PinNumYShift 0)
+ (PinNamexShift 0)
+ (PinNameYShift 0)
+ (ElectricType 0)
+ (NameFontSize 5)
+ (NameFontWidth -2)
+ (NameFontScale 1)
+ (SignalDelay 0)
+ )
+ )
+ (Shapes
+ (Shape 0
+ (Enabled "Y")
+ (Locked "N")
+ (VectorFont "N")
+ (FontWidth 0)
+ (FontScale 0)
+ (Orientation 0)
+ (Type 1)
+ (FontSize 0)
+ (FontColor 0)
+ (FontType 0)
+ (FontName "")
+ (Name "")
+ (Width 0.762)
+ (Points
+ (pt 15.24 -7.62)
+ (pt 68.58 -7.62)
+ )
+ )
+ (Shape 1
+ (Enabled "Y")
+ (Locked "N")
+ (VectorFont "N")
+ (FontWidth 0)
+ (FontScale 0)
+ (Orientation 0)
+ (Type 1)
+ (FontSize 0)
+ (FontColor 0)
+ (FontType 0)
+ (FontName "")
+ (Name "")
+ (Width 0.762)
+ (Points
+ (pt 68.58 76.2)
+ (pt 68.58 -7.62)
+ )
+ )
+ (Shape 2
+ (Enabled "Y")
+ (Locked "N")
+ (VectorFont "N")
+ (FontWidth 0)
+ (FontScale 0)
+ (Orientation 0)
+ (Type 1)
+ (FontSize 0)
+ (FontColor 0)
+ (FontType 0)
+ (FontName "")
+ (Name "")
+ (Width 0.762)
+ (Points
+ (pt 68.58 76.2)
+ (pt 15.24 76.2)
+ )
+ )
+ (Shape 3
+ (Enabled "Y")
+ (Locked "N")
+ (VectorFont "N")
+ (FontWidth 0)
+ (FontScale 0)
+ (Orientation 0)
+ (Type 1)
+ (FontSize 0)
+ (FontColor 0)
+ (FontType 0)
+ (FontName "")
+ (Name "")
+ (Width 0.762)
+ (Points
+ (pt 15.24 -7.62)
+ (pt 15.24 76.2)
+ )
+ )
+ )
+ (UserFields
+ (UserField "Mouser2 Part Number" "595-SN74LS273NE4" 0)
+ (UserField "Mouser2 Price/Stock" "https://www.mouser.com/Search/Refine.aspx?Keyword=595-SN74LS273NE4" 0)
+ (UserField "Manufacturer_Name" "Texas Instruments" 0)
+ (UserField "Manufacturer_Part_Number" "SN74LS273NE4" 0)
+ (UserField "Height" "4.57 mm" 0)
+ (UserField "Description" "Flip Flops Octal D-Type Flip-Flop w/Clear" 0)
+ )
+ )
+ (Pattern "DIP762W55P254L2642H457Q20N"
+ (Type 0)
+ (VariableParameter1 "N")
+ (VariableParameter2 "N")
+ (VariableParameter3 "N")
+ (VariableParameter4 "N")
+ (InternalConnections
+ )
+ (Number1 0)
+ (Number2 0)
+ (Spacing1 0)
+ (Spacing2 0)
+ (VariableParameter5 "N")
+ (Spacing3 0)
+ (LockProperties "N")
+ (PatternOrientation 0)
+ (Width 19.8)
+ (Height 81.51)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadShape 0)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (OriginX 0)
+ (OriginY 0)
+ (PadPoints
+ )
+ (Pads
+ (Pad 0 "" "" 0 0
+ (Number 0)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell 0)
+ (CustomShrink 0)
+ (PadWidth 0)
+ (PadHeight 0)
+ (PadHole 0)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 1 "1" "" -11.43 -34.29
+ (Number 1)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 2)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 2 "2" "" -11.43 -26.67
+ (Number 2)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 3 "3" "" -11.43 -19.05
+ (Number 3)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 4 "4" "" -11.43 -11.43
+ (Number 4)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 5 "5" "" -11.43 -3.81
+ (Number 5)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 6 "6" "" -11.43 3.81
+ (Number 6)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 7 "7" "" -11.43 11.43
+ (Number 7)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 8 "8" "" -11.43 19.05
+ (Number 8)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 9 "9" "" -11.43 26.67
+ (Number 9)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 10 "10" "" -11.43 34.29
+ (Number 10)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 11 "11" "" 11.43 34.29
+ (Number 11)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 12 "12" "" 11.43 26.67
+ (Number 12)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 13 "13" "" 11.43 19.05
+ (Number 13)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 14 "14" "" 11.43 11.43
+ (Number 14)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 15 "15" "" 11.43 3.81
+ (Number 15)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 16 "16" "" 11.43 -3.81
+ (Number 16)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 17 "17" "" 11.43 -11.43
+ (Number 17)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 18 "18" "" 11.43 -19.05
+ (Number 18)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 19 "19" "" 11.43 -26.67
+ (Number 19)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 20 "20" "" 11.43 -34.29
+ (Number 20)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell -1000)
+ (CustomShrink -1000)
+ (PadWidth 3.45)
+ (PadHeight 3.45)
+ (PadHole 2.25)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ (Pad 21 "" "" 0 0
+ (Number 0)
+ (Inverted "N")
+ (Locked "N")
+ (Sided "N")
+ (DisableTopMask "N" 0)
+ (DisableBottomMask "N" 0)
+ (DisableTopPaste "N" 0)
+ (DisableBottomPaste "N" 0)
+ (CustomSwell 0)
+ (CustomShrink 0)
+ (PadWidth 0)
+ (PadHeight 0)
+ (PadHole 0)
+ (PadHoleH 0)
+ (PadHoleType 0)
+ (SurfacePad "N")
+ (PadShape 0)
+ (Standard "N")
+ (Point
+ )
+ )
+ )
+ (Shapes
+ (Shape 0 "N" 0 0 0 0 0 0 0 "" "" "N" 0 0 0 0 0 0)
+ (Shape 8 "N" 1 0 0 0 0 0 0 "" "Tahoma" "Y" 4 1 -2 0 0.3 0)
+ (Point
+ (pt -0.5 -0.5)
+ (pt 0.5 -0.5)
+ )
+ (Shape 8 "N" 1 0 0 0 0 0 0 "" "Tahoma" "Y" 4 1 -2 0 0.3 0)
+ (Point
+ (pt 0.5 -0.5)
+ (pt 0.5 0.5)
+ )
+ (Shape 8 "N" 1 0 0 0 0 0 0 "" "Tahoma" "Y" 4 1 -2 0 0.3 0)
+ (Point
+ (pt 0.5 0.5)
+ (pt -0.5 0.5)
+ )
+ (Shape 8 "N" 1 0 0 0 0 0 0 "" "Tahoma" "Y" 4 1 -2 0 0.3 0)
+ (Point
+ (pt -0.5 0.5)
+ (pt -0.5 -0.5)
+ )
+ (Shape 8 "N" 1 0 0 0 0 0 0 "" "Tahoma" "Y" 4 1 -2 0 0.3 0)
+ (Point
+ (pt -0.5 -0.453)
+ (pt -0.308 -0.5)
+ )
+ (Shape 8 "N" 0 0 0 0 0 0 0 "" "Tahoma" "Y" 4 1 -2 0 0.6 0)
+ (Point
+ (pt -0.664 -0.5)
+ (pt 0.5 -0.5)
+ )
+ (Shape 8 "N" 0 0 0 0 0 0 0 "" "Tahoma" "Y" 4 1 -2 0 0.6 0)
+ (Point
+ (pt -0.5 0.5)
+ (pt 0.5 0.5)
+ )
+ (Shape 0 "N" 0 0 0 0 0 0 0 "" "" "N" 0 0 0 0 0 0)
+ )
+ (Model3D
+ (Model3DFile "SN74LS273NE4.stp")
+ (pt 0 0 0 0 0 0 1 1 1 "N" "N" 0)
+ )
+ )
+ )
+ )
+ )
+()
+
diff --git a/circuit/SN74LS273NE4/EAGLE/Readme.html b/circuit/SN74LS273NE4/EAGLE/Readme.html
new file mode 100644
index 0000000..833b90c
--- /dev/null
+++ b/circuit/SN74LS273NE4/EAGLE/Readme.html
@@ -0,0 +1,35 @@
+
+
+
+ Instructions for schematic symbols and footprints
+
+
+
+
+How to use the Schematic Symbols and PCB Footprints:
+
+First Time:
+
+The PCB Part Libraries require FREE software to convert them into EAGLE Format.
+
+To get started please visit - EAGLE.componentsearchengine.com/pcb-libraries.php
+
+Subsequent Times:
+
+Make sure 'Library Loader' is running on your PC.
+
+
+
+If not launch it from the desktop shortcut: 
+
+After downloading the Schematic Symbol & PCB Footprint zip, check in your ECAD tool. The libraries will have been loaded automatically.
+
+For further help please visit - www.samacsys.com/eagle/
+
+------------------------------------------------------------------------------------------------------------------------------------------------
+
+Alternatively, please try out our new EAGLE Plugin
+
+For help installing and using the EAGLE Plugin please visit - www.samacsys.com/eagle-library/
+
+
diff --git a/circuit/SN74LS273NE4/EAGLE/SN74LS273NE4.lbr b/circuit/SN74LS273NE4/EAGLE/SN74LS273NE4.lbr
new file mode 100644
index 0000000..cbfd46f
--- /dev/null
+++ b/circuit/SN74LS273NE4/EAGLE/SN74LS273NE4.lbr
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<Flip Flops Octal D-Type Flip-Flop w/Clear</b><p>
+<author>Created by SamacSys</author>
+
+
+<b>CASE 738–03</b><br>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+>NAME
+>VALUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+>NAME
+>VALUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<b>Flip Flops Octal D-Type Flip-Flop w/Clear</b><p>
+Source: <a href="http://www.ti.com/lit/ds/sdls090/sdls090.pdf"> Datasheet </a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/circuit/SN74LS273NE4/Easy-PC/SN74LS273NE4.epl b/circuit/SN74LS273NE4/Easy-PC/SN74LS273NE4.epl
new file mode 100644
index 0000000..86a7739
--- /dev/null
+++ b/circuit/SN74LS273NE4/Easy-PC/SN74LS273NE4.epl
@@ -0,0 +1,194 @@
+SamacSys ECAD Model
+796887/230744/2.46/20/3/Integrated Circuit
+
+DESIGNSPARK_INTERMEDIATE_ASCII
+
+(asciiHeader
+ (fileUnits MM)
+)
+(library Library_1
+ (padStyleDef "c115_h75"
+ (holeDiam 0.75)
+ (padShape (layerNumRef 1) (padShapeType Ellipse) (shapeWidth 1.15) (shapeHeight 1.15))
+ (padShape (layerNumRef 16) (padShapeType Ellipse) (shapeWidth 1.15) (shapeHeight 1.15))
+ )
+ (padStyleDef "s115_h75"
+ (holeDiam 0.75)
+ (padShape (layerNumRef 1) (padShapeType Rect) (shapeWidth 1.15) (shapeHeight 1.15))
+ (padShape (layerNumRef 16) (padShapeType Rect) (shapeWidth 1.15) (shapeHeight 1.15))
+ )
+ (textStyleDef "Default"
+ (font
+ (fontType Stroke)
+ (fontFace "Helvetica")
+ (fontHeight 50 mils)
+ (strokeWidth 5 mils)
+ )
+ )
+ (patternDef "DIP762W55P254L2642H457Q20N" (originalName "DIP762W55P254L2642H457Q20N")
+ (multiLayer
+ (pad (padNum 1) (padStyleRef s115_h75) (pt -3.81, 11.43) (rotation 90))
+ (pad (padNum 2) (padStyleRef c115_h75) (pt -3.81, 8.89) (rotation 90))
+ (pad (padNum 3) (padStyleRef c115_h75) (pt -3.81, 6.35) (rotation 90))
+ (pad (padNum 4) (padStyleRef c115_h75) (pt -3.81, 3.81) (rotation 90))
+ (pad (padNum 5) (padStyleRef c115_h75) (pt -3.81, 1.27) (rotation 90))
+ (pad (padNum 6) (padStyleRef c115_h75) (pt -3.81, -1.27) (rotation 90))
+ (pad (padNum 7) (padStyleRef c115_h75) (pt -3.81, -3.81) (rotation 90))
+ (pad (padNum 8) (padStyleRef c115_h75) (pt -3.81, -6.35) (rotation 90))
+ (pad (padNum 9) (padStyleRef c115_h75) (pt -3.81, -8.89) (rotation 90))
+ (pad (padNum 10) (padStyleRef c115_h75) (pt -3.81, -11.43) (rotation 90))
+ (pad (padNum 11) (padStyleRef c115_h75) (pt 3.81, -11.43) (rotation 90))
+ (pad (padNum 12) (padStyleRef c115_h75) (pt 3.81, -8.89) (rotation 90))
+ (pad (padNum 13) (padStyleRef c115_h75) (pt 3.81, -6.35) (rotation 90))
+ (pad (padNum 14) (padStyleRef c115_h75) (pt 3.81, -3.81) (rotation 90))
+ (pad (padNum 15) (padStyleRef c115_h75) (pt 3.81, -1.27) (rotation 90))
+ (pad (padNum 16) (padStyleRef c115_h75) (pt 3.81, 1.27) (rotation 90))
+ (pad (padNum 17) (padStyleRef c115_h75) (pt 3.81, 3.81) (rotation 90))
+ (pad (padNum 18) (padStyleRef c115_h75) (pt 3.81, 6.35) (rotation 90))
+ (pad (padNum 19) (padStyleRef c115_h75) (pt 3.81, 8.89) (rotation 90))
+ (pad (padNum 20) (padStyleRef c115_h75) (pt 3.81, 11.43) (rotation 90))
+ )
+ (layerContents (layerNumRef 18)
+ (attr "RefDes" "RefDes" (pt 0, 0) (textStyleRef "Default") (isVisible True))
+ )
+ (layerContents (layerNumRef 30)
+ (line (pt -4.635 13.835) (pt 4.635 13.835) (width 0.05))
+ )
+ (layerContents (layerNumRef 30)
+ (line (pt 4.635 13.835) (pt 4.635 -13.835) (width 0.05))
+ )
+ (layerContents (layerNumRef 30)
+ (line (pt 4.635 -13.835) (pt -4.635 -13.835) (width 0.05))
+ )
+ (layerContents (layerNumRef 30)
+ (line (pt -4.635 -13.835) (pt -4.635 13.835) (width 0.05))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt -3.3 13.585) (pt 3.3 13.585) (width 0.1))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt 3.3 13.585) (pt 3.3 -13.585) (width 0.1))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt 3.3 -13.585) (pt -3.3 -13.585) (width 0.1))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt -3.3 -13.585) (pt -3.3 13.585) (width 0.1))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt -3.3 12.315) (pt -2.03 13.585) (width 0.1))
+ )
+ (layerContents (layerNumRef 18)
+ (line (pt -4.385 13.585) (pt 3.3 13.585) (width 0.2))
+ )
+ (layerContents (layerNumRef 18)
+ (line (pt -3.3 -13.585) (pt 3.3 -13.585) (width 0.2))
+ )
+ )
+ (symbolDef "SN74LS273NE4" (originalName "SN74LS273NE4")
+
+ (pin (pinNum 1) (pt 0 mils 0 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -25 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 2) (pt 0 mils -100 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -125 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 3) (pt 0 mils -200 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -225 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 4) (pt 0 mils -300 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -325 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 5) (pt 0 mils -400 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -425 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 6) (pt 0 mils -500 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -525 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 7) (pt 0 mils -600 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -625 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 8) (pt 0 mils -700 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -725 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 9) (pt 0 mils -800 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -825 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 10) (pt 0 mils -900 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -925 mils) (rotation 0]) (justify "Left") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 11) (pt 1100 mils 0 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -25 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 12) (pt 1100 mils -100 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -125 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 13) (pt 1100 mils -200 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -225 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 14) (pt 1100 mils -300 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -325 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 15) (pt 1100 mils -400 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -425 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 16) (pt 1100 mils -500 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -525 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 17) (pt 1100 mils -600 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -625 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 18) (pt 1100 mils -700 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -725 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 19) (pt 1100 mils -800 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -825 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (pin (pinNum 20) (pt 1100 mils -900 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -925 mils) (rotation 0]) (justify "Right") (textStyleRef "Default"))
+ ))
+ (line (pt 200 mils 100 mils) (pt 900 mils 100 mils) (width 6 mils))
+ (line (pt 900 mils 100 mils) (pt 900 mils -1000 mils) (width 6 mils))
+ (line (pt 900 mils -1000 mils) (pt 200 mils -1000 mils) (width 6 mils))
+ (line (pt 200 mils -1000 mils) (pt 200 mils 100 mils) (width 6 mils))
+ (attr "RefDes" "RefDes" (pt 950 mils 300 mils) (justify Left) (isVisible True) (textStyleRef "Default"))
+
+ )
+ (compDef "SN74LS273NE4" (originalName "SN74LS273NE4") (compHeader (numPins 20) (numParts 1) (refDesPrefix IC)
+ )
+ (compPin "1" (pinName "__CLR") (partNum 1) (symPinNum 1) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "2" (pinName "1Q") (partNum 1) (symPinNum 2) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "3" (pinName "1D") (partNum 1) (symPinNum 3) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "4" (pinName "2D") (partNum 1) (symPinNum 4) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "5" (pinName "2Q") (partNum 1) (symPinNum 5) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "6" (pinName "3Q") (partNum 1) (symPinNum 6) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "7" (pinName "3D") (partNum 1) (symPinNum 7) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "8" (pinName "4D") (partNum 1) (symPinNum 8) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "9" (pinName "4Q") (partNum 1) (symPinNum 9) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "10" (pinName "GND") (partNum 1) (symPinNum 10) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "20" (pinName "VCC") (partNum 1) (symPinNum 11) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "19" (pinName "8Q") (partNum 1) (symPinNum 12) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "18" (pinName "8D") (partNum 1) (symPinNum 13) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "17" (pinName "7D") (partNum 1) (symPinNum 14) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "16" (pinName "7Q") (partNum 1) (symPinNum 15) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "15" (pinName "6Q") (partNum 1) (symPinNum 16) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "14" (pinName "6D") (partNum 1) (symPinNum 17) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "13" (pinName "5D") (partNum 1) (symPinNum 18) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "12" (pinName "5Q") (partNum 1) (symPinNum 19) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (compPin "11" (pinName "CLK") (partNum 1) (symPinNum 20) (gateEq 0) (pinEq 0) (pinType Bidirectional))
+ (attachedSymbol (partNum 1) (altType Normal) (symbolName "SN74LS273NE4"))
+ (attachedPattern (patternNum 1) (patternName "DIP762W55P254L2642H457Q20N")
+ (numPads 20)
+ (padPinMap
+ (padNum 1) (compPinRef "1")
+ (padNum 2) (compPinRef "2")
+ (padNum 3) (compPinRef "3")
+ (padNum 4) (compPinRef "4")
+ (padNum 5) (compPinRef "5")
+ (padNum 6) (compPinRef "6")
+ (padNum 7) (compPinRef "7")
+ (padNum 8) (compPinRef "8")
+ (padNum 9) (compPinRef "9")
+ (padNum 10) (compPinRef "10")
+ (padNum 11) (compPinRef "11")
+ (padNum 12) (compPinRef "12")
+ (padNum 13) (compPinRef "13")
+ (padNum 14) (compPinRef "14")
+ (padNum 15) (compPinRef "15")
+ (padNum 16) (compPinRef "16")
+ (padNum 17) (compPinRef "17")
+ (padNum 18) (compPinRef "18")
+ (padNum 19) (compPinRef "19")
+ (padNum 20) (compPinRef "20")
+ )
+ )
+ (attr "Mouser2 Part Number" "595-SN74LS273NE4")
+ (attr "Mouser2 Price/Stock" "https://www.mouser.com/Search/Refine.aspx?Keyword=595-SN74LS273NE4")
+ (attr "Manufacturer_Name" "Texas Instruments")
+ (attr "Manufacturer_Part_Number" "SN74LS273NE4")
+ (attr "Description" "Flip Flops Octal D-Type Flip-Flop w/Clear")
+ (attr "Datasheet Link" "http://www.ti.com/lit/ds/sdls090/sdls090.pdf")
+ (attr "Height" "4.57 mm")
+ )
+
+)
diff --git a/circuit/SN74LS273NE4/EasyEDA/Readme.html b/circuit/SN74LS273NE4/EasyEDA/Readme.html
new file mode 100644
index 0000000..ef35f7d
--- /dev/null
+++ b/circuit/SN74LS273NE4/EasyEDA/Readme.html
@@ -0,0 +1,11 @@
+
+
+
+ Eagle
+
+
+ Please first install the Library Loader application from: http://componentsearchengine.com/pcb-libraries.php
+ If Library Loader is already installed please make sure it's running by launching it from the desktop shortcut.
+ For help loading the SamacSys libraries into EasyEDA please Click Here: http://www.samacsys.com/easyeda-instructions/
+
+
diff --git a/circuit/SN74LS273NE4/EasyEDA/SN74LS273NE4.lbr b/circuit/SN74LS273NE4/EasyEDA/SN74LS273NE4.lbr
new file mode 100644
index 0000000..cbfd46f
--- /dev/null
+++ b/circuit/SN74LS273NE4/EasyEDA/SN74LS273NE4.lbr
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<Flip Flops Octal D-Type Flip-Flop w/Clear</b><p>
+<author>Created by SamacSys</author>
+
+
+<b>CASE 738–03</b><br>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+>NAME
+>VALUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+>NAME
+>VALUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<b>Flip Flops Octal D-Type Flip-Flop w/Clear</b><p>
+Source: <a href="http://www.ti.com/lit/ds/sdls090/sdls090.pdf"> Datasheet </a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/circuit/SN74LS273NE4/How_To_Use_Models.pdf b/circuit/SN74LS273NE4/How_To_Use_Models.pdf
new file mode 100644
index 0000000..27c60ed
Binary files /dev/null and b/circuit/SN74LS273NE4/How_To_Use_Models.pdf differ
diff --git a/circuit/SN74LS273NE4/KiCad/DIP762W55P254L2642H457Q20N.kicad_mod b/circuit/SN74LS273NE4/KiCad/DIP762W55P254L2642H457Q20N.kicad_mod
new file mode 100644
index 0000000..811a18b
--- /dev/null
+++ b/circuit/SN74LS273NE4/KiCad/DIP762W55P254L2642H457Q20N.kicad_mod
@@ -0,0 +1,49 @@
+(module "DIP762W55P254L2642H457Q20N" (layer F.Cu)
+ (descr "CASE 738–03")
+ (tags "Integrated Circuit")
+ (fp_text reference IC** (at 0 0) (layer F.SilkS)
+ (effects (font (size 1.27 1.27) (thickness 0.254)))
+ )
+ (fp_text user %R (at 0 0) (layer F.Fab)
+ (effects (font (size 1.27 1.27) (thickness 0.254)))
+ )
+ (fp_text value "DIP762W55P254L2642H457Q20N" (at 0 0) (layer F.SilkS) hide
+ (effects (font (size 1.27 1.27) (thickness 0.254)))
+ )
+ (fp_line (start -4.635 -13.835) (end 4.635 -13.835) (layer F.CrtYd) (width 0.05))
+ (fp_line (start 4.635 -13.835) (end 4.635 13.835) (layer F.CrtYd) (width 0.05))
+ (fp_line (start 4.635 13.835) (end -4.635 13.835) (layer F.CrtYd) (width 0.05))
+ (fp_line (start -4.635 13.835) (end -4.635 -13.835) (layer F.CrtYd) (width 0.05))
+ (fp_line (start -3.3 -13.585) (end 3.3 -13.585) (layer F.Fab) (width 0.1))
+ (fp_line (start 3.3 -13.585) (end 3.3 13.585) (layer F.Fab) (width 0.1))
+ (fp_line (start 3.3 13.585) (end -3.3 13.585) (layer F.Fab) (width 0.1))
+ (fp_line (start -3.3 13.585) (end -3.3 -13.585) (layer F.Fab) (width 0.1))
+ (fp_line (start -3.3 -12.315) (end -2.03 -13.585) (layer F.Fab) (width 0.1))
+ (fp_line (start -4.385 -13.585) (end 3.3 -13.585) (layer F.SilkS) (width 0.2))
+ (fp_line (start -3.3 13.585) (end 3.3 13.585) (layer F.SilkS) (width 0.2))
+ (pad 1 thru_hole rect (at -3.81 -11.43) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (pad 2 thru_hole circle (at -3.81 -8.89) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (pad 3 thru_hole circle (at -3.81 -6.35) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (pad 4 thru_hole circle (at -3.81 -3.81) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (pad 5 thru_hole circle (at -3.81 -1.27) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (pad 6 thru_hole circle (at -3.81 1.27) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (pad 7 thru_hole circle (at -3.81 3.81) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (pad 8 thru_hole circle (at -3.81 6.35) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (pad 9 thru_hole circle (at -3.81 8.89) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (pad 10 thru_hole circle (at -3.81 11.43) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (pad 11 thru_hole circle (at 3.81 11.43) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (pad 12 thru_hole circle (at 3.81 8.89) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (pad 13 thru_hole circle (at 3.81 6.35) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (pad 14 thru_hole circle (at 3.81 3.81) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (pad 15 thru_hole circle (at 3.81 1.27) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (pad 16 thru_hole circle (at 3.81 -1.27) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (pad 17 thru_hole circle (at 3.81 -3.81) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (pad 18 thru_hole circle (at 3.81 -6.35) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (pad 19 thru_hole circle (at 3.81 -8.89) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (pad 20 thru_hole circle (at 3.81 -11.43) (size 1.15 1.15) (drill 0.75) (layers *.Cu *.Mask))
+ (model SN74LS273NE4.stp
+ (at (xyz 0 0 0))
+ (scale (xyz 1 1 1))
+ (rotate (xyz 0 0 0))
+ )
+)
diff --git a/circuit/SN74LS273NE4/KiCad/SN74LS273NE4.dcm b/circuit/SN74LS273NE4/KiCad/SN74LS273NE4.dcm
new file mode 100644
index 0000000..c1ecbaa
--- /dev/null
+++ b/circuit/SN74LS273NE4/KiCad/SN74LS273NE4.dcm
@@ -0,0 +1,9 @@
+EESchema-DOCLIB Version 2.0
+#
+$CMP SN74LS273NE4
+D Flip Flops Octal D-Type Flip-Flop w/Clear
+K
+F http://www.ti.com/lit/ds/sdls090/sdls090.pdf
+$ENDCMP
+#
+#End Doc Library
diff --git a/circuit/SN74LS273NE4/KiCad/SN74LS273NE4.lib b/circuit/SN74LS273NE4/KiCad/SN74LS273NE4.lib
new file mode 100644
index 0000000..23c6dbd
--- /dev/null
+++ b/circuit/SN74LS273NE4/KiCad/SN74LS273NE4.lib
@@ -0,0 +1,41 @@
+EESchema-LIBRARY Version 2.3
+#encoding utf-8
+#SamacSys ECAD Model SN74LS273NE4
+#/796887/230744/2.46/20/3/Integrated Circuit
+DEF SN74LS273NE4 IC 0 30 Y Y 1 F N
+F0 "IC" 950 300 50 H V L CNN
+F1 "SN74LS273NE4" 950 200 50 H V L CNN
+F2 "DIP762W55P254L2642H457Q20N" 950 100 50 H I L CNN
+F3 "http://www.ti.com/lit/ds/sdls090/sdls090.pdf" 950 0 50 H I L CNN
+F4 "Flip Flops Octal D-Type Flip-Flop w/Clear" 950 -100 50 H I L CNN "Description"
+F5 "4.57" 950 -200 50 H I L CNN "Height"
+F6 "595-SN74LS273NE4" 950 -300 50 H I L CNN "Mouser2 Part Number"
+F7 "https://www.mouser.com/Search/Refine.aspx?Keyword=595-SN74LS273NE4" 950 -400 50 H I L CNN "Mouser2 Price/Stock"
+F8 "Texas Instruments" 950 -500 50 H I L CNN "Manufacturer_Name"
+F9 "SN74LS273NE4" 950 -600 50 H I L CNN "Manufacturer_Part_Number"
+DRAW
+X ~CLR 1 0 0 200 R 50 50 0 0 I
+X 1Q 2 0 -100 200 R 50 50 0 0 O
+X 1D 3 0 -200 200 R 50 50 0 0 I
+X 2D 4 0 -300 200 R 50 50 0 0 I
+X 2Q 5 0 -400 200 R 50 50 0 0 O
+X 3Q 6 0 -500 200 R 50 50 0 0 O
+X 3D 7 0 -600 200 R 50 50 0 0 I
+X 4D 8 0 -700 200 R 50 50 0 0 I
+X 4Q 9 0 -800 200 R 50 50 0 0 O
+X GND 10 0 -900 200 R 50 50 0 0 W
+X VCC 20 1100 0 200 L 50 50 0 0 W
+X 8Q 19 1100 -100 200 L 50 50 0 0 O
+X 8D 18 1100 -200 200 L 50 50 0 0 I
+X 7D 17 1100 -300 200 L 50 50 0 0 I
+X 7Q 16 1100 -400 200 L 50 50 0 0 O
+X 6Q 15 1100 -500 200 L 50 50 0 0 O
+X 6D 14 1100 -600 200 L 50 50 0 0 I
+X 5D 13 1100 -700 200 L 50 50 0 0 I
+X 5Q 12 1100 -800 200 L 50 50 0 0 O
+X CLK 11 1100 -900 200 L 50 50 0 0 I
+P 5 0 1 6 200 100 900 100 900 -1000 200 -1000 200 100 N
+ENDDRAW
+ENDDEF
+#
+#End Library
diff --git a/circuit/SN74LS273NE4/KiCad/SN74LS273NE4.mod b/circuit/SN74LS273NE4/KiCad/SN74LS273NE4.mod
new file mode 100644
index 0000000..2ec39c4
--- /dev/null
+++ b/circuit/SN74LS273NE4/KiCad/SN74LS273NE4.mod
@@ -0,0 +1,170 @@
+PCBNEW-LibModule-V1 2020-04-22 17:25:09
+# encoding utf-8
+Units mm
+$INDEX
+DIP762W55P254L2642H457Q20N
+$EndINDEX
+$MODULE DIP762W55P254L2642H457Q20N
+Po 0 0 0 15 5ea06fe5 00000000 ~~
+Li DIP762W55P254L2642H457Q20N
+Cd CASE 738–03
+Kw Integrated Circuit
+Sc 0
+At STD
+AR
+Op 0 0 0
+T0 0 0 1.27 1.27 0 0.254 N V 21 N "IC**"
+T1 0 0 1.27 1.27 0 0.254 N I 21 N "DIP762W55P254L2642H457Q20N"
+DS -4.635 -13.835 4.635 -13.835 0.05 24
+DS 4.635 -13.835 4.635 13.835 0.05 24
+DS 4.635 13.835 -4.635 13.835 0.05 24
+DS -4.635 13.835 -4.635 -13.835 0.05 24
+DS -3.3 -13.585 3.3 -13.585 0.1 24
+DS 3.3 -13.585 3.3 13.585 0.1 24
+DS 3.3 13.585 -3.3 13.585 0.1 24
+DS -3.3 13.585 -3.3 -13.585 0.1 24
+DS -3.3 -12.315 -2.03 -13.585 0.1 24
+DS -4.385 -13.585 3.3 -13.585 0.2 21
+DS -3.3 13.585 3.3 13.585 0.2 21
+$PAD
+Po -3.81 -11.43
+Sh "1" R 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$PAD
+Po -3.81 -8.89
+Sh "2" C 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$PAD
+Po -3.81 -6.35
+Sh "3" C 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$PAD
+Po -3.81 -3.81
+Sh "4" C 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$PAD
+Po -3.81 -1.27
+Sh "5" C 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$PAD
+Po -3.81 1.27
+Sh "6" C 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$PAD
+Po -3.81 3.81
+Sh "7" C 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$PAD
+Po -3.81 6.35
+Sh "8" C 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$PAD
+Po -3.81 8.89
+Sh "9" C 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$PAD
+Po -3.81 11.43
+Sh "10" C 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$PAD
+Po 3.81 11.43
+Sh "11" C 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$PAD
+Po 3.81 8.89
+Sh "12" C 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$PAD
+Po 3.81 6.35
+Sh "13" C 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$PAD
+Po 3.81 3.81
+Sh "14" C 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$PAD
+Po 3.81 1.27
+Sh "15" C 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$PAD
+Po 3.81 -1.27
+Sh "16" C 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$PAD
+Po 3.81 -3.81
+Sh "17" C 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$PAD
+Po 3.81 -6.35
+Sh "18" C 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$PAD
+Po 3.81 -8.89
+Sh "19" C 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$PAD
+Po 3.81 -11.43
+Sh "20" C 1.15 1.15 0 0 900
+Dr 0.75 0 0
+At STD N 00E0FFFF
+Ne 0 ""
+$EndPAD
+$EndMODULE DIP762W55P254L2642H457Q20N
+$EndLIBRARY
diff --git a/circuit/SN74LS273NE4/KiCad/SN74LS273NE4.zip b/circuit/SN74LS273NE4/KiCad/SN74LS273NE4.zip
new file mode 100644
index 0000000..e7d3568
Binary files /dev/null and b/circuit/SN74LS273NE4/KiCad/SN74LS273NE4.zip differ
diff --git a/circuit/SN74LS273NE4/OrCAD_Allegro16/BuildFootprint.bat b/circuit/SN74LS273NE4/OrCAD_Allegro16/BuildFootprint.bat
new file mode 100644
index 0000000..0941c9b
--- /dev/null
+++ b/circuit/SN74LS273NE4/OrCAD_Allegro16/BuildFootprint.bat
@@ -0,0 +1,3 @@
+pad_designer -s "padstack1.scr"
+pad_designer -s "padstack2.scr"
+allegro -s "footprint.scr"
diff --git a/circuit/SN74LS273NE4/OrCAD_Allegro16/EDI2CAP.CFG b/circuit/SN74LS273NE4/OrCAD_Allegro16/EDI2CAP.CFG
new file mode 100644
index 0000000..fb91cad
--- /dev/null
+++ b/circuit/SN74LS273NE4/OrCAD_Allegro16/EDI2CAP.CFG
@@ -0,0 +1,35 @@
+;>------- Configuration parameters: -------<
+;>------Check EDIF2CAP.PDF for details ----<
+
+[OrCAD Writer]
+
+SuppressWarnings = 0
+ConvertOnlyLibs = 0
+UnitMeasurement = default
+PinToPin = 0
+Grid = 0
+EnableOffgridObjects = 0
+GenerateIniFile = 1
+OrcadConventions = 1
+UseDesignatorsForPackaging = 1
+DesignatorsEndOnLetters = 0
+DesignatorsSameInHierarchy = 1
+GeneratePinNumbers = 0
+GeneratePortSymbols = 1
+GenerateOffPageConnectors = 0
+GenerationVisible = 1
+CaptureLibsWithUserPackages = ""
+SystemNetNamePrefix = ""
+BackgroundTextScale = 0.8
+DefaultNetNameScale = 0.3
+StandardPageSize = 0
+EliminatePageText = 0
+SmashTitleBlock = 0
+PinDisplayStyle = orcad
+TopView = ""
+ComponentsMode = 0
+ReplacePartWithNoPinsWithTitleBlock = 0
+ChangeBusBaseThatEndsOnDigit = 0
+ProcessBackAnnotation = 1
+
+[Mapper]
diff --git a/circuit/SN74LS273NE4/OrCAD_Allegro16/SN74LS273NE4.edf b/circuit/SN74LS273NE4/OrCAD_Allegro16/SN74LS273NE4.edf
new file mode 100644
index 0000000..d8a8f8a
--- /dev/null
+++ b/circuit/SN74LS273NE4/OrCAD_Allegro16/SN74LS273NE4.edf
@@ -0,0 +1,292 @@
+
+(EDIF
+ (rename &SN74LS273NE4 "SN74LS273NE4")
+ (EDIFVersion 2 0 0)
+ (EDIFLevel 0)
+ (keywordMap (keywordLevel 0))
+ (status
+ (written
+ (timestamp 2020 04 22 17 25 09)
+ (dataOrigin "796887/230744/2.46/20/3/Integrated Circuit")
+ (program "SamacSys ECAD Model SN74LS273NE4"
+ (version "2.1"))))
+ (library
+ (rename &SN74LS273NE4 "SN74LS273NE4")
+ (EDIFLevel 0)
+ (technology
+ (numberDefinition (scale 1 (e 254 -6) (unit DISTANCE)))
+ (userData GRIDRESOLUTION (integer 50 50))
+ (figureGroup DEFAULT (pathWidth 10) (textHeight 100))
+ (figureGroup PROPERTY (pathWidth 10) (textHeight 90))
+ (figureGroup PINNUMBER (pathWidth 10) (textHeight 90))
+ (figureGroup PINNAME (pathWidth 10) (textHeight 90))
+ (figureGroup COMMENT (pathWidth 10) (textHeight 90))
+ (figureGroup PIN (pathWidth 10) (textHeight 90))
+ (figureGroup GRAPHIC (pathWidth 10) (textHeight 100))
+ )
+ (cell
+ (rename &SN74LS273NE4 "SN74LS273NE4")
+ (cellType GENERIC)
+ (view
+ (rename NORMAL "Normal")
+ (viewType SCHEMATIC)
+ (interface
+ (designator "IC")
+ (property (rename PACKAGENAME "PackageName") (string "SN74LS273NE4"))
+ (property (rename ISHETEROGENEOUS "IsHeterogeneous") (string "False"))
+ (property (rename DEVICESINVIEW "DevicesInView") (string "1"))
+ (property (rename DEVICESINPACKAGE "DevicesInPackage") (string "1"))
+ (property (rename DEVICEDESIGNATOR "DeviceDesignator") (string "A"))
+ (property (rename DEVICENUMBERING "DeviceNumbering") (string "Alpha"))
+ (property (rename PCB_32_FOOTPRINT "PCB Footprint") (string "DIP762W55P254L2642H457Q20N"))
+ (property (rename &Mouser2_Part_Number "Mouser2 Part Number") (string "595-SN74LS273NE4"))
+ (property (rename &Mouser2_Price_Stock "Mouser2 Price/Stock") (string "https://www.mouser.com/Search/Refine.aspx?Keyword=595-SN74LS273NE4"))
+ (property (rename &Manufacturer_Name "Manufacturer_Name") (string "Texas Instruments"))
+ (property (rename &Manufacturer_Part_Number "Manufacturer_Part_Number") (string "SN74LS273NE4"))
+ (property (rename &Description "Description") (string "Flip Flops Octal D-Type Flip-Flop w/Clear"))
+ (property (rename &Datasheet_Link "Datasheet Link") (string "http://www.ti.com/lit/ds/sdls090/sdls090.pdf"))
+ (property (rename &Height "Height") (string "4.57 mm"))
+ (property (rename &_60__32_VALUE_32__62_ "Value") (string "SN74LS273NE4"))
+ (property (rename VALUE "Value") (string "Value"))
+ (port
+ (rename &_CLR "C\L\R\")
+ (designator "1")
+ (property (rename ORDER "Order") (string "0") (owner "OrCAD"))
+ )
+ (port
+ (rename &1Q "1Q")
+ (designator "2")
+ (property (rename ORDER "Order") (string "1") (owner "OrCAD"))
+ )
+ (port
+ (rename &1D "1D")
+ (designator "3")
+ (property (rename ORDER "Order") (string "2") (owner "OrCAD"))
+ )
+ (port
+ (rename &2D "2D")
+ (designator "4")
+ (property (rename ORDER "Order") (string "3") (owner "OrCAD"))
+ )
+ (port
+ (rename &2Q "2Q")
+ (designator "5")
+ (property (rename ORDER "Order") (string "4") (owner "OrCAD"))
+ )
+ (port
+ (rename &3Q "3Q")
+ (designator "6")
+ (property (rename ORDER "Order") (string "5") (owner "OrCAD"))
+ )
+ (port
+ (rename &3D "3D")
+ (designator "7")
+ (property (rename ORDER "Order") (string "6") (owner "OrCAD"))
+ )
+ (port
+ (rename &4D "4D")
+ (designator "8")
+ (property (rename ORDER "Order") (string "7") (owner "OrCAD"))
+ )
+ (port
+ (rename &4Q "4Q")
+ (designator "9")
+ (property (rename ORDER "Order") (string "8") (owner "OrCAD"))
+ )
+ (port
+ (rename &GND "GND")
+ (designator "10")
+ (property (rename ORDER "Order") (string "9") (owner "OrCAD"))
+ )
+ (port
+ (rename &CLK "CLK")
+ (designator "11")
+ (property (rename ORDER "Order") (string "10") (owner "OrCAD"))
+ )
+ (port
+ (rename &5Q "5Q")
+ (designator "12")
+ (property (rename ORDER "Order") (string "11") (owner "OrCAD"))
+ )
+ (port
+ (rename &5D "5D")
+ (designator "13")
+ (property (rename ORDER "Order") (string "12") (owner "OrCAD"))
+ )
+ (port
+ (rename &6D "6D")
+ (designator "14")
+ (property (rename ORDER "Order") (string "13") (owner "OrCAD"))
+ )
+ (port
+ (rename &6Q "6Q")
+ (designator "15")
+ (property (rename ORDER "Order") (string "14") (owner "OrCAD"))
+ )
+ (port
+ (rename &7Q "7Q")
+ (designator "16")
+ (property (rename ORDER "Order") (string "15") (owner "OrCAD"))
+ )
+ (port
+ (rename &7D "7D")
+ (designator "17")
+ (property (rename ORDER "Order") (string "16") (owner "OrCAD"))
+ )
+ (port
+ (rename &8D "8D")
+ (designator "18")
+ (property (rename ORDER "Order") (string "17") (owner "OrCAD"))
+ )
+ (port
+ (rename &8Q "8Q")
+ (designator "19")
+ (property (rename ORDER "Order") (string "18") (owner "OrCAD"))
+ )
+ (port
+ (rename &VCC "VCC")
+ (designator "20")
+ (property (rename ORDER "Order") (string "19") (owner "OrCAD"))
+ )
+ (symbol
+ (portImplementation
+ (name &_CLR (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt -200 -100) (pt 0 -100))))
+ (connectLocation (figure GRAPHIC (dot (pt -200 -100))))
+ )
+ (portImplementation
+ (name &1Q (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt -200 -200) (pt 0 -200))))
+ (connectLocation (figure GRAPHIC (dot (pt -200 -200))))
+ )
+ (portImplementation
+ (name &1D (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt -200 -300) (pt 0 -300))))
+ (connectLocation (figure GRAPHIC (dot (pt -200 -300))))
+ )
+ (portImplementation
+ (name &2D (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt -200 -400) (pt 0 -400))))
+ (connectLocation (figure GRAPHIC (dot (pt -200 -400))))
+ )
+ (portImplementation
+ (name &2Q (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt -200 -500) (pt 0 -500))))
+ (connectLocation (figure GRAPHIC (dot (pt -200 -500))))
+ )
+ (portImplementation
+ (name &3Q (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt -200 -600) (pt 0 -600))))
+ (connectLocation (figure GRAPHIC (dot (pt -200 -600))))
+ )
+ (portImplementation
+ (name &3D (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt -200 -700) (pt 0 -700))))
+ (connectLocation (figure GRAPHIC (dot (pt -200 -700))))
+ )
+ (portImplementation
+ (name &4D (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt -200 -800) (pt 0 -800))))
+ (connectLocation (figure GRAPHIC (dot (pt -200 -800))))
+ )
+ (portImplementation
+ (name &4Q (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt -200 -900) (pt 0 -900))))
+ (connectLocation (figure GRAPHIC (dot (pt -200 -900))))
+ )
+ (portImplementation
+ (name &GND (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt -200 -1000) (pt 0 -1000))))
+ (connectLocation (figure GRAPHIC (dot (pt -200 -1000))))
+ )
+ (portImplementation
+ (name &VCC (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt 700 -100) (pt 900 -100))))
+ (connectLocation (figure GRAPHIC (dot (pt 900 -100))))
+ )
+ (portImplementation
+ (name &8Q (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt 700 -200) (pt 900 -200))))
+ (connectLocation (figure GRAPHIC (dot (pt 900 -200))))
+ )
+ (portImplementation
+ (name &8D (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt 700 -300) (pt 900 -300))))
+ (connectLocation (figure GRAPHIC (dot (pt 900 -300))))
+ )
+ (portImplementation
+ (name &7D (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt 700 -400) (pt 900 -400))))
+ (connectLocation (figure GRAPHIC (dot (pt 900 -400))))
+ )
+ (portImplementation
+ (name &7Q (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt 700 -500) (pt 900 -500))))
+ (connectLocation (figure GRAPHIC (dot (pt 900 -500))))
+ )
+ (portImplementation
+ (name &6Q (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt 700 -600) (pt 900 -600))))
+ (connectLocation (figure GRAPHIC (dot (pt 900 -600))))
+ )
+ (portImplementation
+ (name &6D (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt 700 -700) (pt 900 -700))))
+ (connectLocation (figure GRAPHIC (dot (pt 900 -700))))
+ )
+ (portImplementation
+ (name &5D (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt 700 -800) (pt 900 -800))))
+ (connectLocation (figure GRAPHIC (dot (pt 900 -800))))
+ )
+ (portImplementation
+ (name &5Q (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt 700 -900) (pt 900 -900))))
+ (connectLocation (figure GRAPHIC (dot (pt 900 -900))))
+ )
+ (portImplementation
+ (name &CLK (display PINNAME))
+ (keywordDisplay DESIGNATOR (display PINNUMBER))
+ (figure PIN (path (pointList (pt 700 -1000) (pt 900 -1000))))
+ (connectLocation (figure GRAPHIC (dot (pt 900 -1000))))
+ )
+ (figure GRAPHIC
+ (figureGroupOverride GRAPHIC
+ (pathWidth 10))
+ (path
+ (pointList
+ (pt 0 0)
+ (pt 700 0)
+ (pt 700 -1100)
+ (pt 0 -1100)
+ (pt 0 0)
+ )
+ )
+ )
+ (keywordDisplay DESIGNATOR (display PROPERTY (justify LOWERLEFT) (orientation R0) (origin (pt 750 130))))
+ (propertyDisplay &_60__32_VALUE_32__62_ (display PROPERTY (justify LOWERLEFT) (orientation R0) (origin (pt 750 30))))
+ )
+ )
+ )
+ )
+ )
+)
diff --git a/circuit/SN74LS273NE4/OrCAD_Allegro16/footprint.scr b/circuit/SN74LS273NE4/OrCAD_Allegro16/footprint.scr
new file mode 100644
index 0000000..14888e5
--- /dev/null
+++ b/circuit/SN74LS273NE4/OrCAD_Allegro16/footprint.scr
@@ -0,0 +1,526 @@
+# **************************New Pattern starts here************************
+Version 14#
+setwindow pcb
+new
+newdrawfillin "DIP762W55P254L2642H457Q20N.dra" "Package Symbol"
+prmed
+setwindow Form.prmedit
+FORM prmedit design
+FORM prmedit type Package
+FORM prmedit units Millimeter
+FORM prmedit size Other
+FORM prmedit accuracy 2
+FORM prmedit width 2711
+FORM prmedit height 2436
+FORM prmedit apply
+FORM prmedit x -1095.5
+FORM prmedit y -1245.5
+FORM prmedit apply
+FORM prmedit lock_mode Line
+FORM prmedit lock_direction Off
+FORM prmedit apply
+FORM prmedit done
+setwindow pcb
+Status
+setwindow Form.Status
+FORM status lock_direction Off
+FORM status lock_mode line
+FORM status symbol_mirror NO
+FORM status drawing_size
+FORM status done
+setwindow pcb
+window center; pick 0.0 0.0
+define subclass
+setwindow Form.subclass
+FORM subclass PACKAGE_GEOMETRY pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name ASSEMBLY_TOP
+setwindow Form.subclass
+FORM subclass PACKAGE_GEOMETRY pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name SILKSCREEN_TOP
+setwindow Form.subclass
+FORM subclass PIN pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name PASTEMASK_TOP
+setwindow Form.subclass
+FORM subclass PIN pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name SOLDERMASK_TOP
+setwindow Form.subclass
+FORM subclass PACKAGE_GEOMETRY pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name PLACE_BOUND_TOP
+setwindow Form.subclass
+FORM subclass PACKAGE_GEOMETRY pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name PLACE_BOUND_BOTTOM
+setwindow Form.subclass
+FORM subclass PIN pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name SOLDERMASK_BOTTOM
+setwindow Form.subclass
+FORM subclass PIN pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name PASTEMASK_BOTTOM
+setwindow Form.subclass
+FORM subclass PACKAGE_GEOMETRY pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name SILKSCREEN_BOTTOM
+setwindow Form.subclass
+FORM subclass PACKAGE_GEOMETRY pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name ASSEMBLY_BOTTOM
+setwindow Form.subclass
+FORM subclass BOARD_GEOMETRY pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name DIMENSION
+setwindow Form.subclass
+FORM subclass BOARD_GEOMETRY pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name OUTLINE
+setwindow Form.subclass
+FORM subclass PACKAGE_GEOMETRY pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name ASSEMBLY_TOP
+setwindow Form.subclass
+FORM subclass PACKAGE_GEOMETRY pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name PLACE_BOUND_TOP
+setwindow Form.subclass
+FORM subclass PACKAGE_GEOMETRY pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name PLACE_BOUND_BOTTOM
+setwindow Form.subclass
+FORM subclass MANUFACTURING pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name NO_PROBE_TOP
+setwindow Form.subclass
+FORM subclass MANUFACTURING pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name NO_PROBE_BOTTOM
+setwindow Form.subclass
+FORM subclass PACKAGE_GEOMETRY pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name CONTACT_AREA
+setwindow Form.subclass
+FORM subclass PACKAGE_GEOMETRY pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name CUTOUTSLOTS
+setwindow Form.subclass
+FORM subclass PACKAGE_GEOMETRY pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name DIEBONDPADS
+setwindow Form.subclass
+FORM subclass PACKAGE_GEOMETRY pick
+setwindow Form.subclass_nonetch
+FORM subclass_nonetch name WIREBONDS
+FORM subclass done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name s115_h75
+setwindow Form.mini
+FORM mini next_pin_number 1
+setwindow pcb
+pick 0 0
+done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name c115_h75
+setwindow Form.mini
+FORM mini next_pin_number 2
+setwindow pcb
+pick 0 -2.54
+done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name c115_h75
+setwindow Form.mini
+FORM mini next_pin_number 3
+setwindow pcb
+pick 0 -5.08
+done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name c115_h75
+setwindow Form.mini
+FORM mini next_pin_number 4
+setwindow pcb
+pick 0 -7.62
+done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name c115_h75
+setwindow Form.mini
+FORM mini next_pin_number 5
+setwindow pcb
+pick 0 -10.16
+done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name c115_h75
+setwindow Form.mini
+FORM mini next_pin_number 6
+setwindow pcb
+pick 0 -12.7
+done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name c115_h75
+setwindow Form.mini
+FORM mini next_pin_number 7
+setwindow pcb
+pick 0 -15.24
+done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name c115_h75
+setwindow Form.mini
+FORM mini next_pin_number 8
+setwindow pcb
+pick 0 -17.78
+done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name c115_h75
+setwindow Form.mini
+FORM mini next_pin_number 9
+setwindow pcb
+pick 0 -20.32
+done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name c115_h75
+setwindow Form.mini
+FORM mini next_pin_number 10
+setwindow pcb
+pick 0 -22.86
+done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name c115_h75
+setwindow Form.mini
+FORM mini next_pin_number 11
+setwindow pcb
+pick 7.62 -22.86
+done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name c115_h75
+setwindow Form.mini
+FORM mini next_pin_number 12
+setwindow pcb
+pick 7.62 -20.32
+done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name c115_h75
+setwindow Form.mini
+FORM mini next_pin_number 13
+setwindow pcb
+pick 7.62 -17.78
+done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name c115_h75
+setwindow Form.mini
+FORM mini next_pin_number 14
+setwindow pcb
+pick 7.62 -15.24
+done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name c115_h75
+setwindow Form.mini
+FORM mini next_pin_number 15
+setwindow pcb
+pick 7.62 -12.7
+done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name c115_h75
+setwindow Form.mini
+FORM mini next_pin_number 16
+setwindow pcb
+pick 7.62 -10.16
+done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name c115_h75
+setwindow Form.mini
+FORM mini next_pin_number 17
+setwindow pcb
+pick 7.62 -7.62
+done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name c115_h75
+setwindow Form.mini
+FORM mini next_pin_number 18
+setwindow pcb
+pick 7.62 -5.08
+done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name c115_h75
+setwindow Form.mini
+FORM mini next_pin_number 19
+setwindow pcb
+pick 7.62 -2.54
+done
+Add Pin
+setwindow Form.mini
+FORM mini offsetx 0.00
+FORM mini offsety 0.00
+FORM mini rotate_pin 0
+Add Pin
+setwindow Form.mini
+FORM mini pad_name c115_h75
+setwindow Form.mini
+FORM mini next_pin_number 20
+setwindow pcb
+pick 7.62 0
+done
+setwindow pcb
+Label refdes
+setwindow Form.mini
+FORM mini class REF DES
+FORM mini subclass SILKSCREEN_TOP
+FORM mini text_block 3
+FORM mini text_justification Center
+FORM mini angle 0
+FORM mini mirror NO
+setwindow pcb
+pick 0 0
+Text IC*
+done
+Add Line
+setwindow FORM.mini
+FORM mini class PACKAGE GEOMETRY
+FORM mini subclass PLACE_BOUND_TOP
+setwindow FORM.mini
+FORM mini line_width 0.05
+FORM mini lock_direction Off
+setwindow pcb
+pick -0.825 2.405
+pick 8.445 2.405
+done
+Add Line
+setwindow FORM.mini
+FORM mini class PACKAGE GEOMETRY
+FORM mini subclass PLACE_BOUND_TOP
+setwindow FORM.mini
+FORM mini line_width 0.05
+FORM mini lock_direction Off
+setwindow pcb
+pick 8.445 2.405
+pick 8.445 -25.265
+done
+Add Line
+setwindow FORM.mini
+FORM mini class PACKAGE GEOMETRY
+FORM mini subclass PLACE_BOUND_TOP
+setwindow FORM.mini
+FORM mini line_width 0.05
+FORM mini lock_direction Off
+setwindow pcb
+pick 8.445 -25.265
+pick -0.825 -25.265
+done
+Add Line
+setwindow FORM.mini
+FORM mini class PACKAGE GEOMETRY
+FORM mini subclass PLACE_BOUND_TOP
+setwindow FORM.mini
+FORM mini line_width 0.05
+FORM mini lock_direction Off
+setwindow pcb
+pick -0.825 -25.265
+pick -0.825 2.405
+done
+Add Line
+setwindow FORM.mini
+FORM mini class PACKAGE GEOMETRY
+FORM mini subclass ASSEMBLY_TOP
+setwindow FORM.mini
+FORM mini line_width 0.1
+FORM mini lock_direction Off
+setwindow pcb
+pick 0.51 2.155
+pick 7.11 2.155
+done
+Add Line
+setwindow FORM.mini
+FORM mini class PACKAGE GEOMETRY
+FORM mini subclass ASSEMBLY_TOP
+setwindow FORM.mini
+FORM mini line_width 0.1
+FORM mini lock_direction Off
+setwindow pcb
+pick 7.11 2.155
+pick 7.11 -25.015
+done
+Add Line
+setwindow FORM.mini
+FORM mini class PACKAGE GEOMETRY
+FORM mini subclass ASSEMBLY_TOP
+setwindow FORM.mini
+FORM mini line_width 0.1
+FORM mini lock_direction Off
+setwindow pcb
+pick 7.11 -25.015
+pick 0.51 -25.015
+done
+Add Line
+setwindow FORM.mini
+FORM mini class PACKAGE GEOMETRY
+FORM mini subclass ASSEMBLY_TOP
+setwindow FORM.mini
+FORM mini line_width 0.1
+FORM mini lock_direction Off
+setwindow pcb
+pick 0.51 -25.015
+pick 0.51 2.155
+done
+Add Line
+setwindow FORM.mini
+FORM mini class PACKAGE GEOMETRY
+FORM mini subclass ASSEMBLY_TOP
+setwindow FORM.mini
+FORM mini line_width 0.1
+FORM mini lock_direction Off
+setwindow pcb
+pick 0.51 0.885
+pick 1.78 2.155
+done
+Add Line
+setwindow FORM.mini
+FORM mini class PACKAGE GEOMETRY
+FORM mini subclass SILKSCREEN_TOP
+setwindow FORM.mini
+FORM mini line_width 0.2
+FORM mini lock_direction Off
+setwindow pcb
+pick -0.575 2.155
+pick 7.11 2.155
+done
+Add Line
+setwindow FORM.mini
+FORM mini class PACKAGE GEOMETRY
+FORM mini subclass SILKSCREEN_TOP
+setwindow FORM.mini
+FORM mini line_width 0.2
+FORM mini lock_direction Off
+setwindow pcb
+pick 0.51 -25.015
+pick 7.11 -25.015
+done
+Create Symbol
+fillin "DIP762W55P254L2642H457Q20N"
+setwindow pcb
+trapsize 503
+dbdoctor
+setwindow Form.dbdoctor_allegro
+FORM dbdoctor_allegro drc YES
+FORM dbdoctor_allegro shapes YES
+FORM dbdoctor_allegro execute
+setwindow pcb
+save_as
+fillin "DIP762W55P254L2642H457Q20N"
+setwindow pcb
+#exit
diff --git a/circuit/SN74LS273NE4/OrCAD_Allegro16/padstack1.scr b/circuit/SN74LS273NE4/OrCAD_Allegro16/padstack1.scr
new file mode 100644
index 0000000..52f9f50
--- /dev/null
+++ b/circuit/SN74LS273NE4/OrCAD_Allegro16/padstack1.scr
@@ -0,0 +1,45 @@
+setwindow Form.padedit
+######################## New PadStack #########################
+pse_new
+fillin "c115_h75.pad"
+FORM padedit units Millimeter
+FORM padedit layers
+
+FORM padedit grid row 1
+FORM padedit geometry Circle
+FORM padedit width 1.15
+FORM padedit height 1.15
+FORM padedit x_offset 0
+FORM padedit y_offset 0
+FORM padedit geometry_th Null
+FORM padedit geometry_ant Null
+
+FORM padedit grid row 2
+FORM padedit geometry Circle
+FORM padedit width 1.15
+FORM padedit height 1.15
+FORM padedit x_offset 0
+FORM padedit y_offset 0
+FORM padedit geometry_th Null
+FORM padedit geometry_ant Null
+
+FORM padedit grid row 3
+FORM padedit geometry Circle
+FORM padedit width 1.15
+FORM padedit height 1.15
+FORM padedit x_offset 0
+FORM padedit y_offset 0
+FORM padedit geometry_th Null
+FORM padedit geometry_ant Null
+
+FORM padedit parameters
+FORM padedit through_hole YES
+FORM padedit hole_size_y 0.75
+FORM padedit hole_size_x 0.75
+FORM padedit drill_fig Cross
+FORM padedit characters A
+FORM padedit drill_width 1.27
+FORM padedit drill_height 1.27
+FORM padedit plating Plated
+pse_save_as
+fillin "c115_h75.Pad"
diff --git a/circuit/SN74LS273NE4/OrCAD_Allegro16/padstack2.scr b/circuit/SN74LS273NE4/OrCAD_Allegro16/padstack2.scr
new file mode 100644
index 0000000..178b458
--- /dev/null
+++ b/circuit/SN74LS273NE4/OrCAD_Allegro16/padstack2.scr
@@ -0,0 +1,45 @@
+setwindow Form.padedit
+######################## New PadStack #########################
+pse_new
+fillin "s115_h75.pad"
+FORM padedit units Millimeter
+FORM padedit layers
+
+FORM padedit grid row 1
+FORM padedit geometry Square
+FORM padedit width 1.15
+FORM padedit height 1.15
+FORM padedit x_offset 0
+FORM padedit y_offset 0
+FORM padedit geometry_th Null
+FORM padedit geometry_ant Null
+
+FORM padedit grid row 2
+FORM padedit geometry Square
+FORM padedit width 1.15
+FORM padedit height 1.15
+FORM padedit x_offset 0
+FORM padedit y_offset 0
+FORM padedit geometry_th Null
+FORM padedit geometry_ant Null
+
+FORM padedit grid row 3
+FORM padedit geometry Square
+FORM padedit width 1.15
+FORM padedit height 1.15
+FORM padedit x_offset 0
+FORM padedit y_offset 0
+FORM padedit geometry_th Null
+FORM padedit geometry_ant Null
+
+FORM padedit parameters
+FORM padedit through_hole YES
+FORM padedit hole_size_y 0.75
+FORM padedit hole_size_x 0.75
+FORM padedit drill_fig Cross
+FORM padedit characters B
+FORM padedit drill_width 1.27
+FORM padedit drill_height 1.27
+FORM padedit plating Plated
+pse_save_as
+fillin "s115_h75.Pad"
diff --git a/circuit/SN74LS273NE4/PADS/DIP762W55P254L2642H457Q20N.d b/circuit/SN74LS273NE4/PADS/DIP762W55P254L2642H457Q20N.d
new file mode 100644
index 0000000..e2c3119
--- /dev/null
+++ b/circuit/SN74LS273NE4/PADS/DIP762W55P254L2642H457Q20N.d
@@ -0,0 +1,59 @@
+*PADS-LIBRARY-PCB-DECALS-V9*
+
+DIP762W55P254L2642H457Q20N M 0 0 0 2 5 0 20 2 0
+TIMESTAMP 2020.04.22.17.04.09
+0 0 0 0 1.27 0.127 1 0 34 "Regular "
+REF-DES
+0 0 0 0 1.27 0.127 1 32 35 "Regular "
+PART-TYPE
+CLOSED 5 0.05 20 -1
+-4.635 13.835
+4.635 13.835
+4.635 -13.835
+-4.635 -13.835
+-4.635 13.835
+CLOSED 5 0.1 27 -1
+-3.3 13.585
+3.3 13.585
+3.3 -13.585
+-3.3 -13.585
+-3.3 13.585
+OPEN 2 0.1 27 -1
+-3.3 12.315
+-2.03 13.585
+OPEN 2 0.2 26 -1
+-4.385 13.585
+3.3 13.585
+OPEN 2 0.2 26 -1
+-3.3 -13.585
+3.3 -13.585
+T-3.81 11.43 -3.81 11.43 1
+T-3.81 8.89 -3.81 8.89 2
+T-3.81 6.35 -3.81 6.35 3
+T-3.81 3.81 -3.81 3.81 4
+T-3.81 1.27 -3.81 1.27 5
+T-3.81 -1.27 -3.81 -1.27 6
+T-3.81 -3.81 -3.81 -3.81 7
+T-3.81 -6.35 -3.81 -6.35 8
+T-3.81 -8.89 -3.81 -8.89 9
+T-3.81 -11.43 -3.81 -11.43 10
+T3.81 -11.43 3.81 -11.43 11
+T3.81 -8.89 3.81 -8.89 12
+T3.81 -6.35 3.81 -6.35 13
+T3.81 -3.81 3.81 -3.81 14
+T3.81 -1.27 3.81 -1.27 15
+T3.81 1.27 3.81 1.27 16
+T3.81 3.81 3.81 3.81 17
+T3.81 6.35 3.81 6.35 18
+T3.81 8.89 3.81 8.89 19
+T3.81 11.43 3.81 11.43 20
+PAD 0 3 P 0.75
+-2 1.15 R
+-1 1.15 R
+0 1.15 R
+PAD 1 3 P 0.75
+-2 1.15 S 0
+-1 1.15 R
+0 1.15 S 0
+
+*END*
diff --git a/circuit/SN74LS273NE4/PADS/SN74LS273NE4.asc b/circuit/SN74LS273NE4/PADS/SN74LS273NE4.asc
new file mode 100644
index 0000000..3b6582e
--- /dev/null
+++ b/circuit/SN74LS273NE4/PADS/SN74LS273NE4.asc
@@ -0,0 +1,61 @@
+!PADS-POWERPCB-V9.5-METRIC! DESIGN DATABASE ASCII FILE 1.0
+*PARTDECAL* ITEMS
+
+DIP762W55P254L2642H457Q20N M 0 0 5 20 2 0 2
+CLOSED 5 0.05 0 20
+-4.635 13.835
+4.635 13.835
+4.635 -13.835
+-4.635 -13.835
+-4.635 13.835
+CLOSED 5 0.1 0 27
+-3.3 13.585
+3.3 13.585
+3.3 -13.585
+-3.3 -13.585
+-3.3 13.585
+OPEN 2 0.1 0 27
+-3.3 12.315
+-2.03 13.585
+OPEN 2 0.2 0 26
+-4.385 13.585
+3.3 13.585
+OPEN 2 0.2 0 26
+-3.3 -13.585
+3.3 -13.585
+VALUE 0 0 0 1 1.27 0.127 N LEFT DOWN
+Regular
+Ref.Des.
+VALUE 0 0 0 1 1.27 0.127 N LEFT UP
+Regular
+Part Type
+T-3.81 11.43 -3.81 11.43 1
+T-3.81 8.89 -3.81 8.89 2
+T-3.81 6.35 -3.81 6.35 3
+T-3.81 3.81 -3.81 3.81 4
+T-3.81 1.27 -3.81 1.27 5
+T-3.81 -1.27 -3.81 -1.27 6
+T-3.81 -3.81 -3.81 -3.81 7
+T-3.81 -6.35 -3.81 -6.35 8
+T-3.81 -8.89 -3.81 -8.89 9
+T-3.81 -11.43 -3.81 -11.43 10
+T3.81 -11.43 3.81 -11.43 11
+T3.81 -8.89 3.81 -8.89 12
+T3.81 -6.35 3.81 -6.35 13
+T3.81 -3.81 3.81 -3.81 14
+T3.81 -1.27 3.81 -1.27 15
+T3.81 1.27 3.81 1.27 16
+T3.81 3.81 3.81 3.81 17
+T3.81 6.35 3.81 6.35 18
+T3.81 8.89 3.81 8.89 19
+T3.81 11.43 3.81 11.43 20
+PAD 0 3
+-2 1.15 R 0.75
+-1 1.15 R
+0 1.15 R
+PAD 1 3
+-2 1.15 S 0 0.75
+-1 1.15 R
+0 1.15 S 0
+
+*END* OF ASCII OUTPUT FILE
diff --git a/circuit/SN74LS273NE4/PADS/SN74LS273NE4.c b/circuit/SN74LS273NE4/PADS/SN74LS273NE4.c
new file mode 100644
index 0000000..ba38c2d
--- /dev/null
+++ b/circuit/SN74LS273NE4/PADS/SN74LS273NE4.c
@@ -0,0 +1,63 @@
+*PADS-LIBRARY-SCH-DECALS-V9*
+
+SN74LS273NE4 0 0 100 10 100 10 4 1 0 20 0
+TIMESTAMP 2020.04.22.17.25.09
+"Default Font"
+"Default Font"
+950 300 0 8 100 10
+REF-DES
+950 200 0 8 100 10
+PART-TYPE
+950 -1100 0 8 100 10
+*
+950 -1200 0 8 100 10
+*
+CLOSED 5 10 0 -1
+200 100
+900 100
+900 -1000
+200 -1000
+200 100
+T0 0 0 0 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+T0 -100 0 0 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+T0 -200 0 0 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+T0 -300 0 0 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+T0 -400 0 0 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+T0 -500 0 0 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+T0 -600 0 0 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+T0 -700 0 0 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+T0 -800 0 0 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+T0 -900 0 0 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+T1100 0 0 2 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+T1100 -100 0 2 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+T1100 -200 0 2 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+T1100 -300 0 2 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+T1100 -400 0 2 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+T1100 -500 0 2 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+T1100 -600 0 2 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+T1100 -700 0 2 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+T1100 -800 0 2 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+T1100 -900 0 2 140 20 0 2 230 0 0 16 PIN
+P-520 0 0 2 -80 0 0 2 0
+
+*END*
+*REMARK* SamacSys ECAD Model
diff --git a/circuit/SN74LS273NE4/PADS/SN74LS273NE4.p b/circuit/SN74LS273NE4/PADS/SN74LS273NE4.p
new file mode 100644
index 0000000..b5285f7
--- /dev/null
+++ b/circuit/SN74LS273NE4/PADS/SN74LS273NE4.p
@@ -0,0 +1,37 @@
+*PADS-LIBRARY-PART-TYPES-V9*
+
+SN74LS273NE4 DIP762W55P254L2642H457Q20N I ANA 7 1 0 0 0
+TIMESTAMP 2020.04.22.17.25.09
+"Mouser2 Part Number" 595-SN74LS273NE4
+"Mouser2 Price/Stock" https://www.mouser.com/Search/Refine.aspx?Keyword=595-SN74LS273NE4
+"Manufacturer_Name" Texas Instruments
+"Manufacturer_Part_Number" SN74LS273NE4
+"Description" Flip Flops Octal D-Type Flip-Flop w/Clear
+"Datasheet Link" http://www.ti.com/lit/ds/sdls090/sdls090.pdf
+"Geometry.Height" 4.57mm
+GATE 1 20 0
+SN74LS273NE4
+1 0 L \CLR
+2 0 S 1Q
+3 0 L 1D
+4 0 L 2D
+5 0 S 2Q
+6 0 S 3Q
+7 0 L 3D
+8 0 L 4D
+9 0 S 4Q
+10 0 G GND
+20 0 P VCC
+19 0 S 8Q
+18 0 L 8D
+17 0 L 7D
+16 0 S 7Q
+15 0 S 6Q
+14 0 L 6D
+13 0 L 5D
+12 0 S 5Q
+11 0 L CLK
+
+*END*
+*REMARK* SamacSys ECAD Model
+796887/230744/2.46/20/3/Integrated Circuit
diff --git a/circuit/SN74LS273NE4/Proteus/8.8 or earlier/Readme.html b/circuit/SN74LS273NE4/Proteus/8.8 or earlier/Readme.html
new file mode 100644
index 0000000..496a57f
--- /dev/null
+++ b/circuit/SN74LS273NE4/Proteus/8.8 or earlier/Readme.html
@@ -0,0 +1,16 @@
+
+
+
+ SamacSys support for Proteus 8.8 or earlier
+
+
+Supporting Proteus 8.8 or earlier was done by including the Mentor Graphics PADS library files in the Proteus folder, with instructions on how to import them.
+
+Unfortunately Mentor Graphics have stopped us from promoting their files for use in other design tools, now we can only include the PADS files in the "PADS" folder from our website.
+
+Sorry for the inconvenience, but please note that we are working with Labcenter Electronics to bring you a new integrated experience in Proteus 8.9.
+
+Best Regards
+The SamacSys Team
+
+
diff --git a/circuit/SN74LS273NE4/Proteus/8.9 or later/Readme.html b/circuit/SN74LS273NE4/Proteus/8.9 or later/Readme.html
new file mode 100644
index 0000000..91a8a69
--- /dev/null
+++ b/circuit/SN74LS273NE4/Proteus/8.9 or later/Readme.html
@@ -0,0 +1,14 @@
+
+
+
+ SamacSys support for Proteus 8.9 or later
+
+
+Supporting Proteus 8.9 and beyond
+
+We are working with Labcenter Electronics to bring you a new integrated experience in Proteus 8.9. This version is currently in BETA and we will inform you upon its release.
+
+Best Regards
+The SamacSys Team
+
+
diff --git a/circuit/SN74LS273NE4/Proteus/SN74LS273NE4.pdif b/circuit/SN74LS273NE4/Proteus/SN74LS273NE4.pdif
new file mode 100644
index 0000000..180566f
--- /dev/null
+++ b/circuit/SN74LS273NE4/Proteus/SN74LS273NE4.pdif
@@ -0,0 +1,223 @@
+;Proteus Design Interchange Format
+(PDIF
+ (vendor "SamacSys Limited")
+ (version 1 0)
+ (library
+ (part "SN74LS273NE4"
+ (description "Flip Flops Octal D-Type Flip-Flop w/Clear")
+ (family "ANA")
+ (package "DIP762W55P254L2642H457Q20N")
+ (attribute "Datasheet Link" "http://www.ti.com/lit/ds/sdls090/sdls090.pdf")
+ (attribute "Geometry.Height" "4.57mm")
+ (attribute "Mouser2 Part Number" "595-SN74LS273NE4")
+ (attribute "Mouser2 Price/Stock" "https://www.mouser.com/Search/Refine.aspx?Keyword=595-SN74LS273NE4")
+ (attribute "Manufacturer_Name" "Texas Instruments")
+ (attribute "Manufacturer_Part_Number" "SN74LS273NE4")
+ (gate
+ (symbol "SN74LS273NE4")
+ (pin "$CLR$" 1 IP)
+ (pin "1Q" 2 OP)
+ (pin "1D" 3 IP)
+ (pin "2D" 4 IP)
+ (pin "2Q" 5 OP)
+ (pin "3Q" 6 OP)
+ (pin "3D" 7 IP)
+ (pin "4D" 8 IP)
+ (pin "4Q" 9 OP)
+ (pin "GND" 10 PP)
+ (pin "VCC" 20 PP)
+ (pin "8Q" 19 OP)
+ (pin "8D" 18 IP)
+ (pin "7D" 17 IP)
+ (pin "7Q" 16 OP)
+ (pin "6Q" 15 OP)
+ (pin "6D" 14 IP)
+ (pin "5D" 13 IP)
+ (pin "5Q" 12 OP)
+ (pin "CLK" 11 IP)
+ )
+ )
+ (symbol "SN74LS273NE4"
+ (units THOU)
+ (origin (pt 0 0))
+ (graphic
+ (stroke 10)
+ (path (pt 200 100) (pt 900 100) (pt 900 -1000) (pt 200 -1000) (pt 200 100) (closed))
+ )
+ (terminal
+ (body (symbol "PIN") (pt 0 0) (rot 0) (mir 0) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ (terminal
+ (body (symbol "PIN") (pt 0 -100) (rot 0) (mir 0) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ (terminal
+ (body (symbol "PIN") (pt 0 -200) (rot 0) (mir 0) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ (terminal
+ (body (symbol "PIN") (pt 0 -300) (rot 0) (mir 0) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ (terminal
+ (body (symbol "PIN") (pt 0 -400) (rot 0) (mir 0) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ (terminal
+ (body (symbol "PIN") (pt 0 -500) (rot 0) (mir 0) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ (terminal
+ (body (symbol "PIN") (pt 0 -600) (rot 0) (mir 0) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ (terminal
+ (body (symbol "PIN") (pt 0 -700) (rot 0) (mir 0) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ (terminal
+ (body (symbol "PIN") (pt 0 -800) (rot 0) (mir 0) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ (terminal
+ (body (symbol "PIN") (pt 0 -900) (rot 0) (mir 0) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ (terminal
+ (body (symbol "PIN") (pt 1100 0) (rot 0) (mir X) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ (terminal
+ (body (symbol "PIN") (pt 1100 -100) (rot 0) (mir X) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ (terminal
+ (body (symbol "PIN") (pt 1100 -200) (rot 0) (mir X) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ (terminal
+ (body (symbol "PIN") (pt 1100 -300) (rot 0) (mir X) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ (terminal
+ (body (symbol "PIN") (pt 1100 -400) (rot 0) (mir X) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ (terminal
+ (body (symbol "PIN") (pt 1100 -500) (rot 0) (mir X) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ (terminal
+ (body (symbol "PIN") (pt 1100 -600) (rot 0) (mir X) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ (terminal
+ (body (symbol "PIN") (pt 1100 -700) (rot 0) (mir X) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ (terminal
+ (body (symbol "PIN") (pt 1100 -800) (rot 0) (mir X) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ (terminal
+ (body (symbol "PIN") (pt 1100 -900) (rot 0) (mir X) (visible true))
+ (name (pt 230 0) (rot 0) (just MIDDLE LEFT) (visible true))
+ (number (pt 140 20) (rot 0) (just BOTTOM RIGHT) (visible true)))
+ )
+ (symbol "PIN"
+ (units THOU)
+ (origin (pt 0 0))
+ (graphic
+ (stroke 10)
+ (path (pt 0 0) (pt 200 0))))
+ (symbol "PINSHORT"
+ (units THOU)
+ (origin (pt 0 0))
+ (graphic
+ (stroke 10)
+ (path (pt 0 0) (pt 100 0))))
+ (package "DIP762W55P254L2642H457Q20N"
+ (units MM)
+ (layer OCCA
+ (graphic
+ (stroke 0.05)
+ (path
+ (closed true)
+ (pt -4.635 13.835)
+ (pt 4.635 13.835)
+ (pt 4.635 -13.835)
+ (pt -4.635 -13.835)
+ (pt -4.635 13.835))))
+ (layer TASM
+ (graphic
+ (stroke 0.1)
+ (path
+ (closed true)
+ (pt -3.3 13.585)
+ (pt 3.3 13.585)
+ (pt 3.3 -13.585)
+ (pt -3.3 -13.585)
+ (pt -3.3 13.585))))
+ (layer TASM
+ (graphic
+ (stroke 0.1)
+ (path
+ (closed false)
+ (pt -3.3 12.315)
+ (pt -2.03 13.585))))
+ (layer TSLK
+ (graphic
+ (stroke 0.2)
+ (path
+ (closed false)
+ (pt -4.385 13.585)
+ (pt 3.3 13.585))))
+ (layer TSLK
+ (graphic
+ (stroke 0.2)
+ (path
+ (closed false)
+ (pt -3.3 -13.585)
+ (pt 3.3 -13.585))))
+ (leg 1 (pt -3.81 11.43) (padstack 1))
+ (leg 2 (pt -3.81 8.89) (padstack 0))
+ (leg 3 (pt -3.81 6.35) (padstack 0))
+ (leg 4 (pt -3.81 3.81) (padstack 0))
+ (leg 5 (pt -3.81 1.27) (padstack 0))
+ (leg 6 (pt -3.81 -1.27) (padstack 0))
+ (leg 7 (pt -3.81 -3.81) (padstack 0))
+ (leg 8 (pt -3.81 -6.35) (padstack 0))
+ (leg 9 (pt -3.81 -8.89) (padstack 0))
+ (leg 10 (pt -3.81 -11.43) (padstack 0))
+ (leg 11 (pt 3.81 -11.43) (padstack 0))
+ (leg 12 (pt 3.81 -8.89) (padstack 0))
+ (leg 13 (pt 3.81 -6.35) (padstack 0))
+ (leg 14 (pt 3.81 -3.81) (padstack 0))
+ (leg 15 (pt 3.81 -1.27) (padstack 0))
+ (leg 16 (pt 3.81 1.27) (padstack 0))
+ (leg 17 (pt 3.81 3.81) (padstack 0))
+ (leg 18 (pt 3.81 6.35) (padstack 0))
+ (leg 19 (pt 3.81 8.89) (padstack 0))
+ (leg 20 (pt 3.81 11.43) (padstack 0))
+ (padstack 0
+ (hole 0.75)
+ (plated true)
+ (pad (layer TCOP) (round 1.15))
+ (pad (layer INNER) (round 1.15))
+ (pad (layer BCOP) (round 1.15))
+ )
+ (padstack 1
+ (hole 0.75)
+ (plated true)
+ (pad (layer TCOP) (square 1.15))
+ (pad (layer INNER) (round 1.15))
+ (pad (layer BCOP) (square 1.15))
+ )
+ (model "SN74LS273NE4.stp"
+ (euler 0 0 0)
+ (offset 0 0 0)
+ )
+ )
+ )
+)
diff --git a/circuit/SN74LS273NE4/Proteus/SN74LS273NE4.pdspart b/circuit/SN74LS273NE4/Proteus/SN74LS273NE4.pdspart
new file mode 100644
index 0000000..b888e69
Binary files /dev/null and b/circuit/SN74LS273NE4/Proteus/SN74LS273NE4.pdspart differ
diff --git a/circuit/SN74LS273NE4/Pulsonix/SN74LS273NE4.plx b/circuit/SN74LS273NE4/Pulsonix/SN74LS273NE4.plx
new file mode 100644
index 0000000..8877ae3
--- /dev/null
+++ b/circuit/SN74LS273NE4/Pulsonix/SN74LS273NE4.plx
@@ -0,0 +1,196 @@
+PULSONIX_LIBRARY_ASCII "SamacSys ECAD Model"
+//796887/230744/2.46/20/3/Integrated Circuit
+
+(asciiHeader
+ (fileUnits MM)
+)
+(library Library_1
+ (padStyleDef "c115_h75"
+ (holeDiam 0.75)
+ (padShape (layerNumRef 1) (padShapeType Ellipse) (shapeWidth 1.15) (shapeHeight 1.15))
+ (padShape (layerNumRef 16) (padShapeType Ellipse) (shapeWidth 1.15) (shapeHeight 1.15))
+ )
+ (padStyleDef "s115_h75"
+ (holeDiam 0.75)
+ (padShape (layerNumRef 1) (padShapeType Rect) (shapeWidth 1.15) (shapeHeight 1.15))
+ (padShape (layerNumRef 16) (padShapeType Rect) (shapeWidth 1.15) (shapeHeight 1.15))
+ )
+ (textStyleDef "Normal"
+ (font
+ (fontType Stroke)
+ (fontFace "Helvetica")
+ (fontHeight 1.27)
+ (strokeWidth 0.127)
+ )
+ )
+ (patternDef "DIP762W55P254L2642H457Q20N" (originalName "DIP762W55P254L2642H457Q20N")
+ (multiLayer
+ (pad (padNum 1) (padStyleRef s115_h75) (pt -3.81, 11.43) (rotation 90))
+ (pad (padNum 2) (padStyleRef c115_h75) (pt -3.81, 8.89) (rotation 90))
+ (pad (padNum 3) (padStyleRef c115_h75) (pt -3.81, 6.35) (rotation 90))
+ (pad (padNum 4) (padStyleRef c115_h75) (pt -3.81, 3.81) (rotation 90))
+ (pad (padNum 5) (padStyleRef c115_h75) (pt -3.81, 1.27) (rotation 90))
+ (pad (padNum 6) (padStyleRef c115_h75) (pt -3.81, -1.27) (rotation 90))
+ (pad (padNum 7) (padStyleRef c115_h75) (pt -3.81, -3.81) (rotation 90))
+ (pad (padNum 8) (padStyleRef c115_h75) (pt -3.81, -6.35) (rotation 90))
+ (pad (padNum 9) (padStyleRef c115_h75) (pt -3.81, -8.89) (rotation 90))
+ (pad (padNum 10) (padStyleRef c115_h75) (pt -3.81, -11.43) (rotation 90))
+ (pad (padNum 11) (padStyleRef c115_h75) (pt 3.81, -11.43) (rotation 90))
+ (pad (padNum 12) (padStyleRef c115_h75) (pt 3.81, -8.89) (rotation 90))
+ (pad (padNum 13) (padStyleRef c115_h75) (pt 3.81, -6.35) (rotation 90))
+ (pad (padNum 14) (padStyleRef c115_h75) (pt 3.81, -3.81) (rotation 90))
+ (pad (padNum 15) (padStyleRef c115_h75) (pt 3.81, -1.27) (rotation 90))
+ (pad (padNum 16) (padStyleRef c115_h75) (pt 3.81, 1.27) (rotation 90))
+ (pad (padNum 17) (padStyleRef c115_h75) (pt 3.81, 3.81) (rotation 90))
+ (pad (padNum 18) (padStyleRef c115_h75) (pt 3.81, 6.35) (rotation 90))
+ (pad (padNum 19) (padStyleRef c115_h75) (pt 3.81, 8.89) (rotation 90))
+ (pad (padNum 20) (padStyleRef c115_h75) (pt 3.81, 11.43) (rotation 90))
+ )
+ (layerContents (layerNumRef 18)
+ (attr "RefDes" "RefDes" (pt 0, 0) (textStyleRef "Normal") (isVisible True))
+ )
+ (layerContents (layerNumRef Courtyard_Top)
+ (line (pt -4.635 13.835) (pt 4.635 13.835) (width 0.05))
+ )
+ (layerContents (layerNumRef Courtyard_Top)
+ (line (pt 4.635 13.835) (pt 4.635 -13.835) (width 0.05))
+ )
+ (layerContents (layerNumRef Courtyard_Top)
+ (line (pt 4.635 -13.835) (pt -4.635 -13.835) (width 0.05))
+ )
+ (layerContents (layerNumRef Courtyard_Top)
+ (line (pt -4.635 -13.835) (pt -4.635 13.835) (width 0.05))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt -3.3 13.585) (pt 3.3 13.585) (width 0.025))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt 3.3 13.585) (pt 3.3 -13.585) (width 0.025))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt 3.3 -13.585) (pt -3.3 -13.585) (width 0.025))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt -3.3 -13.585) (pt -3.3 13.585) (width 0.025))
+ )
+ (layerContents (layerNumRef 28)
+ (line (pt -3.3 12.315) (pt -2.03 13.585) (width 0.025))
+ )
+ (layerContents (layerNumRef 18)
+ (line (pt -4.385 13.585) (pt 3.3 13.585) (width 0.2))
+ )
+ (layerContents (layerNumRef 18)
+ (line (pt -3.3 -13.585) (pt 3.3 -13.585) (width 0.2))
+ )
+ )
+ (symbolDef "SN74LS273NE4" (originalName "SN74LS273NE4")
+
+ (pin (pinNum 1) (pt 0 mils 0 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -25 mils) (rotation 0]) (justify "Left") (textStyleRef "Normal"))
+ ))
+ (pin (pinNum 2) (pt 0 mils -100 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -125 mils) (rotation 0]) (justify "Left") (textStyleRef "Normal"))
+ ))
+ (pin (pinNum 3) (pt 0 mils -200 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -225 mils) (rotation 0]) (justify "Left") (textStyleRef "Normal"))
+ ))
+ (pin (pinNum 4) (pt 0 mils -300 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -325 mils) (rotation 0]) (justify "Left") (textStyleRef "Normal"))
+ ))
+ (pin (pinNum 5) (pt 0 mils -400 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -425 mils) (rotation 0]) (justify "Left") (textStyleRef "Normal"))
+ ))
+ (pin (pinNum 6) (pt 0 mils -500 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -525 mils) (rotation 0]) (justify "Left") (textStyleRef "Normal"))
+ ))
+ (pin (pinNum 7) (pt 0 mils -600 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -625 mils) (rotation 0]) (justify "Left") (textStyleRef "Normal"))
+ ))
+ (pin (pinNum 8) (pt 0 mils -700 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -725 mils) (rotation 0]) (justify "Left") (textStyleRef "Normal"))
+ ))
+ (pin (pinNum 9) (pt 0 mils -800 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -825 mils) (rotation 0]) (justify "Left") (textStyleRef "Normal"))
+ ))
+ (pin (pinNum 10) (pt 0 mils -900 mils) (rotation 0) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 230 mils -925 mils) (rotation 0]) (justify "Left") (textStyleRef "Normal"))
+ ))
+ (pin (pinNum 11) (pt 1100 mils 0 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -25 mils) (rotation 0]) (justify "Right") (textStyleRef "Normal"))
+ ))
+ (pin (pinNum 12) (pt 1100 mils -100 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -125 mils) (rotation 0]) (justify "Right") (textStyleRef "Normal"))
+ ))
+ (pin (pinNum 13) (pt 1100 mils -200 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -225 mils) (rotation 0]) (justify "Right") (textStyleRef "Normal"))
+ ))
+ (pin (pinNum 14) (pt 1100 mils -300 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -325 mils) (rotation 0]) (justify "Right") (textStyleRef "Normal"))
+ ))
+ (pin (pinNum 15) (pt 1100 mils -400 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -425 mils) (rotation 0]) (justify "Right") (textStyleRef "Normal"))
+ ))
+ (pin (pinNum 16) (pt 1100 mils -500 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -525 mils) (rotation 0]) (justify "Right") (textStyleRef "Normal"))
+ ))
+ (pin (pinNum 17) (pt 1100 mils -600 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -625 mils) (rotation 0]) (justify "Right") (textStyleRef "Normal"))
+ ))
+ (pin (pinNum 18) (pt 1100 mils -700 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -725 mils) (rotation 0]) (justify "Right") (textStyleRef "Normal"))
+ ))
+ (pin (pinNum 19) (pt 1100 mils -800 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -825 mils) (rotation 0]) (justify "Right") (textStyleRef "Normal"))
+ ))
+ (pin (pinNum 20) (pt 1100 mils -900 mils) (rotation 180) (pinLength 200 mils) (pinDisplay (dispPinName true)) (pinName (text (pt 870 mils -925 mils) (rotation 0]) (justify "Right") (textStyleRef "Normal"))
+ ))
+ (line (pt 200 mils 100 mils) (pt 900 mils 100 mils) (width 6 mils))
+ (line (pt 900 mils 100 mils) (pt 900 mils -1000 mils) (width 6 mils))
+ (line (pt 900 mils -1000 mils) (pt 200 mils -1000 mils) (width 6 mils))
+ (line (pt 200 mils -1000 mils) (pt 200 mils 100 mils) (width 6 mils))
+ (attr "RefDes" "RefDes" (pt 950 mils 300 mils) (justify Left) (isVisible True) (textStyleRef "Normal"))
+ (attr "Type" "Type" (pt 950 mils 200 mils) (justify Left) (isVisible True) (textStyleRef "Normal"))
+
+ )
+ (compDef "SN74LS273NE4" (originalName "SN74LS273NE4") (compHeader (numPins 20) (numParts 1) (refDesPrefix IC)
+ )
+ (compPin "1" (pinName "__CLR") (partNum 1) (symPinNum 1) (gateEq 0) (pinEq 0) (pinType Input))
+ (compPin "2" (pinName "1Q") (partNum 1) (symPinNum 2) (gateEq 0) (pinEq 0) (pinType Output))
+ (compPin "3" (pinName "1D") (partNum 1) (symPinNum 3) (gateEq 0) (pinEq 0) (pinType Input))
+ (compPin "4" (pinName "2D") (partNum 1) (symPinNum 4) (gateEq 0) (pinEq 0) (pinType Input))
+ (compPin "5" (pinName "2Q") (partNum 1) (symPinNum 5) (gateEq 0) (pinEq 0) (pinType Output))
+ (compPin "6" (pinName "3Q") (partNum 1) (symPinNum 6) (gateEq 0) (pinEq 0) (pinType Output))
+ (compPin "7" (pinName "3D") (partNum 1) (symPinNum 7) (gateEq 0) (pinEq 0) (pinType Input))
+ (compPin "8" (pinName "4D") (partNum 1) (symPinNum 8) (gateEq 0) (pinEq 0) (pinType Input))
+ (compPin "9" (pinName "4Q") (partNum 1) (symPinNum 9) (gateEq 0) (pinEq 0) (pinType Output))
+ (compPin "10" (pinName "GND") (partNum 1) (symPinNum 10) (gateEq 0) (pinEq 0) (pinType Power))
+ (compPin "20" (pinName "VCC") (partNum 1) (symPinNum 11) (gateEq 0) (pinEq 0) (pinType Power))
+ (compPin "19" (pinName "8Q") (partNum 1) (symPinNum 12) (gateEq 0) (pinEq 0) (pinType Output))
+ (compPin "18" (pinName "8D") (partNum 1) (symPinNum 13) (gateEq 0) (pinEq 0) (pinType Input))
+ (compPin "17" (pinName "7D") (partNum 1) (symPinNum 14) (gateEq 0) (pinEq 0) (pinType Input))
+ (compPin "16" (pinName "7Q") (partNum 1) (symPinNum 15) (gateEq 0) (pinEq 0) (pinType Output))
+ (compPin "15" (pinName "6Q") (partNum 1) (symPinNum 16) (gateEq 0) (pinEq 0) (pinType Output))
+ (compPin "14" (pinName "6D") (partNum 1) (symPinNum 17) (gateEq 0) (pinEq 0) (pinType Input))
+ (compPin "13" (pinName "5D") (partNum 1) (symPinNum 18) (gateEq 0) (pinEq 0) (pinType Input))
+ (compPin "12" (pinName "5Q") (partNum 1) (symPinNum 19) (gateEq 0) (pinEq 0) (pinType Output))
+ (compPin "11" (pinName "CLK") (partNum 1) (symPinNum 20) (gateEq 0) (pinEq 0) (pinType Input))
+ (attachedSymbol (partNum 1) (altType Normal) (symbolName "SN74LS273NE4"))
+ (attachedPattern (patternNum 1) (patternName "DIP762W55P254L2642H457Q20N")
+ (numPads 20)
+ (padPinMap
+ (padNum 1) (compPinRef "1")
+ (padNum 2) (compPinRef "2")
+ (padNum 3) (compPinRef "3")
+ (padNum 4) (compPinRef "4")
+ (padNum 5) (compPinRef "5")
+ (padNum 6) (compPinRef "6")
+ (padNum 7) (compPinRef "7")
+ (padNum 8) (compPinRef "8")
+ (padNum 9) (compPinRef "9")
+ (padNum 10) (compPinRef "10")
+ (padNum 11) (compPinRef "11")
+ (padNum 12) (compPinRef "12")
+ (padNum 13) (compPinRef "13")
+ (padNum 14) (compPinRef "14")
+ (padNum 15) (compPinRef "15")
+ (padNum 16) (compPinRef "16")
+ (padNum 17) (compPinRef "17")
+ (padNum 18) (compPinRef "18")
+ (padNum 19) (compPinRef "19")
+ (padNum 20) (compPinRef "20")
+ )
+ )
+ (attr "Mouser2 Part Number" "595-SN74LS273NE4")
+ (attr "Mouser2 Price/Stock" "https://www.mouser.com/Search/Refine.aspx?Keyword=595-SN74LS273NE4")
+ (attr "Manufacturer_Name" "Texas Instruments")
+ (attr "Manufacturer_Part_Number" "SN74LS273NE4")
+ (attr "Description" "Flip Flops Octal D-Type Flip-Flop w/Clear")
+ (attr "" "http://www.ti.com/lit/ds/sdls090/sdls090.pdf")
+ (attr "" "4.57")
+ (attr "" "SN74LS273NE4.stp")
+ (attr "" "X=0;Y=0;Z=0")
+ (attr "" "X=0;Y=0;Z=0")
+ )
+
+)
diff --git a/circuit/SN74LS273NE4/SN74LS273NE4.epw b/circuit/SN74LS273NE4/SN74LS273NE4.epw
new file mode 100644
index 0000000..b449109
--- /dev/null
+++ b/circuit/SN74LS273NE4/SN74LS273NE4.epw
@@ -0,0 +1,6 @@
+796887
+Message from SamacSys:
+To use this model save to your preferred location and then open within the ECAD Part Wizard tool.
+If you do not yet have a copy of the ECAD Part Wizard tool then please refer to the Instructions provided with this model.
+Source=mouser
+796887/230744/2.46/20/3/Integrated Circuit
\ No newline at end of file
diff --git a/circuit/SN74LS273NE4/SOLIDWORKS PCB/SN74LS273NE4.lbr b/circuit/SN74LS273NE4/SOLIDWORKS PCB/SN74LS273NE4.lbr
new file mode 100644
index 0000000..cbfd46f
--- /dev/null
+++ b/circuit/SN74LS273NE4/SOLIDWORKS PCB/SN74LS273NE4.lbr
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<Flip Flops Octal D-Type Flip-Flop w/Clear</b><p>
+<author>Created by SamacSys</author>
+
+
+<b>CASE 738–03</b><br>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+>NAME
+>VALUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+>NAME
+>VALUE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<b>Flip Flops Octal D-Type Flip-Flop w/Clear</b><p>
+Source: <a href="http://www.ti.com/lit/ds/sdls090/sdls090.pdf"> Datasheet </a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/circuit/SN74LS273NE4/TARGET 3001!/SN74LS273NE4.cxf b/circuit/SN74LS273NE4/TARGET 3001!/SN74LS273NE4.cxf
new file mode 100644
index 0000000..eb46184
--- /dev/null
+++ b/circuit/SN74LS273NE4/TARGET 3001!/SN74LS273NE4.cxf
@@ -0,0 +1,85 @@
+COMPONENT NAME=SN74LS273NE4 VALUE=SN74LS273NE4 PREFIX=IC SYMBOLS=1 PACKAGE=28 PROPERTIES=9
+Mouser2 Part Number=595-SN74LS273NE4
+Mouser2 Price/Stock=https://www.mouser.com/Search/Refine.aspx?Keyword=595-SN74LS273NE4
+MANUFACTURER=Texas Instruments
+COMPONENT_NAME=SN74LS273NE4
+3D_MODEL=0,0,0,0,0,0
+COMPONENT_TYPE_ID=
+DATASHEET=http://www.ti.com/lit/ds/sdls090/sdls090.pdf
+COMPONENT_HEIGHT=4570000
+SamacSys_ECAD_Model=796887/230744/2.46/20/3/Integrated Circuit
+PACKAGE NAME=DIP762W55P254L2642H457Q20N X1=0 Y1=0 LAYER=4
+LINE X1=-4635000 Y1=13835000 X2=4635000 Y2=13835000 WIDTH=300000 LAYER=4 PROPERTIES=0 DASHED=1
+LINE X1=4635000 Y1=13835000 X2=4635000 Y2=-13835000 WIDTH=300000 LAYER=4 PROPERTIES=0 DASHED=1
+LINE X1=4635000 Y1=-13835000 X2=-4635000 Y2=-13835000 WIDTH=300000 LAYER=4 PROPERTIES=0 DASHED=1
+LINE X1=-4635000 Y1=-13835000 X2=-4635000 Y2=13835000 WIDTH=300000 LAYER=4 PROPERTIES=0 DASHED=1
+LINE X1=-4385000 Y1=13585000 X2=3300000 Y2=13585000 WIDTH=300000 LAYER=4 PROPERTIES=0 DASHED=0
+LINE X1=-3300000 Y1=-13585000 X2=3300000 Y2=-13585000 WIDTH=300000 LAYER=4 PROPERTIES=0 DASHED=0
+PAD XM=-3810000 YM=11430000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=1 FORM=2 ROTATION=90 DRILL=750000 PADNAME=1
+PAD XM=-3810000 YM=8890000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=2 FORM=0 ROTATION=90 DRILL=750000 PADNAME=2
+PAD XM=-3810000 YM=6350000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=3 FORM=0 ROTATION=90 DRILL=750000 PADNAME=3
+PAD XM=-3810000 YM=3810000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=4 FORM=0 ROTATION=90 DRILL=750000 PADNAME=4
+PAD XM=-3810000 YM=1270000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=5 FORM=0 ROTATION=90 DRILL=750000 PADNAME=5
+PAD XM=-3810000 YM=-1270000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=6 FORM=0 ROTATION=90 DRILL=750000 PADNAME=6
+PAD XM=-3810000 YM=-3810000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=7 FORM=0 ROTATION=90 DRILL=750000 PADNAME=7
+PAD XM=-3810000 YM=-6350000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=8 FORM=0 ROTATION=90 DRILL=750000 PADNAME=8
+PAD XM=-3810000 YM=-8890000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=9 FORM=0 ROTATION=90 DRILL=750000 PADNAME=9
+PAD XM=-3810000 YM=-11430000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=10 FORM=0 ROTATION=90 DRILL=750000 PADNAME=10
+PAD XM=3810000 YM=-11430000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=11 FORM=0 ROTATION=90 DRILL=750000 PADNAME=11
+PAD XM=3810000 YM=-8890000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=12 FORM=0 ROTATION=90 DRILL=750000 PADNAME=12
+PAD XM=3810000 YM=-6350000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=13 FORM=0 ROTATION=90 DRILL=750000 PADNAME=13
+PAD XM=3810000 YM=-3810000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=14 FORM=0 ROTATION=90 DRILL=750000 PADNAME=14
+PAD XM=3810000 YM=-1270000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=15 FORM=0 ROTATION=90 DRILL=750000 PADNAME=15
+PAD XM=3810000 YM=1270000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=16 FORM=0 ROTATION=90 DRILL=750000 PADNAME=16
+PAD XM=3810000 YM=3810000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=17 FORM=0 ROTATION=90 DRILL=750000 PADNAME=17
+PAD XM=3810000 YM=6350000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=18 FORM=0 ROTATION=90 DRILL=750000 PADNAME=18
+PAD XM=3810000 YM=8890000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=19 FORM=0 ROTATION=90 DRILL=750000 PADNAME=19
+PAD XM=3810000 YM=11430000 WIDTH=1150000 HEIGHT=1150000 LAYER=100 PINNUMBER=20 FORM=0 ROTATION=90 DRILL=750000 PADNAME=20
+TEXT CONTENT=0 X1=0 Y1=0 WIDTH=1500000 HEIGHT=1500000 FONT=DIN-ISO-ANSI LAYER=4 WEIGHT=10 FUNCTION=1
+SYMBOL X1=0 Y1=0 LAYER=101 SUFFIX= NUMBER=1 ELEMENTS=46
+LINE X1=5080000 Y1=2540000 X2=22860000 Y2=2540000 WIDTH=254000 LAYER=101 PROPERTIES=0
+LINE X1=22860000 Y1=2540000 X2=22860000 Y2=-25400000 WIDTH=254000 LAYER=101 PROPERTIES=0
+LINE X1=22860000 Y1=-25400000 X2=5080000 Y2=-25400000 WIDTH=254000 LAYER=101 PROPERTIES=0
+LINE X1=5080000 Y1=-25400000 X2=5080000 Y2=2540000 WIDTH=254000 LAYER=101 PROPERTIES=0
+PIN X1=0 Y1=0 PINNUMBER=1 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=0.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=|CLR X1=5842000 Y1=-750000 WIDTH=800000 HEIGHT=1500000 RIGHT=NO FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+PIN X1=0 Y1=-2540000 PINNUMBER=2 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=0.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=1Q X1=5842000 Y1=-3290000 WIDTH=800000 HEIGHT=1500000 RIGHT=NO FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+PIN X1=0 Y1=-5080000 PINNUMBER=3 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=0.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=1D X1=5842000 Y1=-5830000 WIDTH=800000 HEIGHT=1500000 RIGHT=NO FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+PIN X1=0 Y1=-7620000 PINNUMBER=4 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=0.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=2D X1=5842000 Y1=-8370000 WIDTH=800000 HEIGHT=1500000 RIGHT=NO FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+PIN X1=0 Y1=-10160000 PINNUMBER=5 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=0.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=2Q X1=5842000 Y1=-10910000 WIDTH=800000 HEIGHT=1500000 RIGHT=NO FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+PIN X1=0 Y1=-12700000 PINNUMBER=6 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=0.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=3Q X1=5842000 Y1=-13450000 WIDTH=800000 HEIGHT=1500000 RIGHT=NO FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+PIN X1=0 Y1=-15240000 PINNUMBER=7 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=0.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=3D X1=5842000 Y1=-15990000 WIDTH=800000 HEIGHT=1500000 RIGHT=NO FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+PIN X1=0 Y1=-17780000 PINNUMBER=8 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=0.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=4D X1=5842000 Y1=-18530000 WIDTH=800000 HEIGHT=1500000 RIGHT=NO FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+PIN X1=0 Y1=-20320000 PINNUMBER=9 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=0.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=4Q X1=5842000 Y1=-21070000 WIDTH=800000 HEIGHT=1500000 RIGHT=NO FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+PIN X1=0 Y1=-22860000 PINNUMBER=10 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=0.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=GND X1=5842000 Y1=-23610000 WIDTH=800000 HEIGHT=1500000 RIGHT=NO FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+PIN X1=27940000 Y1=0 PINNUMBER=20 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=180.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=VCC X1=22098000 Y1=-750000 WIDTH=800000 HEIGHT=1500000 RIGHT=YES FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+PIN X1=27940000 Y1=-2540000 PINNUMBER=19 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=180.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=8Q X1=22098000 Y1=-3290000 WIDTH=800000 HEIGHT=1500000 RIGHT=YES FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+PIN X1=27940000 Y1=-5080000 PINNUMBER=18 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=180.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=8D X1=22098000 Y1=-5830000 WIDTH=800000 HEIGHT=1500000 RIGHT=YES FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+PIN X1=27940000 Y1=-7620000 PINNUMBER=17 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=180.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=7D X1=22098000 Y1=-8370000 WIDTH=800000 HEIGHT=1500000 RIGHT=YES FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+PIN X1=27940000 Y1=-10160000 PINNUMBER=16 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=180.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=7Q X1=22098000 Y1=-10910000 WIDTH=800000 HEIGHT=1500000 RIGHT=YES FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+PIN X1=27940000 Y1=-12700000 PINNUMBER=15 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=180.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=6Q X1=22098000 Y1=-13450000 WIDTH=800000 HEIGHT=1500000 RIGHT=YES FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+PIN X1=27940000 Y1=-15240000 PINNUMBER=14 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=180.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=6D X1=22098000 Y1=-15990000 WIDTH=800000 HEIGHT=1500000 RIGHT=YES FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+PIN X1=27940000 Y1=-17780000 PINNUMBER=13 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=180.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=5D X1=22098000 Y1=-18530000 WIDTH=800000 HEIGHT=1500000 RIGHT=YES FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+PIN X1=27940000 Y1=-20320000 PINNUMBER=12 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=180.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=5Q X1=22098000 Y1=-21070000 WIDTH=800000 HEIGHT=1500000 RIGHT=YES FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+PIN X1=27940000 Y1=-22860000 PINNUMBER=11 PINNAME=YES SHOWNUMBER=YES LENGTH=5080000 WIDTH=254000 ROTATION=180.0000 LAYER=101 FUNCTION=6
+TEXT CONTENT=CLK X1=22098000 Y1=-23610000 WIDTH=800000 HEIGHT=1500000 RIGHT=YES FONT=ARIAL ROTATION=0 LAYER=101 WEIGHT=10 FUNCTION=5
+TEXT CONTENT=IC# X1=24130000 Y1=6620000 WIDTH=1000000 HEIGHT=2000000 FONT=ARIAL LAYER=101 WEIGHT=13 FUNCTION=3
+TEXT CONTENT=SN74LS273NE4 X1=24130000 Y1=4080000 WIDTH=1000000 HEIGHT=2000000 FONT=ARIAL LAYER=101 WEIGHT=13 FUNCTION=2 GERMAN=SN74LS273NE4 ENGLISH=SN74LS273NE4 FRENCH=SN74LS273NE4
diff --git a/circuit/SN74LS273NE4/Xpedition/SN74LS273NE4.1 b/circuit/SN74LS273NE4/Xpedition/SN74LS273NE4.1
new file mode 100644
index 0000000..be90f8f
--- /dev/null
+++ b/circuit/SN74LS273NE4/Xpedition/SN74LS273NE4.1
@@ -0,0 +1,98 @@
+V 54
+K 1
+D 0 -2286000 2794000 0
+Y 1
+U 2413000 762000 254000 0 2 3 REFDES=IC?
+U 2413000 508000 254000 0 2 3 DEVICE=SN74LS273NE4
+U 2413000 254000 254000 0 2 0 PKG_TYPE=DIP762W55P254L2642H457Q20N
+U 2413000 0 254000 0 2 0 Description=Flip Flops Octal D-Type Flip-Flop w/Clear
+U 2413000 -254000 254000 0 2 0 Datasheet Link=http://www.ti.com/lit/ds/sdls090/sdls090.pdf
+U 2413000 -508000 254000 0 2 0 Height=4.57
+U 2413000 -762000 254000 0 2 0 Mouser2 Part Number=595-SN74LS273NE4
+U 2413000 -1016000 254000 0 2 0 Mouser2 Price/Stock=https://www.mouser.com/Search/Refine.aspx?Keyword=595-SN74LS273NE4
+U 2413000 -1270000 254000 0 2 0 Manufacturer_Name=Texas Instruments
+U 2413000 -1524000 254000 0 2 0 Manufacturer_Part_Number=SN74LS273NE4
+U 0 0 254000 0 1 0 FORWARD_PCB=1
+l 5 508000 254000 2286000 254000 2286000 -2540000 508000 -2540000 508000 254000
+|GRPHSTL -1 -1 -1 1
+P 1 0 0 508000 0 0 2 0
+L 584200 0 228600 0 2 0 1 0 ~CLR
+A 355600 50800 203200 0 9 3 #=1
+A 0 0 9 0 3 0 PINTYPE=IN
+P 2 0 -254000 508000 -254000 0 2 0
+L 584200 -254000 228600 0 2 0 1 0 1Q
+A 355600 -203200 203200 0 9 3 #=2
+A 0 0 9 0 3 0 PINTYPE=IN
+P 3 0 -508000 508000 -508000 0 2 0
+L 584200 -508000 228600 0 2 0 1 0 1D
+A 355600 -457200 203200 0 9 3 #=3
+A 0 0 9 0 3 0 PINTYPE=IN
+P 4 0 -762000 508000 -762000 0 2 0
+L 584200 -762000 228600 0 2 0 1 0 2D
+A 355600 -711200 203200 0 9 3 #=4
+A 0 0 9 0 3 0 PINTYPE=IN
+P 5 0 -1016000 508000 -1016000 0 2 0
+L 584200 -1016000 228600 0 2 0 1 0 2Q
+A 355600 -965200 203200 0 9 3 #=5
+A 0 0 9 0 3 0 PINTYPE=IN
+P 6 0 -1270000 508000 -1270000 0 2 0
+L 584200 -1270000 228600 0 2 0 1 0 3Q
+A 355600 -1219200 203200 0 9 3 #=6
+A 0 0 9 0 3 0 PINTYPE=IN
+P 7 0 -1524000 508000 -1524000 0 2 0
+L 584200 -1524000 228600 0 2 0 1 0 3D
+A 355600 -1473200 203200 0 9 3 #=7
+A 0 0 9 0 3 0 PINTYPE=IN
+P 8 0 -1778000 508000 -1778000 0 2 0
+L 584200 -1778000 228600 0 2 0 1 0 4D
+A 355600 -1727200 203200 0 9 3 #=8
+A 0 0 9 0 3 0 PINTYPE=IN
+P 9 0 -2032000 508000 -2032000 0 2 0
+L 584200 -2032000 228600 0 2 0 1 0 4Q
+A 355600 -1981200 203200 0 9 3 #=9
+A 0 0 9 0 3 0 PINTYPE=IN
+P 10 0 -2286000 508000 -2286000 0 2 0
+L 584200 -2286000 228600 0 2 0 1 0 GND
+A 355600 -2235200 203200 0 9 3 #=10
+A 0 0 9 0 3 0 PINTYPE=IN
+P 11 2794000 0 2286000 0 0 3 0
+L 2209800 0 228600 0 8 0 1 0 VCC
+A 2438400 50800 203200 0 3 3 #=20
+A 0 0 9 0 3 0 PINTYPE=IN
+P 12 2794000 -254000 2286000 -254000 0 3 0
+L 2209800 -254000 228600 0 8 0 1 0 8Q
+A 2438400 -203200 203200 0 3 3 #=19
+A 0 0 9 0 3 0 PINTYPE=IN
+P 13 2794000 -508000 2286000 -508000 0 3 0
+L 2209800 -508000 228600 0 8 0 1 0 8D
+A 2438400 -457200 203200 0 3 3 #=18
+A 0 0 9 0 3 0 PINTYPE=IN
+P 14 2794000 -762000 2286000 -762000 0 3 0
+L 2209800 -762000 228600 0 8 0 1 0 7D
+A 2438400 -711200 203200 0 3 3 #=17
+A 0 0 9 0 3 0 PINTYPE=IN
+P 15 2794000 -1016000 2286000 -1016000 0 3 0
+L 2209800 -1016000 228600 0 8 0 1 0 7Q
+A 2438400 -965200 203200 0 3 3 #=16
+A 0 0 9 0 3 0 PINTYPE=IN
+P 16 2794000 -1270000 2286000 -1270000 0 3 0
+L 2209800 -1270000 228600 0 8 0 1 0 6Q
+A 2438400 -1219200 203200 0 3 3 #=15
+A 0 0 9 0 3 0 PINTYPE=IN
+P 17 2794000 -1524000 2286000 -1524000 0 3 0
+L 2209800 -1524000 228600 0 8 0 1 0 6D
+A 2438400 -1473200 203200 0 3 3 #=14
+A 0 0 9 0 3 0 PINTYPE=IN
+P 18 2794000 -1778000 2286000 -1778000 0 3 0
+L 2209800 -1778000 228600 0 8 0 1 0 5D
+A 2438400 -1727200 203200 0 3 3 #=13
+A 0 0 9 0 3 0 PINTYPE=IN
+P 19 2794000 -2032000 2286000 -2032000 0 3 0
+L 2209800 -2032000 228600 0 8 0 1 0 5Q
+A 2438400 -1981200 203200 0 3 3 #=12
+A 0 0 9 0 3 0 PINTYPE=IN
+P 20 2794000 -2286000 2286000 -2286000 0 3 0
+L 2209800 -2286000 228600 0 8 0 1 0 CLK
+A 2438400 -2235200 203200 0 3 3 #=11
+A 0 0 9 0 3 0 PINTYPE=IN
+E
diff --git a/circuit/SN74LS273NE4/Xpedition/cell.hkp b/circuit/SN74LS273NE4/Xpedition/cell.hkp
new file mode 100644
index 0000000..bfac38b
Binary files /dev/null and b/circuit/SN74LS273NE4/Xpedition/cell.hkp differ
diff --git a/circuit/SN74LS273NE4/Xpedition/padstacks.hkp b/circuit/SN74LS273NE4/Xpedition/padstacks.hkp
new file mode 100644
index 0000000..8f6c78b
Binary files /dev/null and b/circuit/SN74LS273NE4/Xpedition/padstacks.hkp differ
diff --git a/circuit/SN74LS273NE4/Xpedition/pdb.hkp b/circuit/SN74LS273NE4/Xpedition/pdb.hkp
new file mode 100644
index 0000000..561ee75
Binary files /dev/null and b/circuit/SN74LS273NE4/Xpedition/pdb.hkp differ
diff --git a/circuit/SN74LS273NE4/eCADSTAR/DIP762W55P254L2642H457Q20N.foota b/circuit/SN74LS273NE4/eCADSTAR/DIP762W55P254L2642H457Q20N.foota
new file mode 100644
index 0000000..af17577
--- /dev/null
+++ b/circuit/SN74LS273NE4/eCADSTAR/DIP762W55P254L2642H457Q20N.foota
@@ -0,0 +1,532 @@
+(ftf
+ (header
+ (version 2.0)
+ (unit DBUNIT)
+ )
+ (TechnologyContainer
+ (technology SamacSys_Footprint
+ (footprintLayer
+ (layer Top (type CONDUCTIVE))
+ (layer Inner (type CONDUCTIVE))
+ (layer Bottom (type CONDUCTIVE))
+ (layer Silk-Top (type SYMBOLMARK))
+ (layer Silk-Bottom (type SYMBOLMARK))
+ (layer Resist-Top (type SOLDERRESIST))
+ (layer Resist-Bottom (type SOLDERRESIST))
+ (layer MetalMask-Top (type METALMASK))
+ (layer MetalMask-Bottom (type METALMASK))
+ (layer CompArea-Top (type COMPAREA))
+ (layer CompArea-Bottom (type COMPAREA))
+ (layer Top_Assembly (type SYMBOLMARK))
+ (layer Bottom_Assembly (type SYMBOLMARK))
+ (layer Hole (type HOLE))
+ )
+ )
+ )
+ (footprintContainer
+ (commonParameters
+ (dimensionParameters
+ (arrowLength 100000)
+ (arrowAngle 15.000000)
+ (dotDiameter 100000)
+ (textFrameOffset 100000)
+ (arrowOffset 100000)
+ (dimAssistOffset 100000)
+ (dimLineWidth 10000)
+ (drawTextFrame NO)
+ (textFrameRange ALL)
+ (textClip YES)
+ (standard JIS)
+ )
+ )
+ (padstackGroups
+ (padstackGroup default)
+ )
+ (pads
+ (pad c115
+ (cuser "SamacSys")
+ (uuser "SamacSys")
+ (ctime 2017-06-16-12:00:00)
+ (utime 2017-06-16-12:00:00)
+ (photo FLASH)
+ (panelUse NO)
+ (propertyI padShape 2)
+ (propertyI diameter 115000)
+ (propertyI originXOffset 0)
+ (propertyI originYOffset 0)
+ )
+ (pad r115_115
+ (cuser "SamacSys")
+ (uuser "SamacSys")
+ (ctime 2017-06-16-12:00:00)
+ (utime 2017-06-16-12:00:00)
+ (photo FLASH)
+ (panelUse NO)
+ (propertyI padShape 5)
+ (propertyI angle 0)
+ (propertyI width 115000)
+ (propertyI height 115000)
+ (propertyI originXOffset 0)
+ (propertyI originYOffset 0)
+ )
+ ); End of pads
+ (padstacks
+ (padstack c115h75
+ (cuser "SamacSys")
+ (uuser "SamacSys")
+ (ctime 2017-06-16-12:00:00)
+ (utime 2017-06-16-12:00:00)
+ (type PLATED)
+ (throughMode THROUGH)
+ (panelUse NO)
+ (Hole (footLayer Hole)
+ (geometry
+ (circle 37500
+ (pt 0 0)
+ )
+ )
+ )
+ (padSet (footLayer Resist-Top)
+ (connect (pad c115))
+ )
+ (padSet (footLayer Resist-Bottom)
+ (connect (pad c115))
+ )
+ (padSet (footLayer Top)
+ (connect (pad c115))
+ (noconnect (pad c115))
+ )
+ (padSet (footLayer Inner)
+ (clearance (pad c115))
+ (connect (pad c115))
+ (noconnect (pad c115))
+ )
+ (padSet (footLayer Bottom)
+ (connect (pad c115))
+ (noconnect (pad c115))
+ )
+ )
+ (padstack r115_115h75
+ (cuser "SamacSys")
+ (uuser "SamacSys")
+ (ctime 2017-06-16-12:00:00)
+ (utime 2017-06-16-12:00:00)
+ (type PLATED)
+ (throughMode THROUGH)
+ (panelUse NO)
+ (Hole (footLayer Hole)
+ (geometry
+ (circle 37500
+ (pt 0 0)
+ )
+ )
+ )
+ (padSet (footLayer Resist-Top)
+ (connect (pad r115_115))
+ )
+ (padSet (footLayer Resist-Bottom)
+ (connect (pad r115_115))
+ )
+ (padSet (footLayer Top)
+ (connect (pad r115_115))
+ (noconnect (pad r115_115))
+ )
+ (padSet (footLayer Inner)
+ (clearance (pad c115))
+ (connect (pad c115))
+ (noconnect (pad c115))
+ )
+ (padSet (footLayer Bottom)
+ (connect (pad r115_115))
+ (noconnect (pad r115_115))
+ )
+ )
+ ); End of padstacks
+ (footprints
+ (footprint "DIP762W55P254L2642H457Q20N"
+ (polarity YES)
+ (cuser "SamacSys")
+ (uuser "SamacSys")
+ (utime 2018-09-08-16:46:04)
+ (panelUse NO)
+ (heelprint
+ (layout
+ (layer (footLayer CompArea-Top)
+ (area
+ (geometry
+ (surface
+ (outlineWidth 0)
+ (fillWidth 0)
+ (fillAngle 0.000000)
+ (vertex
+ (pt 463500 1383500)
+ (pt 463500 -1383500)
+ (pt -463500 -1383500)
+ (pt -463500 1383500)
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Top_Assembly)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt -330000 1358500
+ (width 10000)
+ )
+ (pt 330000 1358500
+ (width 10000)
+ )
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Top_Assembly)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt 330000 1358500
+ (width 10000)
+ )
+ (pt 330000 -1358500
+ (width 10000)
+ )
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Top_Assembly)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt 330000 -1358500
+ (width 10000)
+ )
+ (pt -330000 -1358500
+ (width 10000)
+ )
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Top_Assembly)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt -330000 -1358500
+ (width 10000)
+ )
+ (pt -330000 1358500
+ (width 10000)
+ )
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Top_Assembly)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt -330000 1231500
+ (width 10000)
+ )
+ (pt -203000 1358500
+ (width 10000)
+ )
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Silk-Top)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt -438500 1358500
+ (width 20000)
+ )
+ (pt 330000 1358500
+ (width 20000)
+ )
+ )
+ )
+ )
+ )
+ )
+ (layer (footLayer Silk-Top)
+ (line
+ (geometry
+ (line
+ (vertex
+ (pt -330000 -1358500
+ (width 20000)
+ )
+ (pt 330000 -1358500
+ (width 20000)
+ )
+ )
+ )
+ )
+ )
+ )
+ ); End of layout
+ ); End of heelprint
+ (toeprint
+ (pin 1
+ (pt -381000 1143000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 1143000)
+ (angle 90)
+ (padstackGroup default (padstack r115_115h75))
+ )
+ )
+ )
+ )
+ (pin 2
+ (pt -381000 889000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 889000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 3
+ (pt -381000 635000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 635000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 4
+ (pt -381000 381000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 381000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 5
+ (pt -381000 127000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 127000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 6
+ (pt -381000 -127000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 -127000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 7
+ (pt -381000 -381000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 -381000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 8
+ (pt -381000 -635000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 -635000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 9
+ (pt -381000 -889000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 -889000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 10
+ (pt -381000 -1143000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt -381000 -1143000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 11
+ (pt 381000 -1143000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 -1143000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 12
+ (pt 381000 -889000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 -889000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 13
+ (pt 381000 -635000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 -635000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 14
+ (pt 381000 -381000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 -381000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 15
+ (pt 381000 -127000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 -127000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 16
+ (pt 381000 127000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 127000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 17
+ (pt 381000 381000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 381000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 18
+ (pt 381000 635000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 635000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 19
+ (pt 381000 889000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 889000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ (pin 20
+ (pt 381000 1143000)
+ (layout
+ (layer (FPADSTACK)
+ (fpadstack
+ (pt 381000 1143000)
+ (angle 90)
+ (padstackGroup default (padstack c115h75))
+ )
+ )
+ )
+ )
+ ); End of toeprint
+ (propertyS accurateShape SN74LS273NE4.stp)
+ ); End of footprint
+ ); End of footprints
+ ); End of footprintContainer
+); End of ftf
+
diff --git a/circuit/SN74LS273NE4/eCADSTAR/DIP762W55P254L2642H457Q20N.packa b/circuit/SN74LS273NE4/eCADSTAR/DIP762W55P254L2642H457Q20N.packa
new file mode 100644
index 0000000..979a224
--- /dev/null
+++ b/circuit/SN74LS273NE4/eCADSTAR/DIP762W55P254L2642H457Q20N.packa
@@ -0,0 +1,13 @@
+(unit MM)
+
+(package "SN74LS273NE4"
+ (type UNDEF)
+ (uver 2)
+ (cuser "SamacSys")
+ (uuser "SamacSys")
+ (utime 2018-09-08-16:46:04)
+ (mountForm default
+ (footprintRef "DIP762W55P254L2642H457Q20N")
+ (spec "System")
+ )
+)
diff --git a/circuit/SN74LS273NE4/eCADSTAR/SN74LS273NE4.parta b/circuit/SN74LS273NE4/eCADSTAR/SN74LS273NE4.parta
new file mode 100644
index 0000000..7e4383a
--- /dev/null
+++ b/circuit/SN74LS273NE4/eCADSTAR/SN74LS273NE4.parta
@@ -0,0 +1,138 @@
+(Japanese_coding: sjis)
+(function "ECS_796887"
+ (uver 1)
+ (cuser "SamacSys")
+ (uuser "SamacSys")
+ (ctime 2018-05-27-10:09:59)
+ (utime 2018-09-08-16:46:04)
+ (interface
+ (port "1" (symbPinId 1) (portType INPUT))
+ (port "2" (symbPinId 2) (portType OUTPUT))
+ (port "3" (symbPinId 3) (portType INPUT))
+ (port "4" (symbPinId 4) (portType INPUT))
+ (port "5" (symbPinId 5) (portType OUTPUT))
+ (port "6" (symbPinId 6) (portType OUTPUT))
+ (port "7" (symbPinId 7) (portType INPUT))
+ (port "8" (symbPinId 8) (portType INPUT))
+ (port "9" (symbPinId 9) (portType OUTPUT))
+ (port "10" (symbPinId 10) (portType GROUND))
+ (port "11" (symbPinId 20) (portType POWER))
+ (port "12" (symbPinId 19) (portType OUTPUT))
+ (port "13" (symbPinId 18) (portType INPUT))
+ (port "14" (symbPinId 17) (portType INPUT))
+ (port "15" (symbPinId 16) (portType OUTPUT))
+ (port "16" (symbPinId 15) (portType OUTPUT))
+ (port "17" (symbPinId 14) (portType INPUT))
+ (port "18" (symbPinId 13) (portType INPUT))
+ (port "19" (symbPinId 12) (portType OUTPUT))
+ (port "20" (symbPinId 11) (portType INPUT))
+ )
+ (property "symbolName" "SN74LS273NE4")
+)
+
+
+(pinAssign "ECS_796887"
+ (uver 1)
+ (cuser "SamacSys")
+ (uuser "SamacSys")
+ (ctime 2018-05-27-10:09:59)
+ (utime 2018-09-08-16:46:04)
+ (interface
+ (port "1" (symbPinId 1) (portName "'CLR'") (portType INPUT))
+ (port "2" (symbPinId 2) (portName "1Q") (portType OUTPUT))
+ (port "3" (symbPinId 3) (portName "1D") (portType INPUT))
+ (port "4" (symbPinId 4) (portName "2D") (portType INPUT))
+ (port "5" (symbPinId 5) (portName "2Q") (portType OUTPUT))
+ (port "6" (symbPinId 6) (portName "3Q") (portType OUTPUT))
+ (port "7" (symbPinId 7) (portName "3D") (portType INPUT))
+ (port "8" (symbPinId 8) (portName "4D") (portType INPUT))
+ (port "9" (symbPinId 9) (portName "4Q") (portType OUTPUT))
+ (port "10" (symbPinId 10) (portName "GND") (portType GROUND))
+ (port "11" (symbPinId 20) (portName "CLK") (portType POWER))
+ (port "12" (symbPinId 19) (portName "5Q") (portType OUTPUT))
+ (port "13" (symbPinId 18) (portName "5D") (portType INPUT))
+ (port "14" (symbPinId 17) (portName "6D") (portType INPUT))
+ (port "15" (symbPinId 16) (portName "6Q") (portType OUTPUT))
+ (port "16" (symbPinId 15) (portName "7Q") (portType OUTPUT))
+ (port "17" (symbPinId 14) (portName "7D") (portType INPUT))
+ (port "18" (symbPinId 13) (portName "8D") (portType INPUT))
+ (port "19" (symbPinId 12) (portName "8Q") (portType OUTPUT))
+ (port "20" (symbPinId 11) (portName "VCC") (portType INPUT))
+ )
+ (internal
+ (funcInst (functionRef "ECS_796887")
+ (port "1" (match "1"))
+ (port "2" (match "2"))
+ (port "3" (match "3"))
+ (port "4" (match "4"))
+ (port "5" (match "5"))
+ (port "6" (match "6"))
+ (port "7" (match "7"))
+ (port "8" (match "8"))
+ (port "9" (match "9"))
+ (port "10" (match "10"))
+ (port "11" (match "11"))
+ (port "12" (match "12"))
+ (port "13" (match "13"))
+ (port "14" (match "14"))
+ (port "15" (match "15"))
+ (port "16" (match "16"))
+ (port "17" (match "17"))
+ (port "18" (match "18"))
+ (port "19" (match "19"))
+ (port "20" (match "20"))
+ )
+ )
+ (property "usePowerBox" "No")
+ (property "symbolName" "SN74LS273NE4")
+)
+
+
+(part "SN74LS273NE4"
+ (uver 1)
+ (cuser "SamacSys")
+ (uuser "SamacSys")
+ (ctime 2018-05-27-10:09:59)
+ (utime 2018-09-08-16:46:04)
+ (packageRef "SN74LS273NE4")
+ (pinAssignRef "ECS_796887")
+ (interface
+ (port "1" (symbPinId 1) (portName "'CLR'") (portType INPUT))
+ (port "2" (symbPinId 2) (portName "1Q") (portType OUTPUT))
+ (port "3" (symbPinId 3) (portName "1D") (portType INPUT))
+ (port "4" (symbPinId 4) (portName "2D") (portType INPUT))
+ (port "5" (symbPinId 5) (portName "2Q") (portType OUTPUT))
+ (port "6" (symbPinId 6) (portName "3Q") (portType OUTPUT))
+ (port "7" (symbPinId 7) (portName "3D") (portType INPUT))
+ (port "8" (symbPinId 8) (portName "4D") (portType INPUT))
+ (port "9" (symbPinId 9) (portName "4Q") (portType OUTPUT))
+ (port "10" (symbPinId 10) (portName "GND") (portType GROUND))
+ (port "11" (symbPinId 20) (portName "CLK") (portType POWER))
+ (port "12" (symbPinId 19) (portName "5Q") (portType OUTPUT))
+ (port "13" (symbPinId 18) (portName "5D") (portType INPUT))
+ (port "14" (symbPinId 17) (portName "6D") (portType INPUT))
+ (port "15" (symbPinId 16) (portName "6Q") (portType OUTPUT))
+ (port "16" (symbPinId 15) (portName "7Q") (portType OUTPUT))
+ (port "17" (symbPinId 14) (portName "7D") (portType INPUT))
+ (port "18" (symbPinId 13) (portName "8D") (portType INPUT))
+ (port "19" (symbPinId 12) (portName "8Q") (portType OUTPUT))
+ (port "20" (symbPinId 11) (portName "VCC") (portType INPUT))
+ )
+ (partClass UNDEF)
+ (useInSchema Y)
+ (useInLayout Y)
+ (inPartsList Y)
+ (partType NORMAL)
+ (placeRestriction FREE)
+ (property "enetNonSeries" "YES")
+ (property "refDesPrefix" "IC")
+ (property "description" "Flip Flops Octal D-Type Flip-Flop w/Clear")
+ (property "Mouser2_Part_Number" "595-SN74LS273NE4")
+ (property "Mouser2_Price/Stock" "https://www.mouser.com/Search/Refine.aspx?Keyword=595-SN74LS273NE4")
+ (property "Manufacturer_Name" "Texas Instruments")
+ (property "Manufacturer_Part_Number" "SN74LS273NE4")
+ (property "Datasheet_Link" "http://www.ti.com/lit/ds/sdls090/sdls090.pdf")
+ (property "compAreaTopHeight" 4.57)
+)
+
+
diff --git a/circuit/SN74LS273NE4/eCADSTAR/SN74LS273NE4.symba b/circuit/SN74LS273NE4/eCADSTAR/SN74LS273NE4.symba
new file mode 100644
index 0000000..fa79aaa
--- /dev/null
+++ b/circuit/SN74LS273NE4/eCADSTAR/SN74LS273NE4.symba
@@ -0,0 +1,187 @@
+LIB SN74LS273NE4
+ZONE 1 0 -1 50.000 50.000 0.000 0.000 0 A 1
+GRID 1 1 -1 -1 1.000 1.000 5 5
+SHT 1 1 -251658241 0.000 20.000 22.000 22.000
+PROP 0 updateUser 1
+SamacSys
+ENDPROP
+PROP 0 updateDate 1
+2018.09.08
+ENDPROP
+PROP 0 updateTime 1
+16:46:04
+ENDPROP
+PROP 0 componentType 1
+parts
+ENDPROP
+VIEW 1 1 0 -1 -1 19.000 6.000 0 1.000 3 reference
+VIEW 1 1 0 -1 -1 19.000 4.000 0 1.000 3 partName
+ENDSHT
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 4.000 2.000
+POINT - 18.000 2.000
+POINT - 18.000 -20.000
+POINT - 4.000 -20.000
+POINT - 4.000 2.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0.000 0.000
+POINT - 4.000 0.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0.000 -2.000
+POINT - 4.000 -2.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0.000 -4.000
+POINT - 4.000 -4.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0.000 -6.000
+POINT - 4.000 -6.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0.000 -8.000
+POINT - 4.000 -8.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0.000 -10.000
+POINT - 4.000 -10.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0.000 -12.000
+POINT - 4.000 -12.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0.000 -14.000
+POINT - 4.000 -14.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0.000 -16.000
+POINT - 4.000 -16.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 0.000 -18.000
+POINT - 4.000 -18.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22.000 0.000
+POINT - 18.000 0.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22.000 -2.000
+POINT - 18.000 -2.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22.000 -4.000
+POINT - 18.000 -4.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22.000 -6.000
+POINT - 18.000 -6.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22.000 -8.000
+POINT - 18.000 -8.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22.000 -10.000
+POINT - 18.000 -10.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22.000 -12.000
+POINT - 18.000 -12.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22.000 -14.000
+POINT - 18.000 -14.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22.000 -16.000
+POINT - 18.000 -16.000
+ENDLIN
+LINE 1 -1 -1 -1 -1 -1 -1
+POINT - 22.000 -18.000
+POINT - 18.000 -18.000
+ENDLIN
+PIN 1 1 0.000 0.000
+VIEW 1 1 0 -1 -1 2.8 0.4 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 0 0 1.000 3 pinLabel
+ENDPIN
+PIN 2 1 0.000 -2.000
+VIEW 1 1 0 -1 -1 2.8 -1.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -2 0 1.000 3 pinLabel
+ENDPIN
+PIN 3 1 0.000 -4.000
+VIEW 1 1 0 -1 -1 2.8 -3.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -4 0 1.000 3 pinLabel
+ENDPIN
+PIN 4 1 0.000 -6.000
+VIEW 1 1 0 -1 -1 2.8 -5.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -6 0 1.000 3 pinLabel
+ENDPIN
+PIN 5 1 0.000 -8.000
+VIEW 1 1 0 -1 -1 2.8 -7.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -8 0 1.000 3 pinLabel
+ENDPIN
+PIN 6 1 0.000 -10.000
+VIEW 1 1 0 -1 -1 2.8 -9.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -10 0 1.000 3 pinLabel
+ENDPIN
+PIN 7 1 0.000 -12.000
+VIEW 1 1 0 -1 -1 2.8 -11.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -12 0 1.000 3 pinLabel
+ENDPIN
+PIN 8 1 0.000 -14.000
+VIEW 1 1 0 -1 -1 2.8 -13.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -14 0 1.000 3 pinLabel
+ENDPIN
+PIN 9 1 0.000 -16.000
+VIEW 1 1 0 -1 -1 2.8 -15.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -16 0 1.000 3 pinLabel
+ENDPIN
+PIN 10 1 0.000 -18.000
+VIEW 1 1 0 -1 -1 2.8 -17.6 0 1.000 2 pinNumber
+VIEW 2 1 0 -1 -1 4.6 -18 0 1.000 3 pinLabel
+ENDPIN
+PIN 11 1 22.000 0.000
+VIEW 1 1 0 -1 -1 19.2 0.4 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 0 0 1.000 5 pinLabel
+ENDPIN
+PIN 12 1 22.000 -2.000
+VIEW 1 1 0 -1 -1 19.2 -1.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -2 0 1.000 5 pinLabel
+ENDPIN
+PIN 13 1 22.000 -4.000
+VIEW 1 1 0 -1 -1 19.2 -3.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -4 0 1.000 5 pinLabel
+ENDPIN
+PIN 14 1 22.000 -6.000
+VIEW 1 1 0 -1 -1 19.2 -5.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -6 0 1.000 5 pinLabel
+ENDPIN
+PIN 15 1 22.000 -8.000
+VIEW 1 1 0 -1 -1 19.2 -7.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -8 0 1.000 5 pinLabel
+ENDPIN
+PIN 16 1 22.000 -10.000
+VIEW 1 1 0 -1 -1 19.2 -9.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -10 0 1.000 5 pinLabel
+ENDPIN
+PIN 17 1 22.000 -12.000
+VIEW 1 1 0 -1 -1 19.2 -11.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -12 0 1.000 5 pinLabel
+ENDPIN
+PIN 18 1 22.000 -14.000
+VIEW 1 1 0 -1 -1 19.2 -13.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -14 0 1.000 5 pinLabel
+ENDPIN
+PIN 19 1 22.000 -16.000
+VIEW 1 1 0 -1 -1 19.2 -15.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -16 0 1.000 5 pinLabel
+ENDPIN
+PIN 20 1 22.000 -18.000
+VIEW 1 1 0 -1 -1 19.2 -17.6 0 1.000 0 pinNumber
+VIEW 2 1 0 -1 -1 17.4 -18 0 1.000 5 pinLabel
+ENDPIN
+ENDLIB
diff --git a/circuit/SN74LS273NE4/part_info.txt b/circuit/SN74LS273NE4/part_info.txt
new file mode 100644
index 0000000..c9b5db6
--- /dev/null
+++ b/circuit/SN74LS273NE4/part_info.txt
@@ -0,0 +1,9 @@
+Manufacturer=Texas Instruments
+PartNumber=SN74LS273NE4
+PartCategory=Integrated Circuit
+PackageCategory=Dual-In-Line Packages
+PinCount=20
+Version=2.1
+Released=2018-05-27 10:09:59
+Downloaded=2020-04-22 17:25:09
+3D=Y
diff --git a/circuit/SN74LS273NE4/xDX Designer/SN74LS273NE4.1 b/circuit/SN74LS273NE4/xDX Designer/SN74LS273NE4.1
new file mode 100644
index 0000000..be90f8f
--- /dev/null
+++ b/circuit/SN74LS273NE4/xDX Designer/SN74LS273NE4.1
@@ -0,0 +1,98 @@
+V 54
+K 1
+D 0 -2286000 2794000 0
+Y 1
+U 2413000 762000 254000 0 2 3 REFDES=IC?
+U 2413000 508000 254000 0 2 3 DEVICE=SN74LS273NE4
+U 2413000 254000 254000 0 2 0 PKG_TYPE=DIP762W55P254L2642H457Q20N
+U 2413000 0 254000 0 2 0 Description=Flip Flops Octal D-Type Flip-Flop w/Clear
+U 2413000 -254000 254000 0 2 0 Datasheet Link=http://www.ti.com/lit/ds/sdls090/sdls090.pdf
+U 2413000 -508000 254000 0 2 0 Height=4.57
+U 2413000 -762000 254000 0 2 0 Mouser2 Part Number=595-SN74LS273NE4
+U 2413000 -1016000 254000 0 2 0 Mouser2 Price/Stock=https://www.mouser.com/Search/Refine.aspx?Keyword=595-SN74LS273NE4
+U 2413000 -1270000 254000 0 2 0 Manufacturer_Name=Texas Instruments
+U 2413000 -1524000 254000 0 2 0 Manufacturer_Part_Number=SN74LS273NE4
+U 0 0 254000 0 1 0 FORWARD_PCB=1
+l 5 508000 254000 2286000 254000 2286000 -2540000 508000 -2540000 508000 254000
+|GRPHSTL -1 -1 -1 1
+P 1 0 0 508000 0 0 2 0
+L 584200 0 228600 0 2 0 1 0 ~CLR
+A 355600 50800 203200 0 9 3 #=1
+A 0 0 9 0 3 0 PINTYPE=IN
+P 2 0 -254000 508000 -254000 0 2 0
+L 584200 -254000 228600 0 2 0 1 0 1Q
+A 355600 -203200 203200 0 9 3 #=2
+A 0 0 9 0 3 0 PINTYPE=IN
+P 3 0 -508000 508000 -508000 0 2 0
+L 584200 -508000 228600 0 2 0 1 0 1D
+A 355600 -457200 203200 0 9 3 #=3
+A 0 0 9 0 3 0 PINTYPE=IN
+P 4 0 -762000 508000 -762000 0 2 0
+L 584200 -762000 228600 0 2 0 1 0 2D
+A 355600 -711200 203200 0 9 3 #=4
+A 0 0 9 0 3 0 PINTYPE=IN
+P 5 0 -1016000 508000 -1016000 0 2 0
+L 584200 -1016000 228600 0 2 0 1 0 2Q
+A 355600 -965200 203200 0 9 3 #=5
+A 0 0 9 0 3 0 PINTYPE=IN
+P 6 0 -1270000 508000 -1270000 0 2 0
+L 584200 -1270000 228600 0 2 0 1 0 3Q
+A 355600 -1219200 203200 0 9 3 #=6
+A 0 0 9 0 3 0 PINTYPE=IN
+P 7 0 -1524000 508000 -1524000 0 2 0
+L 584200 -1524000 228600 0 2 0 1 0 3D
+A 355600 -1473200 203200 0 9 3 #=7
+A 0 0 9 0 3 0 PINTYPE=IN
+P 8 0 -1778000 508000 -1778000 0 2 0
+L 584200 -1778000 228600 0 2 0 1 0 4D
+A 355600 -1727200 203200 0 9 3 #=8
+A 0 0 9 0 3 0 PINTYPE=IN
+P 9 0 -2032000 508000 -2032000 0 2 0
+L 584200 -2032000 228600 0 2 0 1 0 4Q
+A 355600 -1981200 203200 0 9 3 #=9
+A 0 0 9 0 3 0 PINTYPE=IN
+P 10 0 -2286000 508000 -2286000 0 2 0
+L 584200 -2286000 228600 0 2 0 1 0 GND
+A 355600 -2235200 203200 0 9 3 #=10
+A 0 0 9 0 3 0 PINTYPE=IN
+P 11 2794000 0 2286000 0 0 3 0
+L 2209800 0 228600 0 8 0 1 0 VCC
+A 2438400 50800 203200 0 3 3 #=20
+A 0 0 9 0 3 0 PINTYPE=IN
+P 12 2794000 -254000 2286000 -254000 0 3 0
+L 2209800 -254000 228600 0 8 0 1 0 8Q
+A 2438400 -203200 203200 0 3 3 #=19
+A 0 0 9 0 3 0 PINTYPE=IN
+P 13 2794000 -508000 2286000 -508000 0 3 0
+L 2209800 -508000 228600 0 8 0 1 0 8D
+A 2438400 -457200 203200 0 3 3 #=18
+A 0 0 9 0 3 0 PINTYPE=IN
+P 14 2794000 -762000 2286000 -762000 0 3 0
+L 2209800 -762000 228600 0 8 0 1 0 7D
+A 2438400 -711200 203200 0 3 3 #=17
+A 0 0 9 0 3 0 PINTYPE=IN
+P 15 2794000 -1016000 2286000 -1016000 0 3 0
+L 2209800 -1016000 228600 0 8 0 1 0 7Q
+A 2438400 -965200 203200 0 3 3 #=16
+A 0 0 9 0 3 0 PINTYPE=IN
+P 16 2794000 -1270000 2286000 -1270000 0 3 0
+L 2209800 -1270000 228600 0 8 0 1 0 6Q
+A 2438400 -1219200 203200 0 3 3 #=15
+A 0 0 9 0 3 0 PINTYPE=IN
+P 17 2794000 -1524000 2286000 -1524000 0 3 0
+L 2209800 -1524000 228600 0 8 0 1 0 6D
+A 2438400 -1473200 203200 0 3 3 #=14
+A 0 0 9 0 3 0 PINTYPE=IN
+P 18 2794000 -1778000 2286000 -1778000 0 3 0
+L 2209800 -1778000 228600 0 8 0 1 0 5D
+A 2438400 -1727200 203200 0 3 3 #=13
+A 0 0 9 0 3 0 PINTYPE=IN
+P 19 2794000 -2032000 2286000 -2032000 0 3 0
+L 2209800 -2032000 228600 0 8 0 1 0 5Q
+A 2438400 -1981200 203200 0 3 3 #=12
+A 0 0 9 0 3 0 PINTYPE=IN
+P 20 2794000 -2286000 2286000 -2286000 0 3 0
+L 2209800 -2286000 228600 0 8 0 1 0 CLK
+A 2438400 -2235200 203200 0 3 3 #=11
+A 0 0 9 0 3 0 PINTYPE=IN
+E
diff --git a/cpm/22srcimg/22src1.img b/cpm/22srcimg/22src1.img
new file mode 100644
index 0000000..d005ca8
Binary files /dev/null and b/cpm/22srcimg/22src1.img differ
diff --git a/cpm/22srcimg/22src2.img b/cpm/22srcimg/22src2.img
new file mode 100644
index 0000000..46c047e
Binary files /dev/null and b/cpm/22srcimg/22src2.img differ
diff --git a/cpm/cpm2-asm/CPM22.ASM b/cpm/cpm2-asm/CPM22.ASM
new file mode 100644
index 0000000..4784bca
--- /dev/null
+++ b/cpm/cpm2-asm/CPM22.ASM
@@ -0,0 +1,3739 @@
+
+;**************************************************************
+;*
+;* C P / M version 2 . 2
+;*
+;* Reconstructed from memory image on February 27, 1981
+;*
+;* by Clark A. Calkins
+;*
+;**************************************************************
+;
+; Set memory limit here. This is the amount of contigeous
+; ram starting from 0000. CP/M will reside at the end of this space.
+;
+MEM EQU 62 ;for a 62k system (TS802 TEST - WORKS OK).
+;
+IOBYTE EQU 3 ;i/o definition byte.
+TDRIVE EQU 4 ;current drive name and user number.
+ENTRY EQU 5 ;entry point for the cp/m bdos.
+TFCB EQU 5CH ;default file control block.
+TBUFF EQU 80H ;i/o buffer and command line storage.
+TBASE EQU 100H ;transiant program storage area.
+;
+; Set control character equates.
+;
+CNTRLC EQU 3 ;control-c
+CNTRLE EQU 05H ;control-e
+BS EQU 08H ;backspace
+TAB EQU 09H ;tab
+LF EQU 0AH ;line feed
+FF EQU 0CH ;form feed
+CR EQU 0DH ;carriage return
+CNTRLP EQU 10H ;control-p
+CNTRLR EQU 12H ;control-r
+CNTRLS EQU 13H ;control-s
+CNTRLU EQU 15H ;control-u
+CNTRLX EQU 18H ;control-x
+CNTRLZ EQU 1AH ;control-z (end-of-file mark)
+DEL EQU 7FH ;rubout
+;
+; Set origin for CP/M
+;
+ ORG (MEM-7)*1024
+;
+CBASE JMP COMMAND ;execute command processor (ccp).
+ JMP CLEARBUF ;entry to empty input buffer before starting ccp.
+
+;
+; Standard cp/m ccp input buffer. Format is (max length),
+; (actual length), (char #1), (char #2), (char #3), etc.
+;
+INBUFF DB 127 ;length of input buffer.
+ DB 0 ;current length of contents.
+ DB 'Copyright'
+ DB ' 1979 (c) by Digital Research '
+ DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+INPOINT DW INBUFF+2;input line pointer
+NAMEPNT DW 0 ;input line pointer used for error message. Points to
+; ;start of name in error.
+;
+; Routine to print (A) on the console. All registers used.
+;
+PRINT MOV E,A ;setup bdos call.
+ MVI C,2
+ JMP ENTRY
+;
+; Routine to print (A) on the console and to save (BC).
+;
+PRINTB PUSH B
+ CALL PRINT
+ POP B
+ RET
+;
+; Routine to send a carriage return, line feed combination
+; to the console.
+;
+CRLF MVI A,CR
+ CALL PRINTB
+ MVI A,LF
+ JMP PRINTB
+;
+; Routine to send one space to the console and save (BC).
+;
+SPACE MVI A,' '
+ JMP PRINTB
+;
+; Routine to print character string pointed to be (BC) on the
+; console. It must terminate with a null byte.
+;
+PLINE PUSH B
+ CALL CRLF
+ POP H
+PLINE2 MOV A,M
+ ORA A
+ RZ
+ INX H
+ PUSH H
+ CALL PRINT
+ POP H
+ JMP PLINE2
+;
+; Routine to reset the disk system.
+;
+RESDSK MVI C,13
+ JMP ENTRY
+;
+; Routine to select disk (A).
+;
+DSKSEL MOV E,A
+ MVI C,14
+ JMP ENTRY
+;
+; Routine to call bdos and save the return code. The zero
+; flag is set on a return of 0ffh.
+;
+ENTRY1 CALL ENTRY
+ STA RTNCODE ;save return code.
+ INR A ;set zero if 0ffh returned.
+ RET
+;
+; Routine to open a file. (DE) must point to the FCB.
+;
+OPEN MVI C,15
+ JMP ENTRY1
+;
+; Routine to open file at (FCB).
+;
+OPENFCB XRA A ;clear the record number byte at fcb+32
+ STA FCB+32
+ LXI D,FCB
+ JMP OPEN
+;
+; Routine to close a file. (DE) points to FCB.
+;
+CLOSE MVI C,16
+ JMP ENTRY1
+;
+; Routine to search for the first file with ambigueous name
+; (DE).
+;
+SRCHFST MVI C,17
+ JMP ENTRY1
+;
+; Search for the next ambigeous file name.
+;
+SRCHNXT MVI C,18
+ JMP ENTRY1
+;
+; Search for file at (FCB).
+;
+SRCHFCB LXI D,FCB
+ JMP SRCHFST
+;
+; Routine to delete a file pointed to by (DE).
+;
+DELETE MVI C,19
+ JMP ENTRY
+;
+; Routine to call the bdos and set the zero flag if a zero
+; status is returned.
+;
+ENTRY2 CALL ENTRY
+ ORA A ;set zero flag if appropriate.
+ RET
+;
+; Routine to read the next record from a sequential file.
+; (DE) points to the FCB.
+;
+RDREC MVI C,20
+ JMP ENTRY2
+;
+; Routine to read file at (FCB).
+;
+READFCB LXI D,FCB
+ JMP RDREC
+;
+; Routine to write the next record of a sequential file.
+; (DE) points to the FCB.
+;
+WRTREC MVI C,21
+ JMP ENTRY2
+;
+; Routine to create the file pointed to by (DE).
+;
+CREATE MVI C,22
+ JMP ENTRY1
+;
+; Routine to rename the file pointed to by (DE). Note that
+; the new name starts at (DE+16).
+;
+RENAM MVI C,23
+ JMP ENTRY
+;
+; Get the current user code.
+;
+GETUSR MVI E,0FFH
+;
+; Routne to get or set the current user code.
+; If (E) is FF then this is a GET, else it is a SET.
+;
+GETSETUC:MVI C,32
+ JMP ENTRY
+;
+; Routine to set the current drive byte at (TDRIVE).
+;
+SETCDRV CALL GETUSR ;get user number
+ ADD A ;and shift into the upper 4 bits.
+ ADD A
+ ADD A
+ ADD A
+ LXI H,CDRIVE;now add in the current drive number.
+ ORA M
+ STA TDRIVE ;and save.
+ RET
+;
+; Move currently active drive down to (TDRIVE).
+;
+MOVECD LDA CDRIVE
+ STA TDRIVE
+ RET
+;
+; Routine to convert (A) into upper case ascii. Only letters
+; are affected.
+;
+UPPER CPI 'a' ;check for letters in the range of 'a' to 'z'.
+ RC
+ CPI '{'
+ RNC
+ ANI 5FH ;convert it if found.
+ RET
+;
+; Routine to get a line of input. We must check to see if the
+; user is in (BATCH) mode. If so, then read the input from file
+; ($$$.SUB). At the end, reset to console input.
+;
+GETINP LDA BATCH ;if =0, then use console input.
+ ORA A
+ JZ GETINP1
+;
+; Use the submit file ($$$.sub) which is prepared by a
+; SUBMIT run. It must be on drive (A) and it will be deleted
+; if and error occures (like eof).
+;
+ LDA CDRIVE ;select drive 0 if need be.
+ ORA A
+ MVI A,0 ;always use drive A for submit.
+ CNZ DSKSEL ;select it if required.
+ LXI D,BATCHFCB
+ CALL OPEN ;look for it.
+ JZ GETINP1 ;if not there, use normal input.
+ LDA BATCHFCB+15;get last record number+1.
+ DCR A
+ STA BATCHFCB+32
+ LXI D,BATCHFCB
+ CALL RDREC ;read last record.
+ JNZ GETINP1 ;quit on end of file.
+;
+; Move this record into input buffer.
+;
+ LXI D,INBUFF+1
+ LXI H,TBUFF ;data was read into buffer here.
+ MVI B,128 ;all 128 characters may be used.
+ CALL HL2DE ;(HL) to (DE), (B) bytes.
+ LXI H,BATCHFCB+14
+ MVI M,0 ;zero out the 's2' byte.
+ INX H ;and decrement the record count.
+ DCR M
+ LXI D,BATCHFCB;close the batch file now.
+ CALL CLOSE
+ JZ GETINP1 ;quit on an error.
+ LDA CDRIVE ;re-select previous drive if need be.
+ ORA A
+ CNZ DSKSEL ;don't do needless selects.
+;
+; Print line just read on console.
+;
+ LXI H,INBUFF+2
+ CALL PLINE2
+ CALL CHKCON ;check console, quit on a key.
+ JZ GETINP2 ;jump if no key is pressed.
+;
+; Terminate the submit job on any keyboard input. Delete this
+; file such that it is not re-started and jump to normal keyboard
+; input section.
+;
+ CALL DELBATCH;delete the batch file.
+ JMP CMMND1 ;and restart command input.
+;
+; Get here for normal keyboard input. Delete the submit file
+; incase there was one.
+;
+GETINP1 CALL DELBATCH;delete file ($$$.sub).
+ CALL SETCDRV ;reset active disk.
+ MVI C,10 ;get line from console device.
+ LXI D,INBUFF
+ CALL ENTRY
+ CALL MOVECD ;reset current drive (again).
+;
+; Convert input line to upper case.
+;
+GETINP2 LXI H,INBUFF+1
+ MOV B,M ;(B)=character counter.
+GETINP3 INX H
+ MOV A,B ;end of the line?
+ ORA A
+ JZ GETINP4
+ MOV A,M ;convert to upper case.
+ CALL UPPER
+ MOV M,A
+ DCR B ;adjust character count.
+ JMP GETINP3
+GETINP4 MOV M,A ;add trailing null.
+ LXI H,INBUFF+2
+ SHLD INPOINT ;reset input line pointer.
+ RET
+;
+; Routine to check the console for a key pressed. The zero
+; flag is set is none, else the character is returned in (A).
+;
+CHKCON MVI C,11 ;check console.
+ CALL ENTRY
+ ORA A
+ RZ ;return if nothing.
+ MVI C,1 ;else get character.
+ CALL ENTRY
+ ORA A ;clear zero flag and return.
+ RET
+;
+; Routine to get the currently active drive number.
+;
+GETDSK MVI C,25
+ JMP ENTRY
+;
+; Set the stabdard dma address.
+;
+STDDMA LXI D,TBUFF
+;
+; Routine to set the dma address to (DE).
+;
+DMASET MVI C,26
+ JMP ENTRY
+;
+; Delete the batch file created by SUBMIT.
+;
+DELBATCH:LXI H,BATCH ;is batch active?
+ MOV A,M
+ ORA A
+ RZ
+ MVI M,0 ;yes, de-activate it.
+ XRA A
+ CALL DSKSEL ;select drive 0 for sure.
+ LXI D,BATCHFCB;and delete this file.
+ CALL DELETE
+ LDA CDRIVE ;reset current drive.
+ JMP DSKSEL
+;
+; Check to two strings at (PATTRN1) and (PATTRN2). They must be
+; the same or we halt....
+;
+VERIFY LXI D,PATTRN1;these are the serial number bytes.
+ LXI H,PATTRN2;ditto, but how could they be different?
+ MVI B,6 ;6 bytes each.
+VERIFY1 LDAX D
+ CMP M
+ JNZ HALT ;jump to halt routine.
+ INX D
+ INX H
+ DCR B
+ JNZ VERIFY1
+ RET
+;
+; Print back file name with a '?' to indicate a syntax error.
+;
+SYNERR CALL CRLF ;end current line.
+ LHLD NAMEPNT ;this points to name in error.
+SYNERR1 MOV A,M ;print it until a space or null is found.
+ CPI ' '
+ JZ SYNERR2
+ ORA A
+ JZ SYNERR2
+ PUSH H
+ CALL PRINT
+ POP H
+ INX H
+ JMP SYNERR1
+SYNERR2 MVI A,'?' ;add trailing '?'.
+ CALL PRINT
+ CALL CRLF
+ CALL DELBATCH;delete any batch file.
+ JMP CMMND1 ;and restart from console input.
+;
+; Check character at (DE) for legal command input. Note that the
+; zero flag is set if the character is a delimiter.
+;
+CHECK LDAX D
+ ORA A
+ RZ
+ CPI ' ' ;control characters are not legal here.
+ JC SYNERR
+ RZ ;check for valid delimiter.
+ CPI '='
+ RZ
+ CPI '_'
+ RZ
+ CPI '.'
+ RZ
+ CPI ':'
+ RZ
+ CPI ';'
+ RZ
+ CPI '<'
+ RZ
+ CPI '>'
+ RZ
+ RET
+;
+; Get the next non-blank character from (DE).
+;
+NONBLANK:LDAX D
+ ORA A ;string ends with a null.
+ RZ
+ CPI ' '
+ RNZ
+ INX D
+ JMP NONBLANK
+;
+; Add (HL)=(HL)+(A)
+;
+ADDHL ADD L
+ MOV L,A
+ RNC ;take care of any carry.
+ INR H
+ RET
+;
+; Convert the first name in (FCB).
+;
+CONVFST MVI A,0
+;
+; Format a file name (convert * to '?', etc.). On return,
+; (A)=0 is an unambigeous name was specified. Enter with (A) equal to
+; the position within the fcb for the name (either 0 or 16).
+;
+CONVERT LXI H,FCB
+ CALL ADDHL
+ PUSH H
+ PUSH H
+ XRA A
+ STA CHGDRV ;initialize drive change flag.
+ LHLD INPOINT ;set (HL) as pointer into input line.
+ XCHG
+ CALL NONBLANK;get next non-blank character.
+ XCHG
+ SHLD NAMEPNT ;save pointer here for any error message.
+ XCHG
+ POP H
+ LDAX D ;get first character.
+ ORA A
+ JZ CONVRT1
+ SBI 'A'-1 ;might be a drive name, convert to binary.
+ MOV B,A ;and save.
+ INX D ;check next character for a ':'.
+ LDAX D
+ CPI ':'
+ JZ CONVRT2
+ DCX D ;nope, move pointer back to the start of the line.
+CONVRT1 LDA CDRIVE
+ MOV M,A
+ JMP CONVRT3
+CONVRT2 MOV A,B
+ STA CHGDRV ;set change in drives flag.
+ MOV M,B
+ INX D
+;
+; Convert the basic file name.
+;
+CONVRT3 MVI B,08H
+CONVRT4 CALL CHECK
+ JZ CONVRT8
+ INX H
+ CPI '*' ;note that an '*' will fill the remaining
+ JNZ CONVRT5 ;field with '?'.
+ MVI M,'?'
+ JMP CONVRT6
+CONVRT5 MOV M,A
+ INX D
+CONVRT6 DCR B
+ JNZ CONVRT4
+CONVRT7 CALL CHECK ;get next delimiter.
+ JZ GETEXT
+ INX D
+ JMP CONVRT7
+CONVRT8 INX H ;blank fill the file name.
+ MVI M,' '
+ DCR B
+ JNZ CONVRT8
+;
+; Get the extension and convert it.
+;
+GETEXT MVI B,03H
+ CPI '.'
+ JNZ GETEXT5
+ INX D
+GETEXT1 CALL CHECK
+ JZ GETEXT5
+ INX H
+ CPI '*'
+ JNZ GETEXT2
+ MVI M,'?'
+ JMP GETEXT3
+GETEXT2 MOV M,A
+ INX D
+GETEXT3 DCR B
+ JNZ GETEXT1
+GETEXT4 CALL CHECK
+ JZ GETEXT6
+ INX D
+ JMP GETEXT4
+GETEXT5 INX H
+ MVI M,' '
+ DCR B
+ JNZ GETEXT5
+GETEXT6 MVI B,3
+GETEXT7 INX H
+ MVI M,0
+ DCR B
+ JNZ GETEXT7
+ XCHG
+ SHLD INPOINT ;save input line pointer.
+ POP H
+;
+; Check to see if this is an ambigeous file name specification.
+; Set the (A) register to non zero if it is.
+;
+ LXI B,11 ;set name length.
+GETEXT8 INX H
+ MOV A,M
+ CPI '?' ;any question marks?
+ JNZ GETEXT9
+ INR B ;count them.
+GETEXT9 DCR C
+ JNZ GETEXT8
+ MOV A,B
+ ORA A
+ RET
+;
+; CP/M command table. Note commands can be either 3 or 4 characters long.
+;
+NUMCMDS EQU 6 ;number of commands
+CMDTBL DB 'DIR '
+ DB 'ERA '
+ DB 'TYPE'
+ DB 'SAVE'
+ DB 'REN '
+ DB 'USER'
+;
+; The following six bytes must agree with those at (PATTRN2)
+; or cp/m will HALT. Why?
+;
+PATTRN1 DB 0,22,0,0,0,0;(* serial number bytes *).
+;
+; Search the command table for a match with what has just
+; been entered. If a match is found, then we jump to the
+; proper section. Else jump to (UNKNOWN).
+; On return, the (C) register is set to the command number
+; that matched (or NUMCMDS+1 if no match).
+;
+SEARCH LXI H,CMDTBL
+ MVI C,0
+SEARCH1 MOV A,C
+ CPI NUMCMDS ;this commands exists.
+ RNC
+ LXI D,FCB+1 ;check this one.
+ MVI B,4 ;max command length.
+SEARCH2 LDAX D
+ CMP M
+ JNZ SEARCH3 ;not a match.
+ INX D
+ INX H
+ DCR B
+ JNZ SEARCH2
+ LDAX D ;allow a 3 character command to match.
+ CPI ' '
+ JNZ SEARCH4
+ MOV A,C ;set return register for this command.
+ RET
+SEARCH3 INX H
+ DCR B
+ JNZ SEARCH3
+SEARCH4 INR C
+ JMP SEARCH1
+;
+; Set the input buffer to empty and then start the command
+; processor (ccp).
+;
+CLEARBUF:XRA A
+ STA INBUFF+1;second byte is actual length.
+;
+;**************************************************************
+;*
+;*
+;* C C P - C o n s o l e C o m m a n d P r o c e s s o r
+;*
+;**************************************************************
+;*
+COMMAND LXI SP,CCPSTACK;setup stack area.
+ PUSH B ;note that (C) should be equal to:
+ MOV A,C ;(uuuudddd) where 'uuuu' is the user number
+ RAR ;and 'dddd' is the drive number.
+ RAR
+ RAR
+ RAR
+ ANI 0FH ;isolate the user number.
+ MOV E,A
+ CALL GETSETUC;and set it.
+ CALL RESDSK ;reset the disk system.
+ STA BATCH ;clear batch mode flag.
+ POP B
+ MOV A,C
+ ANI 0FH ;isolate the drive number.
+ STA CDRIVE ;and save.
+ CALL DSKSEL ;...and select.
+ LDA INBUFF+1
+ ORA A ;anything in input buffer already?
+ JNZ CMMND2 ;yes, we just process it.
+;
+; Entry point to get a command line from the console.
+;
+CMMND1 LXI SP,CCPSTACK;set stack straight.
+ CALL CRLF ;start a new line on the screen.
+ CALL GETDSK ;get current drive.
+ ADI 'a'
+ CALL PRINT ;print current drive.
+ MVI A,'>'
+ CALL PRINT ;and add prompt.
+ CALL GETINP ;get line from user.
+;
+; Process command line here.
+;
+CMMND2 LXI D,TBUFF
+ CALL DMASET ;set standard dma address.
+ CALL GETDSK
+ STA CDRIVE ;set current drive.
+ CALL CONVFST ;convert name typed in.
+ CNZ SYNERR ;wild cards are not allowed.
+ LDA CHGDRV ;if a change in drives was indicated,
+ ORA A ;then treat this as an unknown command
+ JNZ UNKNOWN ;which gets executed.
+ CALL SEARCH ;else search command table for a match.
+;
+; Note that an unknown command returns
+; with (A) pointing to the last address
+; in our table which is (UNKNOWN).
+;
+ LXI H,CMDADR;now, look thru our address table for command (A).
+ MOV E,A ;set (DE) to command number.
+ MVI D,0
+ DAD D
+ DAD D ;(HL)=(CMDADR)+2*(command number).
+ MOV A,M ;now pick out this address.
+ INX H
+ MOV H,M
+ MOV L,A
+ PCHL ;now execute it.
+;
+; CP/M command address table.
+;
+CMDADR DW DIRECT,ERASE,TYPE,SAVE
+ DW RENAME,USER,UNKNOWN
+;
+; Halt the system. Reason for this is unknown at present.
+;
+HALT LXI H,76F3H ;'DI HLT' instructions.
+ SHLD CBASE
+ LXI H,CBASE
+ PCHL
+;
+; Read error while TYPEing a file.
+;
+RDERROR LXI B,RDERR
+ JMP PLINE
+RDERR DB 'Read error',0
+;
+; Required file was not located.
+;
+NONE LXI B,NOFILE
+ JMP PLINE
+NOFILE DB 'No file',0
+;
+; Decode a command of the form 'A>filename number{ filename}.
+; Note that a drive specifier is not allowed on the first file
+; name. On return, the number is in register (A). Any error
+; causes 'filename?' to be printed and the command is aborted.
+;
+DECODE CALL CONVFST ;convert filename.
+ LDA CHGDRV ;do not allow a drive to be specified.
+ ORA A
+ JNZ SYNERR
+ LXI H,FCB+1 ;convert number now.
+ LXI B,11 ;(B)=sum register, (C)=max digit count.
+DECODE1 MOV A,M
+ CPI ' ' ;a space terminates the numeral.
+ JZ DECODE3
+ INX H
+ SUI '0' ;make binary from ascii.
+ CPI 10 ;legal digit?
+ JNC SYNERR
+ MOV D,A ;yes, save it in (D).
+ MOV A,B ;compute (B)=(B)*10 and check for overflow.
+ ANI 0E0H
+ JNZ SYNERR
+ MOV A,B
+ RLC
+ RLC
+ RLC ;(A)=(B)*8
+ ADD B ;.......*9
+ JC SYNERR
+ ADD B ;.......*10
+ JC SYNERR
+ ADD D ;add in new digit now.
+DECODE2 JC SYNERR
+ MOV B,A ;and save result.
+ DCR C ;only look at 11 digits.
+ JNZ DECODE1
+ RET
+DECODE3 MOV A,M ;spaces must follow (why?).
+ CPI ' '
+ JNZ SYNERR
+ INX H
+DECODE4 DCR C
+ JNZ DECODE3
+ MOV A,B ;set (A)=the numeric value entered.
+ RET
+;
+; Move 3 bytes from (HL) to (DE). Note that there is only
+; one reference to this at (A2D5h).
+;
+MOVE3 MVI B,3
+;
+; Move (B) bytes from (HL) to (DE).
+;
+HL2DE MOV A,M
+ STAX D
+ INX H
+ INX D
+ DCR B
+ JNZ HL2DE
+ RET
+;
+; Compute (HL)=(TBUFF)+(A)+(C) and get the byte that's here.
+;
+EXTRACT LXI H,TBUFF
+ ADD C
+ CALL ADDHL
+ MOV A,M
+ RET
+;
+; Check drive specified. If it means a change, then the new
+; drive will be selected. In any case, the drive byte of the
+; fcb will be set to null (means use current drive).
+;
+DSELECT XRA A ;null out first byte of fcb.
+ STA FCB
+ LDA CHGDRV ;a drive change indicated?
+ ORA A
+ RZ
+ DCR A ;yes, is it the same as the current drive?
+ LXI H,CDRIVE
+ CMP M
+ RZ
+ JMP DSKSEL ;no. Select it then.
+;
+; Check the drive selection and reset it to the previous
+; drive if it was changed for the preceeding command.
+;
+RESETDR LDA CHGDRV ;drive change indicated?
+ ORA A
+ RZ
+ DCR A ;yes, was it a different drive?
+ LXI H,CDRIVE
+ CMP M
+ RZ
+ LDA CDRIVE ;yes, re-select our old drive.
+ JMP DSKSEL
+;
+;**************************************************************
+;*
+;* D I R E C T O R Y C O M M A N D
+;*
+;**************************************************************
+;
+DIRECT CALL CONVFST ;convert file name.
+ CALL DSELECT ;select indicated drive.
+ LXI H,FCB+1 ;was any file indicated?
+ MOV A,M
+ CPI ' '
+ JNZ DIRECT2
+ MVI B,11 ;no. Fill field with '?' - same as *.*.
+DIRECT1 MVI M,'?'
+ INX H
+ DCR B
+ JNZ DIRECT1
+DIRECT2 MVI E,0 ;set initial cursor position.
+ PUSH D
+ CALL SRCHFCB ;get first file name.
+ CZ NONE ;none found at all?
+DIRECT3 JZ DIRECT9 ;terminate if no more names.
+ LDA RTNCODE ;get file's position in segment (0-3).
+ RRC
+ RRC
+ RRC
+ ANI 60H ;(A)=position*32
+ MOV C,A
+ MVI A,10
+ CALL EXTRACT ;extract the tenth entry in fcb.
+ RAL ;check system file status bit.
+ JC DIRECT8 ;we don't list them.
+ POP D
+ MOV A,E ;bump name count.
+ INR E
+ PUSH D
+ ANI 03H ;at end of line?
+ PUSH PSW
+ JNZ DIRECT4
+ CALL CRLF ;yes, end this line and start another.
+ PUSH B
+ CALL GETDSK ;start line with ('A:').
+ POP B
+ ADI 'A'
+ CALL PRINTB
+ MVI A,':'
+ CALL PRINTB
+ JMP DIRECT5
+DIRECT4 CALL SPACE ;add seperator between file names.
+ MVI A,':'
+ CALL PRINTB
+DIRECT5 CALL SPACE
+ MVI B,1 ;'extract' each file name character at a time.
+DIRECT6 MOV A,B
+ CALL EXTRACT
+ ANI 7FH ;strip bit 7 (status bit).
+ CPI ' ' ;are we at the end of the name?
+ JNZ DRECT65
+ POP PSW ;yes, don't print spaces at the end of a line.
+ PUSH PSW
+ CPI 3
+ JNZ DRECT63
+ MVI A,9 ;first check for no extension.
+ CALL EXTRACT
+ ANI 7FH
+ CPI ' '
+ JZ DIRECT7 ;don't print spaces.
+DRECT63 MVI A,' ' ;else print them.
+DRECT65 CALL PRINTB
+ INR B ;bump to next character psoition.
+ MOV A,B
+ CPI 12 ;end of the name?
+ JNC DIRECT7
+ CPI 9 ;nope, starting extension?
+ JNZ DIRECT6
+ CALL SPACE ;yes, add seperating space.
+ JMP DIRECT6
+DIRECT7 POP PSW ;get the next file name.
+DIRECT8 CALL CHKCON ;first check console, quit on anything.
+ JNZ DIRECT9
+ CALL SRCHNXT ;get next name.
+ JMP DIRECT3 ;and continue with our list.
+DIRECT9 POP D ;restore the stack and return to command level.
+ JMP GETBACK
+;
+;**************************************************************
+;*
+;* E R A S E C O M M A N D
+;*
+;**************************************************************
+;
+ERASE CALL CONVFST ;convert file name.
+ CPI 11 ;was '*.*' entered?
+ JNZ ERASE1
+ LXI B,YESNO ;yes, ask for confirmation.
+ CALL PLINE
+ CALL GETINP
+ LXI H,INBUFF+1
+ DCR M ;must be exactly 'y'.
+ JNZ CMMND1
+ INX H
+ MOV A,M
+ CPI 'Y'
+ JNZ CMMND1
+ INX H
+ SHLD INPOINT ;save input line pointer.
+ERASE1 CALL DSELECT ;select desired disk.
+ LXI D,FCB
+ CALL DELETE ;delete the file.
+ INR A
+ CZ NONE ;not there?
+ JMP GETBACK ;return to command level now.
+YESNO DB 'All (y/n)?',0
+;
+;**************************************************************
+;*
+;* T Y P E C O M M A N D
+;*
+;**************************************************************
+;
+TYPE CALL CONVFST ;convert file name.
+ JNZ SYNERR ;wild cards not allowed.
+ CALL DSELECT ;select indicated drive.
+ CALL OPENFCB ;open the file.
+ JZ TYPE5 ;not there?
+ CALL CRLF ;ok, start a new line on the screen.
+ LXI H,NBYTES;initialize byte counter.
+ MVI M,0FFH ;set to read first sector.
+TYPE1 LXI H,NBYTES
+TYPE2 MOV A,M ;have we written the entire sector?
+ CPI 128
+ JC TYPE3
+ PUSH H ;yes, read in the next one.
+ CALL READFCB
+ POP H
+ JNZ TYPE4 ;end or error?
+ XRA A ;ok, clear byte counter.
+ MOV M,A
+TYPE3 INR M ;count this byte.
+ LXI H,TBUFF ;and get the (A)th one from the buffer (TBUFF).
+ CALL ADDHL
+ MOV A,M
+ CPI CNTRLZ ;end of file mark?
+ JZ GETBACK
+ CALL PRINT ;no, print it.
+ CALL CHKCON ;check console, quit if anything ready.
+ JNZ GETBACK
+ JMP TYPE1
+;
+; Get here on an end of file or read error.
+;
+TYPE4 DCR A ;read error?
+ JZ GETBACK
+ CALL RDERROR ;yes, print message.
+TYPE5 CALL RESETDR ;and reset proper drive
+ JMP SYNERR ;now print file name with problem.
+;
+;**************************************************************
+;*
+;* S A V E C O M M A N D
+;*
+;**************************************************************
+;
+SAVE CALL DECODE ;get numeric number that follows SAVE.
+ PUSH PSW ;save number of pages to write.
+ CALL CONVFST ;convert file name.
+ JNZ SYNERR ;wild cards not allowed.
+ CALL DSELECT ;select specified drive.
+ LXI D,FCB ;now delete this file.
+ PUSH D
+ CALL DELETE
+ POP D
+ CALL CREATE ;and create it again.
+ JZ SAVE3 ;can't create?
+ XRA A ;clear record number byte.
+ STA FCB+32
+ POP PSW ;convert pages to sectors.
+ MOV L,A
+ MVI H,0
+ DAD H ;(HL)=number of sectors to write.
+ LXI D,TBASE ;and we start from here.
+SAVE1 MOV A,H ;done yet?
+ ORA L
+ JZ SAVE2
+ DCX H ;nope, count this and compute the start
+ PUSH H ;of the next 128 byte sector.
+ LXI H,128
+ DAD D
+ PUSH H ;save it and set the transfer address.
+ CALL DMASET
+ LXI D,FCB ;write out this sector now.
+ CALL WRTREC
+ POP D ;reset (DE) to the start of the last sector.
+ POP H ;restore sector count.
+ JNZ SAVE3 ;write error?
+ JMP SAVE1
+;
+; Get here after writing all of the file.
+;
+SAVE2 LXI D,FCB ;now close the file.
+ CALL CLOSE
+ INR A ;did it close ok?
+ JNZ SAVE4
+;
+; Print out error message (no space).
+;
+SAVE3 LXI B,NOSPACE
+ CALL PLINE
+SAVE4 CALL STDDMA ;reset the standard dma address.
+ JMP GETBACK
+NOSPACE DB 'No space',0
+;
+;**************************************************************
+;*
+;* R E N A M E C O M M A N D
+;*
+;**************************************************************
+;
+RENAME CALL CONVFST ;convert first file name.
+ JNZ SYNERR ;wild cards not allowed.
+ LDA CHGDRV ;remember any change in drives specified.
+ PUSH PSW
+ CALL DSELECT ;and select this drive.
+ CALL SRCHFCB ;is this file present?
+ JNZ RENAME6 ;yes, print error message.
+ LXI H,FCB ;yes, move this name into second slot.
+ LXI D,FCB+16
+ MVI B,16
+ CALL HL2DE
+ LHLD INPOINT ;get input pointer.
+ XCHG
+ CALL NONBLANK;get next non blank character.
+ CPI '=' ;only allow an '=' or '_' seperator.
+ JZ RENAME1
+ CPI '_'
+ JNZ RENAME5
+RENAME1 XCHG
+ INX H ;ok, skip seperator.
+ SHLD INPOINT ;save input line pointer.
+ CALL CONVFST ;convert this second file name now.
+ JNZ RENAME5 ;again, no wild cards.
+ POP PSW ;if a drive was specified, then it
+ MOV B,A ;must be the same as before.
+ LXI H,CHGDRV
+ MOV A,M
+ ORA A
+ JZ RENAME2
+ CMP B
+ MOV M,B
+ JNZ RENAME5 ;they were different, error.
+RENAME2 MOV M,B; reset as per the first file specification.
+ XRA A
+ STA FCB ;clear the drive byte of the fcb.
+RENAME3 CALL SRCHFCB ;and go look for second file.
+ JZ RENAME4 ;doesn't exist?
+ LXI D,FCB
+ CALL RENAM ;ok, rename the file.
+ JMP GETBACK
+;
+; Process rename errors here.
+;
+RENAME4 CALL NONE ;file not there.
+ JMP GETBACK
+RENAME5 CALL RESETDR ;bad command format.
+ JMP SYNERR
+RENAME6 LXI B,EXISTS;destination file already exists.
+ CALL PLINE
+ JMP GETBACK
+EXISTS DB 'File exists',0
+;
+;**************************************************************
+;*
+;* U S E R C O M M A N D
+;*
+;**************************************************************
+;
+USER CALL DECODE ;get numeric value following command.
+ CPI 16 ;legal user number?
+ JNC SYNERR
+ MOV E,A ;yes but is there anything else?
+ LDA FCB+1
+ CPI ' '
+ JZ SYNERR ;yes, that is not allowed.
+ CALL GETSETUC;ok, set user code.
+ JMP GETBACK1
+;
+;**************************************************************
+;*
+;* T R A N S I A N T P R O G R A M C O M M A N D
+;*
+;**************************************************************
+;
+UNKNOWN CALL VERIFY ;check for valid system (why?).
+ LDA FCB+1 ;anything to execute?
+ CPI ' '
+ JNZ UNKWN1
+ LDA CHGDRV ;nope, only a drive change?
+ ORA A
+ JZ GETBACK1;neither???
+ DCR A
+ STA CDRIVE ;ok, store new drive.
+ CALL MOVECD ;set (TDRIVE) also.
+ CALL DSKSEL ;and select this drive.
+ JMP GETBACK1;then return.
+;
+; Here a file name was typed. Prepare to execute it.
+;
+UNKWN1 LXI D,FCB+9 ;an extension specified?
+ LDAX D
+ CPI ' '
+ JNZ SYNERR ;yes, not allowed.
+UNKWN2 PUSH D
+ CALL DSELECT ;select specified drive.
+ POP D
+ LXI H,COMFILE ;set the extension to 'COM'.
+ CALL MOVE3
+ CALL OPENFCB ;and open this file.
+ JZ UNKWN9 ;not present?
+;
+; Load in the program.
+;
+ LXI H,TBASE ;store the program starting here.
+UNKWN3 PUSH H
+ XCHG
+ CALL DMASET ;set transfer address.
+ LXI D,FCB ;and read the next record.
+ CALL RDREC
+ JNZ UNKWN4 ;end of file or read error?
+ POP H ;nope, bump pointer for next sector.
+ LXI D,128
+ DAD D
+ LXI D,CBASE ;enough room for the whole file?
+ MOV A,L
+ SUB E
+ MOV A,H
+ SBB D
+ JNC UNKWN0 ;no, it can't fit.
+ JMP UNKWN3
+;
+; Get here after finished reading.
+;
+UNKWN4 POP H
+ DCR A ;normal end of file?
+ JNZ UNKWN0
+ CALL RESETDR ;yes, reset previous drive.
+ CALL CONVFST ;convert the first file name that follows
+ LXI H,CHGDRV;command name.
+ PUSH H
+ MOV A,M ;set drive code in default fcb.
+ STA FCB
+ MVI A,16 ;put second name 16 bytes later.
+ CALL CONVERT ;convert second file name.
+ POP H
+ MOV A,M ;and set the drive for this second file.
+ STA FCB+16
+ XRA A ;clear record byte in fcb.
+ STA FCB+32
+ LXI D,TFCB ;move it into place at(005Ch).
+ LXI H,FCB
+ MVI B,33
+ CALL HL2DE
+ LXI H,INBUFF+2;now move the remainder of the input
+UNKWN5 MOV A,M ;line down to (0080h). Look for a non blank.
+ ORA A ;or a null.
+ JZ UNKWN6
+ CPI ' '
+ JZ UNKWN6
+ INX H
+ JMP UNKWN5
+;
+; Do the line move now. It ends in a null byte.
+;
+UNKWN6 MVI B,0 ;keep a character count.
+ LXI D,TBUFF+1;data gets put here.
+UNKWN7 MOV A,M ;move it now.
+ STAX D
+ ORA A
+ JZ UNKWN8
+ INR B
+ INX H
+ INX D
+ JMP UNKWN7
+UNKWN8 MOV A,B ;now store the character count.
+ STA TBUFF
+ CALL CRLF ;clean up the screen.
+ CALL STDDMA ;set standard transfer address.
+ CALL SETCDRV ;reset current drive.
+ CALL TBASE ;and execute the program.
+;
+; Transiant programs return here (or reboot).
+;
+ LXI SP,BATCH ;set stack first off.
+ CALL MOVECD ;move current drive into place (TDRIVE).
+ CALL DSKSEL ;and reselect it.
+ JMP CMMND1 ;back to comand mode.
+;
+; Get here if some error occured.
+;
+UNKWN9 CALL RESETDR ;inproper format.
+ JMP SYNERR
+UNKWN0 LXI B,BADLOAD;read error or won't fit.
+ CALL PLINE
+ JMP GETBACK
+BADLOAD DB 'Bad load',0
+COMFILE DB 'COM' ;command file extension.
+;
+; Get here to return to command level. We will reset the
+; previous active drive and then either return to command
+; level directly or print error message and then return.
+;
+GETBACK CALL RESETDR ;reset previous drive.
+GETBACK1:CALL CONVFST ;convert first name in (FCB).
+ LDA FCB+1 ;if this was just a drive change request,
+ SUI ' ' ;make sure it was valid.
+ LXI H,CHGDRV
+ ORA M
+ JNZ SYNERR
+ JMP CMMND1 ;ok, return to command level.
+;
+; ccp stack area.
+;
+ DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+CCPSTACK:EQU $ ;end of ccp stack area.
+;
+; Batch (or SUBMIT) processing information storage.
+;
+BATCH DB 0 ;batch mode flag (0=not active).
+BATCHFCB:DB 0,'$$$ SUB',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;
+; File control block setup by the CCP.
+;
+FCB DB 0,' ',0,0,0,0,0,' ',0,0,0,0,0
+RTNCODE DB 0 ;status returned from bdos call.
+CDRIVE DB 0 ;currently active drive.
+CHGDRV DB 0 ;change in drives flag (0=no change).
+NBYTES DW 0 ;byte counter used by TYPE.
+;
+; Room for expansion?
+;
+ DB 0,0,0,0,0,0,0,0,0,0,0,0,0
+;
+; Note that the following six bytes must match those at
+; (PATTRN1) or cp/m will HALT. Why?
+;
+PATTRN2 DB 0,22,0,0,0,0;(* serial number bytes *).
+;
+;**************************************************************
+;*
+;* B D O S E N T R Y
+;*
+;**************************************************************
+;
+FBASE JMP FBASE1
+;
+; Bdos error table.
+;
+BADSCTR DW ERROR1 ;bad sector on read or write.
+BADSLCT DW ERROR2 ;bad disk select.
+RODISK DW ERROR3 ;disk is read only.
+ROFILE DW ERROR4 ;file is read only.
+;
+; Entry into bdos. (DE) or (E) are the parameters passed. The
+; function number desired is in register (C).
+;
+FBASE1 XCHG ;save the (DE) parameters.
+ SHLD PARAMS
+ XCHG
+ MOV A,E ;and save register (E) in particular.
+ STA EPARAM
+ LXI H,0
+ SHLD STATUS ;clear return status.
+ DAD SP
+ SHLD USRSTACK;save users stack pointer.
+ LXI SP,STKAREA;and set our own.
+ XRA A ;clear auto select storage space.
+ STA AUTOFLAG
+ STA AUTO
+ LXI H,GOBACK;set return address.
+ PUSH H
+ MOV A,C ;get function number.
+ CPI NFUNCTS ;valid function number?
+ RNC
+ MOV C,E ;keep single register function here.
+ LXI H,FUNCTNS;now look thru the function table.
+ MOV E,A
+ MVI D,0 ;(DE)=function number.
+ DAD D
+ DAD D ;(HL)=(start of table)+2*(function number).
+ MOV E,M
+ INX H
+ MOV D,M ;now (DE)=address for this function.
+ LHLD PARAMS ;retrieve parameters.
+ XCHG ;now (DE) has the original parameters.
+ PCHL ;execute desired function.
+;
+; BDOS function jump table.
+;
+NFUNCTS EQU 41 ;number of functions in followin table.
+;
+FUNCTNS DW WBOOT,GETCON,OUTCON,GETRDR,PUNCH,LIST,DIRCIO,GETIOB
+ DW SETIOB,PRTSTR,RDBUFF,GETCSTS,GETVER,RSTDSK,SETDSK,OPENFIL
+ DW CLOSEFIL,GETFST,GETNXT,DELFILE,READSEQ,WRTSEQ,FCREATE
+ DW RENFILE,GETLOG,GETCRNT,PUTDMA,GETALOC,WRTPRTD,GETROV,SETATTR
+ DW GETPARM,GETUSER,RDRANDOM,WTRANDOM,FILESIZE,SETRAN,LOGOFF,RTN
+ DW RTN,WTSPECL
+;
+; Bdos error message section.
+;
+ERROR1 LXI H,BADSEC ;bad sector message.
+ CALL PRTERR ;print it and get a 1 char responce.
+ CPI CNTRLC ;re-boot request (control-c)?
+ JZ 0 ;yes.
+ RET ;no, return to retry i/o function.
+;
+ERROR2 LXI H,BADSEL ;bad drive selected.
+ JMP ERROR5
+;
+ERROR3 LXI H,DISKRO ;disk is read only.
+ JMP ERROR5
+;
+ERROR4 LXI H,FILERO ;file is read only.
+;
+ERROR5 CALL PRTERR
+ JMP 0 ;always reboot on these errors.
+;
+BDOSERR DB 'Bdos Err On '
+BDOSDRV DB ' : $'
+BADSEC DB 'Bad Sector$'
+BADSEL DB 'Select$'
+FILERO DB 'File '
+DISKRO DB 'R/O$'
+;
+; Print bdos error message.
+;
+PRTERR PUSH H ;save second message pointer.
+ CALL OUTCRLF ;send (cr)(lf).
+ LDA ACTIVE ;get active drive.
+ ADI 'A' ;make ascii.
+ STA BDOSDRV ;and put in message.
+ LXI B,BDOSERR;and print it.
+ CALL PRTMESG
+ POP B ;print second message line now.
+ CALL PRTMESG
+;
+; Get an input character. We will check our 1 character
+; buffer first. This may be set by the console status routine.
+;
+GETCHAR LXI H,CHARBUF;check character buffer.
+ MOV A,M ;anything present already?
+ MVI M,0 ;...either case clear it.
+ ORA A
+ RNZ ;yes, use it.
+ JMP CONIN ;nope, go get a character responce.
+;
+; Input and echo a character.
+;
+GETECHO CALL GETCHAR ;input a character.
+ CALL CHKCHAR ;carriage control?
+ RC ;no, a regular control char so don't echo.
+ PUSH PSW ;ok, save character now.
+ MOV C,A
+ CALL OUTCON ;and echo it.
+ POP PSW ;get character and return.
+ RET
+;
+; Check character in (A). Set the zero flag on a carriage
+; control character and the carry flag on any other control
+; character.
+;
+CHKCHAR CPI CR ;check for carriage return, line feed, backspace,
+ RZ ;or a tab.
+ CPI LF
+ RZ
+ CPI TAB
+ RZ
+ CPI BS
+ RZ
+ CPI ' ' ;other control char? Set carry flag.
+ RET
+;
+; Check the console during output. Halt on a control-s, then
+; reboot on a control-c. If anything else is ready, clear the
+; zero flag and return (the calling routine may want to do
+; something).
+;
+CKCONSOL:LDA CHARBUF ;check buffer.
+ ORA A ;if anything, just return without checking.
+ JNZ CKCON2
+ CALL CONST ;nothing in buffer. Check console.
+ ANI 01H ;look at bit 0.
+ RZ ;return if nothing.
+ CALL CONIN ;ok, get it.
+ CPI CNTRLS ;if not control-s, return with zero cleared.
+ JNZ CKCON1
+ CALL CONIN ;halt processing until another char
+ CPI CNTRLC ;is typed. Control-c?
+ JZ 0 ;yes, reboot now.
+ XRA A ;no, just pretend nothing was ever ready.
+ RET
+CKCON1 STA CHARBUF ;save character in buffer for later processing.
+CKCON2 MVI A,1 ;set (A) to non zero to mean something is ready.
+ RET
+;
+; Output (C) to the screen. If the printer flip-flop flag
+; is set, we will send character to printer also. The console
+; will be checked in the process.
+;
+OUTCHAR LDA OUTFLAG ;check output flag.
+ ORA A ;anything and we won't generate output.
+ JNZ OUTCHR1
+ PUSH B
+ CALL CKCONSOL;check console (we don't care whats there).
+ POP B
+ PUSH B
+ CALL CONOUT ;output (C) to the screen.
+ POP B
+ PUSH B
+ LDA PRTFLAG ;check printer flip-flop flag.
+ ORA A
+ CNZ LIST ;print it also if non-zero.
+ POP B
+OUTCHR1 MOV A,C ;update cursors position.
+ LXI H,CURPOS
+ CPI DEL ;rubouts don't do anything here.
+ RZ
+ INR M ;bump line pointer.
+ CPI ' ' ;and return if a normal character.
+ RNC
+ DCR M ;restore and check for the start of the line.
+ MOV A,M
+ ORA A
+ RZ ;ingnore control characters at the start of the line.
+ MOV A,C
+ CPI BS ;is it a backspace?
+ JNZ OUTCHR2
+ DCR M ;yes, backup pointer.
+ RET
+OUTCHR2 CPI LF ;is it a line feed?
+ RNZ ;ignore anything else.
+ MVI M,0 ;reset pointer to start of line.
+ RET
+;
+; Output (A) to the screen. If it is a control character
+; (other than carriage control), use ^x format.
+;
+SHOWIT MOV A,C
+ CALL CHKCHAR ;check character.
+ JNC OUTCON ;not a control, use normal output.
+ PUSH PSW
+ MVI C,'^' ;for a control character, preceed it with '^'.
+ CALL OUTCHAR
+ POP PSW
+ ORI '@' ;and then use the letter equivelant.
+ MOV C,A
+;
+; Function to output (C) to the console device and expand tabs
+; if necessary.
+;
+OUTCON MOV A,C
+ CPI TAB ;is it a tab?
+ JNZ OUTCHAR ;use regular output.
+OUTCON1 MVI C,' ' ;yes it is, use spaces instead.
+ CALL OUTCHAR
+ LDA CURPOS ;go until the cursor is at a multiple of 8
+
+ ANI 07H ;position.
+ JNZ OUTCON1
+ RET
+;
+; Echo a backspace character. Erase the prevoius character
+; on the screen.
+;
+BACKUP CALL BACKUP1 ;backup the screen 1 place.
+ MVI C,' ' ;then blank that character.
+ CALL CONOUT
+BACKUP1 MVI C,BS ;then back space once more.
+ JMP CONOUT
+;
+; Signal a deleted line. Print a '#' at the end and start
+; over.
+;
+NEWLINE MVI C,'#'
+ CALL OUTCHAR ;print this.
+ CALL OUTCRLF ;start new line.
+NEWLN1 LDA CURPOS ;move the cursor to the starting position.
+ LXI H,STARTING
+ CMP M
+ RNC ;there yet?
+ MVI C,' '
+ CALL OUTCHAR ;nope, keep going.
+ JMP NEWLN1
+;
+; Output a (cr) (lf) to the console device (screen).
+;
+OUTCRLF MVI C,CR
+ CALL OUTCHAR
+ MVI C,LF
+ JMP OUTCHAR
+;
+; Print message pointed to by (BC). It will end with a '$'.
+;
+PRTMESG LDAX B ;check for terminating character.
+ CPI '$'
+ RZ
+ INX B
+ PUSH B ;otherwise, bump pointer and print it.
+ MOV C,A
+ CALL OUTCON
+ POP B
+ JMP PRTMESG
+;
+; Function to execute a buffered read.
+;
+RDBUFF LDA CURPOS ;use present location as starting one.
+ STA STARTING
+ LHLD PARAMS ;get the maximum buffer space.
+ MOV C,M
+ INX H ;point to first available space.
+ PUSH H ;and save.
+ MVI B,0 ;keep a character count.
+RDBUF1 PUSH B
+ PUSH H
+RDBUF2 CALL GETCHAR ;get the next input character.
+ ANI 7FH ;strip bit 7.
+ POP H ;reset registers.
+ POP B
+ CPI CR ;en of the line?
+ JZ RDBUF17
+ CPI LF
+ JZ RDBUF17
+ CPI BS ;how about a backspace?
+ JNZ RDBUF3
+ MOV A,B ;yes, but ignore at the beginning of the line.
+ ORA A
+ JZ RDBUF1
+ DCR B ;ok, update counter.
+ LDA CURPOS ;if we backspace to the start of the line,
+ STA OUTFLAG ;treat as a cancel (control-x).
+ JMP RDBUF10
+RDBUF3 CPI DEL ;user typed a rubout?
+ JNZ RDBUF4
+ MOV A,B ;ignore at the start of the line.
+ ORA A
+ JZ RDBUF1
+ MOV A,M ;ok, echo the prevoius character.
+ DCR B ;and reset pointers (counters).
+ DCX H
+ JMP RDBUF15
+RDBUF4 CPI CNTRLE ;physical end of line?
+ JNZ RDBUF5
+ PUSH B ;yes, do it.
+ PUSH H
+ CALL OUTCRLF
+ XRA A ;and update starting position.
+ STA STARTING
+ JMP RDBUF2
+RDBUF5 CPI CNTRLP ;control-p?
+ JNZ RDBUF6
+ PUSH H ;yes, flip the print flag filp-flop byte.
+ LXI H,PRTFLAG
+ MVI A,1 ;PRTFLAG=1-PRTFLAG
+ SUB M
+ MOV M,A
+ POP H
+ JMP RDBUF1
+RDBUF6 CPI CNTRLX ;control-x (cancel)?
+ JNZ RDBUF8
+ POP H
+RDBUF7 LDA STARTING;yes, backup the cursor to here.
+ LXI H,CURPOS
+ CMP M
+ JNC RDBUFF ;done yet?
+ DCR M ;no, decrement pointer and output back up one space.
+ CALL BACKUP
+ JMP RDBUF7
+RDBUF8 CPI CNTRLU ;cntrol-u (cancel line)?
+ JNZ RDBUF9
+ CALL NEWLINE ;start a new line.
+ POP H
+ JMP RDBUFF
+RDBUF9 CPI CNTRLR ;control-r?
+ JNZ RDBUF14
+RDBUF10 PUSH B ;yes, start a new line and retype the old one.
+ CALL NEWLINE
+ POP B
+ POP H
+ PUSH H
+ PUSH B
+RDBUF11 MOV A,B ;done whole line yet?
+ ORA A
+ JZ RDBUF12
+ INX H ;nope, get next character.
+ MOV C,M
+ DCR B ;count it.
+ PUSH B
+ PUSH H
+ CALL SHOWIT ;and display it.
+ POP H
+ POP B
+ JMP RDBUF11
+RDBUF12 PUSH H ;done with line. If we were displaying
+ LDA OUTFLAG ;then update cursor position.
+ ORA A
+ JZ RDBUF2
+ LXI H,CURPOS;because this line is shorter, we must
+ SUB M ;back up the cursor (not the screen however)
+ STA OUTFLAG ;some number of positions.
+RDBUF13 CALL BACKUP ;note that as long as (OUTFLAG) is non
+ LXI H,OUTFLAG;zero, the screen will not be changed.
+ DCR M
+ JNZ RDBUF13
+ JMP RDBUF2 ;now just get the next character.
+;
+; Just a normal character, put this in our buffer and echo.
+;
+RDBUF14 INX H
+ MOV M,A ;store character.
+ INR B ;and count it.
+RDBUF15 PUSH B
+ PUSH H
+ MOV C,A ;echo it now.
+ CALL SHOWIT
+ POP H
+ POP B
+ MOV A,M ;was it an abort request?
+ CPI CNTRLC ;control-c abort?
+ MOV A,B
+ JNZ RDBUF16
+ CPI 1 ;only if at start of line.
+ JZ 0
+RDBUF16 CMP C ;nope, have we filled the buffer?
+ JC RDBUF1
+RDBUF17 POP H ;yes end the line and return.
+ MOV M,B
+ MVI C,CR
+ JMP OUTCHAR ;output (cr) and return.
+;
+; Function to get a character from the console device.
+;
+GETCON CALL GETECHO ;get and echo.
+ JMP SETSTAT ;save status and return.
+;
+; Function to get a character from the tape reader device.
+;
+GETRDR CALL READER ;get a character from reader, set status and return.
+ JMP SETSTAT
+;
+; Function to perform direct console i/o. If (C) contains (FF)
+; then this is an input request. If (C) contains (FE) then
+; this is a status request. Otherwise we are to output (C).
+;
+DIRCIO MOV A,C ;test for (FF).
+ INR A
+ JZ DIRC1
+ INR A ;test for (FE).
+ JZ CONST
+ JMP CONOUT ;just output (C).
+DIRC1 CALL CONST ;this is an input request.
+ ORA A
+ JZ GOBACK1 ;not ready? Just return (directly).
+ CALL CONIN ;yes, get character.
+ JMP SETSTAT ;set status and return.
+;
+; Function to return the i/o byte.
+;
+GETIOB LDA IOBYTE
+ JMP SETSTAT
+;
+; Function to set the i/o byte.
+;
+SETIOB LXI H,IOBYTE
+ MOV M,C
+ RET
+;
+; Function to print the character string pointed to by (DE)
+; on the console device. The string ends with a '$'.
+;
+PRTSTR XCHG
+ MOV C,L
+ MOV B,H ;now (BC) points to it.
+ JMP PRTMESG
+;
+; Function to interigate the console device.
+;
+GETCSTS CALL CKCONSOL
+;
+; Get here to set the status and return to the cleanup
+; section. Then back to the user.
+;
+SETSTAT STA STATUS
+RTN RET
+;
+; Set the status to 1 (read or write error code).
+;
+IOERR1 MVI A,1
+ JMP SETSTAT
+;
+OUTFLAG DB 0 ;output flag (non zero means no output).
+STARTING:DB 2 ;starting position for cursor.
+CURPOS DB 0 ;cursor position (0=start of line).
+PRTFLAG DB 0 ;printer flag (control-p toggle). List if non zero.
+CHARBUF DB 0 ;single input character buffer.
+;
+; Stack area for BDOS calls.
+;
+USRSTACK:DW 0 ;save users stack pointer here.
+;
+ DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+STKAREA EQU $ ;end of stack area.
+;
+USERNO DB 0 ;current user number.
+ACTIVE DB 0 ;currently active drive.
+PARAMS DW 0 ;save (DE) parameters here on entry.
+STATUS DW 0 ;status returned from bdos function.
+;
+; Select error occured, jump to error routine.
+;
+SLCTERR LXI H,BADSLCT
+;
+; Jump to (HL) indirectly.
+;
+JUMPHL MOV E,M
+ INX H
+ MOV D,M ;now (DE) contain the desired address.
+ XCHG
+ PCHL
+;
+; Block move. (DE) to (HL), (C) bytes total.
+;
+DE2HL INR C ;is count down to zero?
+DE2HL1 DCR C
+ RZ ;yes, we are done.
+ LDAX D ;no, move one more byte.
+ MOV M,A
+ INX D
+ INX H
+ JMP DE2HL1 ;and repeat.
+;
+; Select the desired drive.
+;
+SELECT LDA ACTIVE ;get active disk.
+ MOV C,A
+ CALL SELDSK ;select it.
+ MOV A,H ;valid drive?
+ ORA L ;valid drive?
+ RZ ;return if not.
+;
+; Here, the BIOS returned the address of the parameter block
+; in (HL). We will extract the necessary pointers and save them.
+;
+ MOV E,M ;yes, get address of translation table into (DE).
+ INX H
+ MOV D,M
+ INX H
+ SHLD SCRATCH1 ;save pointers to scratch areas.
+ INX H
+ INX H
+ SHLD SCRATCH2 ;ditto.
+ INX H
+ INX H
+ SHLD SCRATCH3 ;ditto.
+ INX H
+ INX H
+ XCHG ;now save the translation table address.
+ SHLD XLATE
+ LXI H,DIRBUF ;put the next 8 bytes here.
+ MVI C,8 ;they consist of the directory buffer
+ CALL DE2HL ;pointer, parameter block pointer,
+ LHLD DISKPB ;check and allocation vectors.
+ XCHG
+ LXI H,SECTORS ;move parameter block into our ram.
+ MVI C,15 ;it is 15 bytes long.
+ CALL DE2HL
+ LHLD DSKSIZE ;check disk size.
+ MOV A,H ;more than 256 blocks on this?
+ LXI H,BIGDISK
+ MVI M,0FFH ;set to samll.
+ ORA A
+ JZ SELECT1
+ MVI M,0 ;wrong, set to large.
+SELECT1 MVI A,0FFH ;clear the zero flag.
+ ORA A
+ RET
+;
+; Routine to home the disk track head and clear pointers.
+;
+HOMEDRV CALL HOME ;home the head.
+ XRA A
+ LHLD SCRATCH2;set our track pointer also.
+ MOV M,A
+ INX H
+ MOV M,A
+ LHLD SCRATCH3;and our sector pointer.
+ MOV M,A
+ INX H
+ MOV M,A
+ RET
+;
+; Do the actual disk read and check the error return status.
+;
+DOREAD CALL READ
+ JMP IORET
+;
+; Do the actual disk write and handle any bios error.
+;
+DOWRITE CALL WRITE
+IORET ORA A
+ RZ ;return unless an error occured.
+ LXI H,BADSCTR;bad read/write on this sector.
+ JMP JUMPHL
+;
+; Routine to select the track and sector that the desired
+; block number falls in.
+;
+TRKSEC LHLD FILEPOS ;get position of last accessed file
+ MVI C,2 ;in directory and compute sector #.
+ CALL SHIFTR ;sector #=file-position/4.
+ SHLD BLKNMBR ;save this as the block number of interest.
+ SHLD CKSUMTBL;what's it doing here too?
+;
+; if the sector number has already been set (BLKNMBR), enter
+; at this point.
+;
+TRKSEC1 LXI H,BLKNMBR
+ MOV C,M ;move sector number into (BC).
+ INX H
+ MOV B,M
+ LHLD SCRATCH3;get current sector number and
+ MOV E,M ;move this into (DE).
+ INX H
+ MOV D,M
+ LHLD SCRATCH2;get current track number.
+ MOV A,M ;and this into (HL).
+ INX H
+ MOV H,M
+ MOV L,A
+TRKSEC2 MOV A,C ;is desired sector before current one?
+ SUB E
+ MOV A,B
+ SBB D
+ JNC TRKSEC3
+ PUSH H ;yes, decrement sectors by one track.
+ LHLD SECTORS ;get sectors per track.
+ MOV A,E
+ SUB L
+ MOV E,A
+ MOV A,D
+ SBB H
+ MOV D,A ;now we have backed up one full track.
+ POP H
+ DCX H ;adjust track counter.
+ JMP TRKSEC2
+TRKSEC3 PUSH H ;desired sector is after current one.
+ LHLD SECTORS ;get sectors per track.
+ DAD D ;bump sector pointer to next track.
+ JC TRKSEC4
+ MOV A,C ;is desired sector now before current one?
+ SUB L
+ MOV A,B
+ SBB H
+ JC TRKSEC4
+ XCHG ;not yes, increment track counter
+ POP H ;and continue until it is.
+ INX H
+ JMP TRKSEC3
+;
+; here we have determined the track number that contains the
+; desired sector.
+;
+TRKSEC4 POP H ;get track number (HL).
+ PUSH B
+ PUSH D
+ PUSH H
+ XCHG
+ LHLD OFFSET ;adjust for first track offset.
+ DAD D
+ MOV B,H
+ MOV C,L
+ CALL SETTRK ;select this track.
+ POP D ;reset current track pointer.
+ LHLD SCRATCH2
+ MOV M,E
+ INX H
+ MOV M,D
+ POP D
+ LHLD SCRATCH3;reset the first sector on this track.
+ MOV M,E
+ INX H
+ MOV M,D
+ POP B
+ MOV A,C ;now subtract the desired one.
+ SUB E ;to make it relative (1-# sectors/track).
+ MOV C,A
+ MOV A,B
+ SBB D
+ MOV B,A
+ LHLD XLATE ;translate this sector according to this table.
+ XCHG
+ CALL SECTRN ;let the bios translate it.
+ MOV C,L
+ MOV B,H
+ JMP SETSEC ;and select it.
+;
+; Compute block number from record number (SAVNREC) and
+; extent number (SAVEXT).
+;
+GETBLOCK:LXI H,BLKSHFT;get logical to physical conversion.
+ MOV C,M ;note that this is base 2 log of ratio.
+ LDA SAVNREC ;get record number.
+GETBLK1 ORA A ;compute (A)=(A)/2^BLKSHFT.
+ RAR
+ DCR C
+ JNZ GETBLK1
+ MOV B,A ;save result in (B).
+ MVI A,8
+ SUB M
+ MOV C,A ;compute (C)=8-BLKSHFT.
+ LDA SAVEXT
+GETBLK2 DCR C ;compute (A)=SAVEXT*2^(8-BLKSHFT).
+ JZ GETBLK3
+ ORA A
+ RAL
+ JMP GETBLK2
+GETBLK3 ADD B
+ RET
+;
+; Routine to extract the (BC) block byte from the fcb pointed
+; to by (PARAMS). If this is a big-disk, then these are 16 bit
+; block numbers, else they are 8 bit numbers.
+; Number is returned in (HL).
+;
+EXTBLK LHLD PARAMS ;get fcb address.
+ LXI D,16 ;block numbers start 16 bytes into fcb.
+ DAD D
+ DAD B
+ LDA BIGDISK ;are we using a big-disk?
+ ORA A
+ JZ EXTBLK1
+ MOV L,M ;no, extract an 8 bit number from the fcb.
+ MVI H,0
+ RET
+EXTBLK1 DAD B ;yes, extract a 16 bit number.
+ MOV E,M
+ INX H
+ MOV D,M
+ XCHG ;return in (HL).
+ RET
+;
+; Compute block number.
+;
+COMBLK CALL GETBLOCK
+ MOV C,A
+ MVI B,0
+ CALL EXTBLK
+ SHLD BLKNMBR
+ RET
+;
+; Check for a zero block number (unused).
+;
+CHKBLK LHLD BLKNMBR
+ MOV A,L ;is it zero?
+ ORA H
+ RET
+;
+; Adjust physical block (BLKNMBR) and convert to logical
+; sector (LOGSECT). This is the starting sector of this block.
+; The actual sector of interest is then added to this and the
+; resulting sector number is stored back in (BLKNMBR). This
+; will still have to be adjusted for the track number.
+;
+LOGICAL LDA BLKSHFT ;get log2(physical/logical sectors).
+ LHLD BLKNMBR ;get physical sector desired.
+LOGICL1 DAD H ;compute logical sector number.
+ DCR A ;note logical sectors are 128 bytes long.
+ JNZ LOGICL1
+ SHLD LOGSECT ;save logical sector.
+ LDA BLKMASK ;get block mask.
+ MOV C,A
+ LDA SAVNREC ;get next sector to access.
+ ANA C ;extract the relative position within physical block.
+ ORA L ;and add it too logical sector.
+ MOV L,A
+ SHLD BLKNMBR ;and store.
+ RET
+;
+; Set (HL) to point to extent byte in fcb.
+;
+SETEXT LHLD PARAMS
+ LXI D,12 ;it is the twelth byte.
+ DAD D
+ RET
+;
+; Set (HL) to point to record count byte in fcb and (DE) to
+; next record number byte.
+;
+SETHLDE LHLD PARAMS
+ LXI D,15 ;record count byte (#15).
+ DAD D
+ XCHG
+ LXI H,17 ;next record number (#32).
+ DAD D
+ RET
+;
+; Save current file data from fcb.
+;
+STRDATA CALL SETHLDE
+ MOV A,M ;get and store record count byte.
+ STA SAVNREC
+ XCHG
+ MOV A,M ;get and store next record number byte.
+ STA SAVNXT
+ CALL SETEXT ;point to extent byte.
+ LDA EXTMASK ;get extent mask.
+ ANA M
+ STA SAVEXT ;and save extent here.
+ RET
+;
+; Set the next record to access. If (MODE) is set to 2, then
+; the last record byte (SAVNREC) has the correct number to access.
+; For sequential access, (MODE) will be equal to 1.
+;
+SETNREC CALL SETHLDE
+ LDA MODE ;get sequential flag (=1).
+ CPI 2 ;a 2 indicates that no adder is needed.
+ JNZ STNREC1
+ XRA A ;clear adder (random access?).
+STNREC1 MOV C,A
+ LDA SAVNREC ;get last record number.
+ ADD C ;increment record count.
+ MOV M,A ;and set fcb's next record byte.
+ XCHG
+ LDA SAVNXT ;get next record byte from storage.
+ MOV M,A ;and put this into fcb as number of records used.
+ RET
+;
+; Shift (HL) right (C) bits.
+;
+SHIFTR INR C
+SHIFTR1 DCR C
+ RZ
+ MOV A,H
+ ORA A
+ RAR
+ MOV H,A
+ MOV A,L
+ RAR
+ MOV L,A
+ JMP SHIFTR1
+;
+; Compute the check-sum for the directory buffer. Return
+; integer sum in (A).
+;
+CHECKSUM:MVI C,128 ;length of buffer.
+ LHLD DIRBUF ;get its location.
+ XRA A ;clear summation byte.
+CHKSUM1 ADD M ;and compute sum ignoring carries.
+ INX H
+ DCR C
+ JNZ CHKSUM1
+ RET
+;
+; Shift (HL) left (C) bits.
+;
+SHIFTL INR C
+SHIFTL1 DCR C
+ RZ
+ DAD H ;shift left 1 bit.
+ JMP SHIFTL1
+;
+; Routine to set a bit in a 16 bit value contained in (BC).
+; The bit set depends on the current drive selection.
+;
+SETBIT PUSH B ;save 16 bit word.
+ LDA ACTIVE ;get active drive.
+ MOV C,A
+ LXI H,1
+ CALL SHIFTL ;shift bit 0 into place.
+ POP B ;now 'or' this with the original word.
+ MOV A,C
+ ORA L
+ MOV L,A ;low byte done, do high byte.
+ MOV A,B
+ ORA H
+ MOV H,A
+ RET
+;
+; Extract the write protect status bit for the current drive.
+; The result is returned in (A), bit 0.
+;
+GETWPRT LHLD WRTPRT ;get status bytes.
+ LDA ACTIVE ;which drive is current?
+ MOV C,A
+ CALL SHIFTR ;shift status such that bit 0 is the
+ MOV A,L ;one of interest for this drive.
+ ANI 01H ;and isolate it.
+ RET
+;
+; Function to write protect the current disk.
+;
+WRTPRTD LXI H,WRTPRT;point to status word.
+ MOV C,M ;set (BC) equal to the status.
+ INX H
+ MOV B,M
+ CALL SETBIT ;and set this bit according to current drive.
+ SHLD WRTPRT ;then save.
+ LHLD DIRSIZE ;now save directory size limit.
+ INX H ;remember the last one.
+ XCHG
+ LHLD SCRATCH1;and store it here.
+ MOV M,E ;put low byte.
+ INX H
+ MOV M,D ;then high byte.
+ RET
+;
+; Check for a read only file.
+;
+CHKROFL CALL FCB2HL ;set (HL) to file entry in directory buffer.
+CKROF1 LXI D,9 ;look at bit 7 of the ninth byte.
+ DAD D
+ MOV A,M
+ RAL
+ RNC ;return if ok.
+ LXI H,ROFILE;else, print error message and terminate.
+ JMP JUMPHL
+;
+; Check the write protect status of the active disk.
+;
+CHKWPRT CALL GETWPRT
+ RZ ;return if ok.
+ LXI H,RODISK;else print message and terminate.
+ JMP JUMPHL
+;
+; Routine to set (HL) pointing to the proper entry in the
+; directory buffer.
+;
+FCB2HL LHLD DIRBUF ;get address of buffer.
+ LDA FCBPOS ;relative position of file.
+;
+; Routine to add (A) to (HL).
+;
+ADDA2HL ADD L
+ MOV L,A
+ RNC
+ INR H ;take care of any carry.
+ RET
+;
+; Routine to get the 's2' byte from the fcb supplied in
+; the initial parameter specification.
+;
+GETS2 LHLD PARAMS ;get address of fcb.
+ LXI D,14 ;relative position of 's2'.
+ DAD D
+ MOV A,M ;extract this byte.
+ RET
+;
+; Clear the 's2' byte in the fcb.
+;
+CLEARS2 CALL GETS2 ;this sets (HL) pointing to it.
+ MVI M,0 ;now clear it.
+ RET
+;
+; Set bit 7 in the 's2' byte of the fcb.
+;
+SETS2B7 CALL GETS2 ;get the byte.
+ ORI 80H ;and set bit 7.
+ MOV M,A ;then store.
+ RET
+;
+; Compare (FILEPOS) with (SCRATCH1) and set flags based on
+; the difference. This checks to see if there are more file
+; names in the directory. We are at (FILEPOS) and there are
+; (SCRATCH1) of them to check.
+;
+MOREFLS LHLD FILEPOS ;we are here.
+ XCHG
+ LHLD SCRATCH1;and don't go past here.
+ MOV A,E ;compute difference but don't keep.
+ SUB M
+ INX H
+ MOV A,D
+ SBB M ;set carry if no more names.
+ RET
+;
+; Call this routine to prevent (SCRATCH1) from being greater
+; than (FILEPOS).
+;
+CHKNMBR CALL MOREFLS ;SCRATCH1 too big?
+ RC
+ INX D ;yes, reset it to (FILEPOS).
+ MOV M,D
+ DCX H
+ MOV M,E
+ RET
+;
+; Compute (HL)=(DE)-(HL)
+;
+SUBHL MOV A,E ;compute difference.
+ SUB L
+ MOV L,A ;store low byte.
+ MOV A,D
+ SBB H
+ MOV H,A ;and then high byte.
+ RET
+;
+; Set the directory checksum byte.
+;
+SETDIR MVI C,0FFH
+;
+; Routine to set or compare the directory checksum byte. If
+; (C)=0ffh, then this will set the checksum byte. Else the byte
+; will be checked. If the check fails (the disk has been changed),
+; then this disk will be write protected.
+;
+CHECKDIR:LHLD CKSUMTBL
+ XCHG
+ LHLD ALLOC1
+ CALL SUBHL
+ RNC ;ok if (CKSUMTBL) > (ALLOC1), so return.
+ PUSH B
+ CALL CHECKSUM;else compute checksum.
+ LHLD CHKVECT ;get address of checksum table.
+ XCHG
+ LHLD CKSUMTBL
+ DAD D ;set (HL) to point to byte for this drive.
+ POP B
+ INR C ;set or check ?
+ JZ CHKDIR1
+ CMP M ;check them.
+ RZ ;return if they are the same.
+ CALL MOREFLS ;not the same, do we care?
+ RNC
+ CALL WRTPRTD ;yes, mark this as write protected.
+ RET
+CHKDIR1 MOV M,A ;just set the byte.
+ RET
+;
+; Do a write to the directory of the current disk.
+;
+DIRWRITE:CALL SETDIR ;set checksum byte.
+ CALL DIRDMA ;set directory dma address.
+ MVI C,1 ;tell the bios to actually write.
+ CALL DOWRITE ;then do the write.
+ JMP DEFDMA
+;
+; Read from the directory.
+;
+DIRREAD CALL DIRDMA ;set the directory dma address.
+ CALL DOREAD ;and read it.
+;
+; Routine to set the dma address to the users choice.
+;
+DEFDMA LXI H,USERDMA;reset the default dma address and return.
+ JMP DIRDMA1
+;
+; Routine to set the dma address for directory work.
+;
+DIRDMA LXI H,DIRBUF
+;
+; Set the dma address. On entry, (HL) points to
+; word containing the desired dma address.
+;
+DIRDMA1 MOV C,M
+ INX H
+ MOV B,M ;setup (BC) and go to the bios to set it.
+ JMP SETDMA
+;
+; Move the directory buffer into user's dma space.
+;
+MOVEDIR LHLD DIRBUF ;buffer is located here, and
+ XCHG
+ LHLD USERDMA; put it here.
+ MVI C,128 ;this is its length.
+ JMP DE2HL ;move it now and return.
+;
+; Check (FILEPOS) and set the zero flag if it equals 0ffffh.
+;
+CKFILPOS:LXI H,FILEPOS
+ MOV A,M
+ INX H
+ CMP M ;are both bytes the same?
+ RNZ
+ INR A ;yes, but are they each 0ffh?
+ RET
+;
+; Set location (FILEPOS) to 0ffffh.
+;
+STFILPOS:LXI H,0FFFFH
+ SHLD FILEPOS
+ RET
+;
+; Move on to the next file position within the current
+; directory buffer. If no more exist, set pointer to 0ffffh
+; and the calling routine will check for this. Enter with (C)
+; equal to 0ffh to cause the checksum byte to be set, else we
+; will check this disk and set write protect if checksums are
+; not the same (applies only if another directory sector must
+; be read).
+;
+NXENTRY LHLD DIRSIZE ;get directory entry size limit.
+ XCHG
+ LHLD FILEPOS ;get current count.
+ INX H ;go on to the next one.
+ SHLD FILEPOS
+ CALL SUBHL ;(HL)=(DIRSIZE)-(FILEPOS)
+ JNC NXENT1 ;is there more room left?
+ JMP STFILPOS;no. Set this flag and return.
+NXENT1 LDA FILEPOS ;get file position within directory.
+ ANI 03H ;only look within this sector (only 4 entries fit).
+ MVI B,5 ;convert to relative position (32 bytes each).
+NXENT2 ADD A ;note that this is not efficient code.
+ DCR B ;5 'ADD A's would be better.
+ JNZ NXENT2
+ STA FCBPOS ;save it as position of fcb.
+ ORA A
+ RNZ ;return if we are within buffer.
+ PUSH B
+ CALL TRKSEC ;we need the next directory sector.
+ CALL DIRREAD
+ POP B
+ JMP CHECKDIR
+;
+; Routine to to get a bit from the disk space allocation
+; map. It is returned in (A), bit position 0. On entry to here,
+; set (BC) to the block number on the disk to check.
+; On return, (D) will contain the original bit position for
+; this block number and (HL) will point to the address for it.
+;
+CKBITMAP:MOV A,C ;determine bit number of interest.
+ ANI 07H ;compute (D)=(E)=(C and 7)+1.
+ INR A
+ MOV E,A ;save particular bit number.
+ MOV D,A
+;
+; compute (BC)=(BC)/8.
+;
+ MOV A,C
+ RRC ;now shift right 3 bits.
+ RRC
+ RRC
+ ANI 1FH ;and clear bits 7,6,5.
+ MOV C,A
+ MOV A,B
+ ADD A ;now shift (B) into bits 7,6,5.
+ ADD A
+ ADD A
+ ADD A
+ ADD A
+ ORA C ;and add in (C).
+ MOV C,A ;ok, (C) ha been completed.
+ MOV A,B ;is there a better way of doing this?
+ RRC
+ RRC
+ RRC
+ ANI 1FH
+ MOV B,A ;and now (B) is completed.
+;
+; use this as an offset into the disk space allocation
+; table.
+;
+ LHLD ALOCVECT
+ DAD B
+ MOV A,M ;now get correct byte.
+CKBMAP1 RLC ;get correct bit into position 0.
+ DCR E
+ JNZ CKBMAP1
+ RET
+;
+; Set or clear the bit map such that block number (BC) will be marked
+; as used. On entry, if (E)=0 then this bit will be cleared, if it equals
+; 1 then it will be set (don't use anyother values).
+;
+STBITMAP:PUSH D
+ CALL CKBITMAP;get the byte of interest.
+ ANI 0FEH ;clear the affected bit.
+ POP B
+ ORA C ;and now set it acording to (C).
+;
+; entry to restore the original bit position and then store
+; in table. (A) contains the value, (D) contains the bit
+; position (1-8), and (HL) points to the address within the
+; space allocation table for this byte.
+;
+STBMAP1 RRC ;restore original bit position.
+ DCR D
+ JNZ STBMAP1
+ MOV M,A ;and stor byte in table.
+ RET
+;
+; Set/clear space used bits in allocation map for this file.
+; On entry, (C)=1 to set the map and (C)=0 to clear it.
+;
+SETFILE CALL FCB2HL ;get address of fcb
+ LXI D,16
+ DAD D ;get to block number bytes.
+ PUSH B
+ MVI C,17 ;check all 17 bytes (max) of table.
+SETFL1 POP D
+ DCR C ;done all bytes yet?
+ RZ
+ PUSH D
+ LDA BIGDISK ;check disk size for 16 bit block numbers.
+ ORA A
+ JZ SETFL2
+ PUSH B ;only 8 bit numbers. set (BC) to this one.
+ PUSH H
+ MOV C,M ;get low byte from table, always
+ MVI B,0 ;set high byte to zero.
+ JMP SETFL3
+SETFL2 DCR C ;for 16 bit block numbers, adjust counter.
+ PUSH B
+ MOV C,M ;now get both the low and high bytes.
+ INX H
+ MOV B,M
+ PUSH H
+SETFL3 MOV A,C ;block used?
+ ORA B
+ JZ SETFL4
+ LHLD DSKSIZE ;is this block number within the
+ MOV A,L ;space on the disk?
+ SUB C
+ MOV A,H
+ SBB B
+ CNC STBITMAP;yes, set the proper bit.
+SETFL4 POP H ;point to next block number in fcb.
+ INX H
+ POP B
+ JMP SETFL1
+;
+; Construct the space used allocation bit map for the active
+; drive. If a file name starts with '$' and it is under the
+; current user number, then (STATUS) is set to minus 1. Otherwise
+; it is not set at all.
+;
+BITMAP LHLD DSKSIZE ;compute size of allocation table.
+ MVI C,3
+ CALL SHIFTR ;(HL)=(HL)/8.
+ INX H ;at lease 1 byte.
+ MOV B,H
+ MOV C,L ;set (BC) to the allocation table length.
+;
+; Initialize the bitmap for this drive. Right now, the first
+; two bytes are specified by the disk parameter block. However
+; a patch could be entered here if it were necessary to setup
+; this table in a special mannor. For example, the bios could
+; determine locations of 'bad blocks' and set them as already
+; 'used' in the map.
+;
+ LHLD ALOCVECT;now zero out the table now.
+BITMAP1 MVI M,0
+ INX H
+ DCX B
+ MOV A,B
+ ORA C
+ JNZ BITMAP1
+ LHLD ALLOC0 ;get initial space used by directory.
+ XCHG
+ LHLD ALOCVECT;and put this into map.
+ MOV M,E
+ INX H
+ MOV M,D
+;
+; End of initialization portion.
+;
+ CALL HOMEDRV ;now home the drive.
+ LHLD SCRATCH1
+ MVI M,3 ;force next directory request to read
+ INX H ;in a sector.
+ MVI M,0
+ CALL STFILPOS;clear initial file position also.
+BITMAP2 MVI C,0FFH ;read next file name in directory
+ CALL NXENTRY ;and set checksum byte.
+ CALL CKFILPOS;is there another file?
+ RZ
+ CALL FCB2HL ;yes, get its address.
+ MVI A,0E5H
+ CMP M ;empty file entry?
+ JZ BITMAP2
+ LDA USERNO ;no, correct user number?
+ CMP M
+ JNZ BITMAP3
+ INX H
+ MOV A,M ;yes, does name start with a '$'?
+ SUI '$'
+ JNZ BITMAP3
+ DCR A ;yes, set atatus to minus one.
+ STA STATUS
+BITMAP3 MVI C,1 ;now set this file's space as used in bit map.
+ CALL SETFILE
+ CALL CHKNMBR ;keep (SCRATCH1) in bounds.
+ JMP BITMAP2
+;
+; Set the status (STATUS) and return.
+;
+STSTATUS:LDA FNDSTAT
+ JMP SETSTAT
+;
+; Check extents in (A) and (C). Set the zero flag if they
+; are the same. The number of 16k chunks of disk space that
+; the directory extent covers is expressad is (EXTMASK+1).
+; No registers are modified.
+;
+SAMEXT PUSH B
+ PUSH PSW
+ LDA EXTMASK ;get extent mask and use it to
+ CMA ;to compare both extent numbers.
+ MOV B,A ;save resulting mask here.
+ MOV A,C ;mask first extent and save in (C).
+ ANA B
+ MOV C,A
+ POP PSW ;now mask second extent and compare
+ ANA B ;with the first one.
+ SUB C
+ ANI 1FH ;(* only check buts 0-4 *)
+ POP B ;the zero flag is set if they are the same.
+ RET ;restore (BC) and return.
+;
+; Search for the first occurence of a file name. On entry,
+; register (C) should contain the number of bytes of the fcb
+; that must match.
+;
+FINDFST MVI A,0FFH
+ STA FNDSTAT
+ LXI H,COUNTER;save character count.
+ MOV M,C
+ LHLD PARAMS ;get filename to match.
+ SHLD SAVEFCB ;and save.
+ CALL STFILPOS;clear initial file position (set to 0ffffh).
+ CALL HOMEDRV ;home the drive.
+;
+; Entry to locate the next occurence of a filename within the
+; directory. The disk is not expected to have been changed. If
+; it was, then it will be write protected.
+;
+FINDNXT MVI C,0 ;write protect the disk if changed.
+ CALL NXENTRY ;get next filename entry in directory.
+ CALL CKFILPOS;is file position = 0ffffh?
+ JZ FNDNXT6 ;yes, exit now then.
+ LHLD SAVEFCB ;set (DE) pointing to filename to match.
+ XCHG
+ LDAX D
+ CPI 0E5H ;empty directory entry?
+ JZ FNDNXT1 ;(* are we trying to reserect erased entries? *)
+ PUSH D
+ CALL MOREFLS ;more files in directory?
+ POP D
+ JNC FNDNXT6 ;no more. Exit now.
+FNDNXT1 CALL FCB2HL ;get address of this fcb in directory.
+ LDA COUNTER ;get number of bytes (characters) to check.
+ MOV C,A
+ MVI B,0 ;initialize byte position counter.
+FNDNXT2 MOV A,C ;are we done with the compare?
+ ORA A
+ JZ FNDNXT5
+ LDAX D ;no, check next byte.
+ CPI '?' ;don't care about this character?
+ JZ FNDNXT4
+ MOV A,B ;get bytes position in fcb.
+ CPI 13 ;don't care about the thirteenth byte either.
+ JZ FNDNXT4
+ CPI 12 ;extent byte?
+ LDAX D
+ JZ FNDNXT3
+ SUB M ;otherwise compare characters.
+ ANI 7FH
+ JNZ FINDNXT ;not the same, check next entry.
+ JMP FNDNXT4 ;so far so good, keep checking.
+FNDNXT3 PUSH B ;check the extent byte here.
+ MOV C,M
+ CALL SAMEXT
+ POP B
+ JNZ FINDNXT ;not the same, look some more.
+;
+; So far the names compare. Bump pointers to the next byte
+; and continue until all (C) characters have been checked.
+;
+FNDNXT4 INX D ;bump pointers.
+ INX H
+ INR B
+ DCR C ;adjust character counter.
+ JMP FNDNXT2
+FNDNXT5 LDA FILEPOS ;return the position of this entry.
+ ANI 03H
+ STA STATUS
+ LXI H,FNDSTAT
+ MOV A,M
+ RAL
+ RNC
+ XRA A
+ MOV M,A
+ RET
+;
+; Filename was not found. Set appropriate status.
+;
+FNDNXT6 CALL STFILPOS;set (FILEPOS) to 0ffffh.
+ MVI A,0FFH ;say not located.
+ JMP SETSTAT
+;
+; Erase files from the directory. Only the first byte of the
+; fcb will be affected. It is set to (E5).
+;
+ERAFILE CALL CHKWPRT ;is disk write protected?
+ MVI C,12 ;only compare file names.
+ CALL FINDFST ;get first file name.
+ERAFIL1 CALL CKFILPOS;any found?
+ RZ ;nope, we must be done.
+ CALL CHKROFL ;is file read only?
+ CALL FCB2HL ;nope, get address of fcb and
+ MVI M,0E5H ;set first byte to 'empty'.
+ MVI C,0 ;clear the space from the bit map.
+ CALL SETFILE
+ CALL DIRWRITE;now write the directory sector back out.
+ CALL FINDNXT ;find the next file name.
+ JMP ERAFIL1 ;and repeat process.
+;
+; Look through the space allocation map (bit map) for the
+; next available block. Start searching at block number (BC-1).
+; The search procedure is to look for an empty block that is
+; before the starting block. If not empty, look at a later
+; block number. In this way, we return the closest empty block
+; on either side of the 'target' block number. This will speed
+; access on random devices. For serial devices, this should be
+; changed to look in the forward direction first and then start
+; at the front and search some more.
+;
+; On return, (DE)= block number that is empty and (HL) =0
+; if no empry block was found.
+;
+FNDSPACE:MOV D,B ;set (DE) as the block that is checked.
+ MOV E,C
+;
+; Look before target block. Registers (BC) are used as the lower
+; pointer and (DE) as the upper pointer.
+;
+FNDSPA1 MOV A,C ;is block 0 specified?
+ ORA B
+ JZ FNDSPA2
+ DCX B ;nope, check previous block.
+ PUSH D
+ PUSH B
+ CALL CKBITMAP
+ RAR ;is this block empty?
+ JNC FNDSPA3 ;yes. use this.
+;
+; Note that the above logic gets the first block that it finds
+; that is empty. Thus a file could be written 'backward' making
+; it very slow to access. This could be changed to look for the
+; first empty block and then continue until the start of this
+; empty space is located and then used that starting block.
+; This should help speed up access to some files especially on
+; a well used disk with lots of fairly small 'holes'.
+;
+ POP B ;nope, check some more.
+ POP D
+;
+; Now look after target block.
+;
+FNDSPA2 LHLD DSKSIZE ;is block (DE) within disk limits?
+ MOV A,E
+ SUB L
+ MOV A,D
+ SBB H
+ JNC FNDSPA4
+ INX D ;yes, move on to next one.
+ PUSH B
+ PUSH D
+ MOV B,D
+ MOV C,E
+ CALL CKBITMAP;check it.
+ RAR ;empty?
+ JNC FNDSPA3
+ POP D ;nope, continue searching.
+ POP B
+ JMP FNDSPA1
+;
+; Empty block found. Set it as used and return with (HL)
+; pointing to it (true?).
+;
+FNDSPA3 RAL ;reset byte.
+ INR A ;and set bit 0.
+ CALL STBMAP1 ;update bit map.
+ POP H ;set return registers.
+ POP D
+ RET
+;
+; Free block was not found. If (BC) is not zero, then we have
+; not checked all of the disk space.
+;
+FNDSPA4 MOV A,C
+ ORA B
+ JNZ FNDSPA1
+ LXI H,0 ;set 'not found' status.
+ RET
+;
+; Move a complete fcb entry into the directory and write it.
+;
+FCBSET MVI C,0
+ MVI E,32 ;length of each entry.
+;
+; Move (E) bytes from the fcb pointed to by (PARAMS) into
+; fcb in directory starting at relative byte (C). This updated
+; directory buffer is then written to the disk.
+;
+UPDATE PUSH D
+ MVI B,0 ;set (BC) to relative byte position.
+ LHLD PARAMS ;get address of fcb.
+ DAD B ;compute starting byte.
+ XCHG
+ CALL FCB2HL ;get address of fcb to update in directory.
+ POP B ;set (C) to number of bytes to change.
+ CALL DE2HL
+UPDATE1 CALL TRKSEC ;determine the track and sector affected.
+ JMP DIRWRITE ;then write this sector out.
+;
+; Routine to change the name of all files on the disk with a
+; specified name. The fcb contains the current name as the
+; first 12 characters and the new name 16 bytes into the fcb.
+;
+CHGNAMES:CALL CHKWPRT ;check for a write protected disk.
+ MVI C,12 ;match first 12 bytes of fcb only.
+ CALL FINDFST ;get first name.
+ LHLD PARAMS ;get address of fcb.
+ MOV A,M ;get user number.
+ LXI D,16 ;move over to desired name.
+ DAD D
+ MOV M,A ;keep same user number.
+CHGNAM1 CALL CKFILPOS;any matching file found?
+ RZ ;no, we must be done.
+ CALL CHKROFL ;check for read only file.
+ MVI C,16 ;start 16 bytes into fcb.
+ MVI E,12 ;and update the first 12 bytes of directory.
+ CALL UPDATE
+ CALL FINDNXT ;get te next file name.
+ JMP CHGNAM1 ;and continue.
+;
+; Update a files attributes. The procedure is to search for
+; every file with the same name as shown in fcb (ignoring bit 7)
+; and then to update it (which includes bit 7). No other changes
+; are made.
+;
+SAVEATTR:MVI C,12 ;match first 12 bytes.
+ CALL FINDFST ;look for first filename.
+SAVATR1 CALL CKFILPOS;was one found?
+ RZ ;nope, we must be done.
+ MVI C,0 ;yes, update the first 12 bytes now.
+ MVI E,12
+ CALL UPDATE ;update filename and write directory.
+ CALL FINDNXT ;and get the next file.
+ JMP SAVATR1 ;then continue until done.
+;
+; Open a file (name specified in fcb).
+;
+OPENIT MVI C,15 ;compare the first 15 bytes.
+ CALL FINDFST ;get the first one in directory.
+ CALL CKFILPOS;any at all?
+ RZ
+OPENIT1 CALL SETEXT ;point to extent byte within users fcb.
+ MOV A,M ;and get it.
+ PUSH PSW ;save it and address.
+ PUSH H
+ CALL FCB2HL ;point to fcb in directory.
+ XCHG
+ LHLD PARAMS ;this is the users copy.
+ MVI C,32 ;move it into users space.
+ PUSH D
+ CALL DE2HL
+ CALL SETS2B7 ;set bit 7 in 's2' byte (unmodified).
+ POP D ;now get the extent byte from this fcb.
+ LXI H,12
+ DAD D
+ MOV C,M ;into (C).
+ LXI H,15 ;now get the record count byte into (B).
+ DAD D
+ MOV B,M
+ POP H ;keep the same extent as the user had originally.
+ POP PSW
+ MOV M,A
+ MOV A,C ;is it the same as in the directory fcb?
+ CMP M
+ MOV A,B ;if yes, then use the same record count.
+ JZ OPENIT2
+ MVI A,0 ;if the user specified an extent greater than
+ JC OPENIT2 ;the one in the directory, then set record count to 0.
+ MVI A,128 ;otherwise set to maximum.
+OPENIT2 LHLD PARAMS ;set record count in users fcb to (A).
+ LXI D,15
+ DAD D ;compute relative position.
+ MOV M,A ;and set the record count.
+ RET
+;
+; Move two bytes from (DE) to (HL) if (and only if) (HL)
+; point to a zero value (16 bit).
+; Return with zero flag set it (DE) was moved. Registers (DE)
+; and (HL) are not changed. However (A) is.
+;
+MOVEWORD:MOV A,M ;check for a zero word.
+ INX H
+ ORA M ;both bytes zero?
+ DCX H
+ RNZ ;nope, just return.
+ LDAX D ;yes, move two bytes from (DE) into
+ MOV M,A ;this zero space.
+ INX D
+ INX H
+ LDAX D
+ MOV M,A
+ DCX D ;don't disturb these registers.
+ DCX H
+ RET
+;
+; Get here to close a file specified by (fcb).
+;
+CLOSEIT XRA A ;clear status and file position bytes.
+ STA STATUS
+ STA FILEPOS
+ STA FILEPOS+1
+ CALL GETWPRT ;get write protect bit for this drive.
+ RNZ ;just return if it is set.
+ CALL GETS2 ;else get the 's2' byte.
+ ANI 80H ;and look at bit 7 (file unmodified?).
+ RNZ ;just return if set.
+ MVI C,15 ;else look up this file in directory.
+ CALL FINDFST
+ CALL CKFILPOS;was it found?
+ RZ ;just return if not.
+ LXI B,16 ;set (HL) pointing to records used section.
+ CALL FCB2HL
+ DAD B
+ XCHG
+ LHLD PARAMS ;do the same for users specified fcb.
+ DAD B
+ MVI C,16 ;this many bytes are present in this extent.
+CLOSEIT1:LDA BIGDISK ;8 or 16 bit record numbers?
+ ORA A
+ JZ CLOSEIT4
+ MOV A,M ;just 8 bit. Get one from users fcb.
+ ORA A
+ LDAX D ;now get one from directory fcb.
+ JNZ CLOSEIT2
+ MOV M,A ;users byte was zero. Update from directory.
+CLOSEIT2:ORA A
+ JNZ CLOSEIT3
+ MOV A,M ;directories byte was zero, update from users fcb.
+ STAX D
+CLOSEIT3:CMP M ;if neither one of these bytes were zero,
+ JNZ CLOSEIT7 ;then close error if they are not the same.
+ JMP CLOSEIT5 ;ok so far, get to next byte in fcbs.
+CLOSEIT4:CALL MOVEWORD;update users fcb if it is zero.
+ XCHG
+ CALL MOVEWORD;update directories fcb if it is zero.
+ XCHG
+ LDAX D ;if these two values are no different,
+ CMP M ;then a close error occured.
+ JNZ CLOSEIT7
+ INX D ;check second byte.
+ INX H
+ LDAX D
+ CMP M
+ JNZ CLOSEIT7
+ DCR C ;remember 16 bit values.
+CLOSEIT5:INX D ;bump to next item in table.
+ INX H
+ DCR C ;there are 16 entries only.
+ JNZ CLOSEIT1;continue if more to do.
+ LXI B,0FFECH;backup 20 places (extent byte).
+ DAD B
+ XCHG
+ DAD B
+ LDAX D
+ CMP M ;directory's extent already greater than the
+ JC CLOSEIT6 ;users extent?
+ MOV M,A ;no, update directory extent.
+ LXI B,3 ;and update the record count byte in
+ DAD B ;directories fcb.
+ XCHG
+ DAD B
+ MOV A,M ;get from user.
+ STAX D ;and put in directory.
+CLOSEIT6:MVI A,0FFH ;set 'was open and is now closed' byte.
+ STA CLOSEFLG
+ JMP UPDATE1 ;update the directory now.
+CLOSEIT7:LXI H,STATUS;set return status and then return.
+ DCR M
+ RET
+;
+; Routine to get the next empty space in the directory. It
+; will then be cleared for use.
+;
+GETEMPTY:CALL CHKWPRT ;make sure disk is not write protected.
+ LHLD PARAMS ;save current parameters (fcb).
+ PUSH H
+ LXI H,EMPTYFCB;use special one for empty space.
+ SHLD PARAMS
+ MVI C,1 ;search for first empty spot in directory.
+ CALL FINDFST ;(* only check first byte *)
+ CALL CKFILPOS;none?
+ POP H
+ SHLD PARAMS ;restore original fcb address.
+ RZ ;return if no more space.
+ XCHG
+ LXI H,15 ;point to number of records for this file.
+ DAD D
+ MVI C,17 ;and clear all of this space.
+ XRA A
+GETMT1 MOV M,A
+ INX H
+ DCR C
+ JNZ GETMT1
+ LXI H,13 ;clear the 's1' byte also.
+ DAD D
+ MOV M,A
+ CALL CHKNMBR ;keep (SCRATCH1) within bounds.
+ CALL FCBSET ;write out this fcb entry to directory.
+ JMP SETS2B7 ;set 's2' byte bit 7 (unmodified at present).
+;
+; Routine to close the current extent and open the next one
+; for reading.
+;
+GETNEXT XRA A
+ STA CLOSEFLG;clear close flag.
+ CALL CLOSEIT ;close this extent.
+ CALL CKFILPOS
+ RZ ;not there???
+ LHLD PARAMS ;get extent byte.
+ LXI B,12
+ DAD B
+ MOV A,M ;and increment it.
+ INR A
+ ANI 1FH ;keep within range 0-31.
+ MOV M,A
+ JZ GTNEXT1 ;overflow?
+ MOV B,A ;mask extent byte.
+ LDA EXTMASK
+ ANA B
+ LXI H,CLOSEFLG;check close flag (0ffh is ok).
+ ANA M
+ JZ GTNEXT2 ;if zero, we must read in next extent.
+ JMP GTNEXT3 ;else, it is already in memory.
+GTNEXT1 LXI B,2 ;Point to the 's2' byte.
+ DAD B
+ INR M ;and bump it.
+ MOV A,M ;too many extents?
+ ANI 0FH
+ JZ GTNEXT5 ;yes, set error code.
+;
+; Get here to open the next extent.
+;
+GTNEXT2 MVI C,15 ;set to check first 15 bytes of fcb.
+ CALL FINDFST ;find the first one.
+ CALL CKFILPOS;none available?
+ JNZ GTNEXT3
+ LDA RDWRTFLG;no extent present. Can we open an empty one?
+ INR A ;0ffh means reading (so not possible).
+ JZ GTNEXT5 ;or an error.
+ CALL GETEMPTY;we are writing, get an empty entry.
+ CALL CKFILPOS;none?
+ JZ GTNEXT5 ;error if true.
+ JMP GTNEXT4 ;else we are almost done.
+GTNEXT3 CALL OPENIT1 ;open this extent.
+GTNEXT4 CALL STRDATA ;move in updated data (rec #, extent #, etc.)
+ XRA A ;clear status and return.
+ JMP SETSTAT
+;
+; Error in extending the file. Too many extents were needed
+; or not enough space on the disk.
+;
+GTNEXT5 CALL IOERR1 ;set error code, clear bit 7 of 's2'
+ JMP SETS2B7 ;so this is not written on a close.
+;
+; Read a sequential file.
+;
+RDSEQ MVI A,1 ;set sequential access mode.
+ STA MODE
+RDSEQ1 MVI A,0FFH ;don't allow reading unwritten space.
+ STA RDWRTFLG
+ CALL STRDATA ;put rec# and ext# into fcb.
+ LDA SAVNREC ;get next record to read.
+ LXI H,SAVNXT;get number of records in extent.
+ CMP M ;within this extent?
+ JC RDSEQ2
+ CPI 128 ;no. Is this extent fully used?
+ JNZ RDSEQ3 ;no. End-of-file.
+ CALL GETNEXT ;yes, open the next one.
+ XRA A ;reset next record to read.
+ STA SAVNREC
+ LDA STATUS ;check on open, successful?
+ ORA A
+ JNZ RDSEQ3 ;no, error.
+RDSEQ2 CALL COMBLK ;ok. compute block number to read.
+ CALL CHKBLK ;check it. Within bounds?
+ JZ RDSEQ3 ;no, error.
+ CALL LOGICAL ;convert (BLKNMBR) to logical sector (128 byte).
+ CALL TRKSEC1 ;set the track and sector for this block #.
+ CALL DOREAD ;and read it.
+ JMP SETNREC ;and set the next record to be accessed.
+;
+; Read error occured. Set status and return.
+;
+RDSEQ3 JMP IOERR1
+;
+; Write the next sequential record.
+;
+WTSEQ MVI A,1 ;set sequential access mode.
+ STA MODE
+WTSEQ1 MVI A,0 ;allow an addition empty extent to be opened.
+ STA RDWRTFLG
+ CALL CHKWPRT ;check write protect status.
+ LHLD PARAMS
+ CALL CKROF1 ;check for read only file, (HL) already set to fcb.
+ CALL STRDATA ;put updated data into fcb.
+ LDA SAVNREC ;get record number to write.
+ CPI 128 ;within range?
+ JNC IOERR1 ;no, error(?).
+ CALL COMBLK ;compute block number.
+ CALL CHKBLK ;check number.
+ MVI C,0 ;is there one to write to?
+ JNZ WTSEQ6 ;yes, go do it.
+ CALL GETBLOCK;get next block number within fcb to use.
+ STA RELBLOCK;and save.
+ LXI B,0 ;start looking for space from the start
+ ORA A ;if none allocated as yet.
+ JZ WTSEQ2
+ MOV C,A ;extract previous block number from fcb
+ DCX B ;so we can be closest to it.
+ CALL EXTBLK
+ MOV B,H
+ MOV C,L
+WTSEQ2 CALL FNDSPACE;find the next empty block nearest number (BC).
+ MOV A,L ;check for a zero number.
+ ORA H
+ JNZ WTSEQ3
+ MVI A,2 ;no more space?
+ JMP SETSTAT
+WTSEQ3 SHLD BLKNMBR ;save block number to access.
+ XCHG ;put block number into (DE).
+ LHLD PARAMS ;now we must update the fcb for this
+ LXI B,16 ;newly allocated block.
+ DAD B
+ LDA BIGDISK ;8 or 16 bit block numbers?
+ ORA A
+ LDA RELBLOCK ;(* update this entry *)
+ JZ WTSEQ4 ;zero means 16 bit ones.
+ CALL ADDA2HL ;(HL)=(HL)+(A)
+ MOV M,E ;store new block number.
+ JMP WTSEQ5
+WTSEQ4 MOV C,A ;compute spot in this 16 bit table.
+ MVI B,0
+ DAD B
+ DAD B
+ MOV M,E ;stuff block number (DE) there.
+ INX H
+ MOV M,D
+WTSEQ5 MVI C,2 ;set (C) to indicate writing to un-used disk space.
+WTSEQ6 LDA STATUS ;are we ok so far?
+ ORA A
+ RNZ
+ PUSH B ;yes, save write flag for bios (register C).
+ CALL LOGICAL ;convert (BLKNMBR) over to loical sectors.
+ LDA MODE ;get access mode flag (1=sequential,
+ DCR A ;0=random, 2=special?).
+ DCR A
+ JNZ WTSEQ9
+;
+; Special random i/o from function #40. Maybe for M/PM, but the
+; current block, if it has not been written to, will be zeroed
+; out and then written (reason?).
+;
+ POP B
+ PUSH B
+ MOV A,C ;get write status flag (2=writing unused space).
+ DCR A
+ DCR A
+ JNZ WTSEQ9
+ PUSH H
+ LHLD DIRBUF ;zero out the directory buffer.
+ MOV D,A ;note that (A) is zero here.
+WTSEQ7 MOV M,A
+ INX H
+ INR D ;do 128 bytes.
+ JP WTSEQ7
+ CALL DIRDMA ;tell the bios the dma address for directory access.
+ LHLD LOGSECT ;get sector that starts current block.
+ MVI C,2 ;set 'writing to unused space' flag.
+WTSEQ8 SHLD BLKNMBR ;save sector to write.
+ PUSH B
+ CALL TRKSEC1 ;determine its track and sector numbers.
+ POP B
+ CALL DOWRITE ;now write out 128 bytes of zeros.
+ LHLD BLKNMBR ;get sector number.
+ MVI C,0 ;set normal write flag.
+ LDA BLKMASK ;determine if we have written the entire
+ MOV B,A ;physical block.
+ ANA L
+ CMP B
+ INX H ;prepare for the next one.
+ JNZ WTSEQ8 ;continue until (BLKMASK+1) sectors written.
+ POP H ;reset next sector number.
+ SHLD BLKNMBR
+ CALL DEFDMA ;and reset dma address.
+;
+; Normal disk write. Set the desired track and sector then
+; do the actual write.
+;
+WTSEQ9 CALL TRKSEC1 ;determine track and sector for this write.
+ POP B ;get write status flag.
+ PUSH B
+ CALL DOWRITE ;and write this out.
+ POP B
+ LDA SAVNREC ;get number of records in file.
+ LXI H,SAVNXT;get last record written.
+ CMP M
+ JC WTSEQ10
+ MOV M,A ;we have to update record count.
+ INR M
+ MVI C,2
+;
+;* This area has been patched to correct disk update problem
+;* when using blocking and de-blocking in the BIOS.
+;
+WTSEQ10 NOP ;was 'dcr c'
+ NOP ;was 'dcr c'
+ LXI H,0 ;was 'jnz wtseq99'
+;
+; * End of patch.
+;
+ PUSH PSW
+ CALL GETS2 ;set 'extent written to' flag.
+ ANI 7FH ;(* clear bit 7 *)
+ MOV M,A
+ POP PSW ;get record count for this extent.
+WTSEQ99 CPI 127 ;is it full?
+ JNZ WTSEQ12
+ LDA MODE ;yes, are we in sequential mode?
+ CPI 1
+ JNZ WTSEQ12
+ CALL SETNREC ;yes, set next record number.
+ CALL GETNEXT ;and get next empty space in directory.
+ LXI H,STATUS;ok?
+ MOV A,M
+ ORA A
+ JNZ WTSEQ11
+ DCR A ;yes, set record count to -1.
+ STA SAVNREC
+WTSEQ11 MVI M,0 ;clear status.
+WTSEQ12 JMP SETNREC ;set next record to access.
+;
+; For random i/o, set the fcb for the desired record number
+; based on the 'r0,r1,r2' bytes. These bytes in the fcb are
+; used as follows:
+;
+; fcb+35 fcb+34 fcb+33
+; | 'r-2' | 'r-1' | 'r-0' |
+; |7 0 | 7 0 | 7 0|
+; |0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0|
+; | overflow | | extra | extent | record # |
+; | ______________| |_extent|__number___|_____________|
+; also 's2'
+;
+; On entry, register (C) contains 0ffh if this is a read
+; and thus we can not access unwritten disk space. Otherwise,
+; another extent will be opened (for writing) if required.
+;
+POSITION:XRA A ;set random i/o flag.
+ STA MODE
+;
+; Special entry (function #40). M/PM ?
+;
+POSITN1 PUSH B ;save read/write flag.
+ LHLD PARAMS ;get address of fcb.
+ XCHG
+ LXI H,33 ;now get byte 'r0'.
+ DAD D
+ MOV A,M
+ ANI 7FH ;keep bits 0-6 for the record number to access.
+ PUSH PSW
+ MOV A,M ;now get bit 7 of 'r0' and bits 0-3 of 'r1'.
+ RAL
+ INX H
+ MOV A,M
+ RAL
+ ANI 1FH ;and save this in bits 0-4 of (C).
+ MOV C,A ;this is the extent byte.
+ MOV A,M ;now get the extra extent byte.
+ RAR
+ RAR
+ RAR
+ RAR
+ ANI 0FH
+ MOV B,A ;and save it in (B).
+ POP PSW ;get record number back to (A).
+ INX H ;check overflow byte 'r2'.
+ MOV L,M
+ INR L
+ DCR L
+ MVI L,6 ;prepare for error.
+ JNZ POSITN5 ;out of disk space error.
+ LXI H,32 ;store record number into fcb.
+ DAD D
+ MOV M,A
+ LXI H,12 ;and now check the extent byte.
+ DAD D
+ MOV A,C
+ SUB M ;same extent as before?
+ JNZ POSITN2
+ LXI H,14 ;yes, check extra extent byte 's2' also.
+ DAD D
+ MOV A,B
+ SUB M
+ ANI 7FH
+ JZ POSITN3;same, we are almost done then.
+;
+; Get here when another extent is required.
+;
+POSITN2 PUSH B
+ PUSH D
+ CALL CLOSEIT ;close current extent.
+ POP D
+ POP B
+ MVI L,3 ;prepare for error.
+ LDA STATUS
+ INR A
+ JZ POSITN4 ;close error.
+ LXI H,12 ;put desired extent into fcb now.
+ DAD D
+ MOV M,C
+ LXI H,14 ;and store extra extent byte 's2'.
+ DAD D
+ MOV M,B
+ CALL OPENIT ;try and get this extent.
+ LDA STATUS ;was it there?
+ INR A
+ JNZ POSITN3
+ POP B ;no. can we create a new one (writing?).
+ PUSH B
+ MVI L,4 ;prepare for error.
+ INR C
+ JZ POSITN4 ;nope, reading unwritten space error.
+ CALL GETEMPTY;yes we can, try to find space.
+ MVI L,5 ;prepare for error.
+ LDA STATUS
+ INR A
+ JZ POSITN4 ;out of space?
+;
+; Normal return location. Clear error code and return.
+;
+POSITN3 POP B ;restore stack.
+ XRA A ;and clear error code byte.
+ JMP SETSTAT
+;
+; Error. Set the 's2' byte to indicate this (why?).
+;
+POSITN4 PUSH H
+ CALL GETS2
+ MVI M,0C0H
+ POP H
+;
+; Return with error code (presently in L).
+;
+POSITN5 POP B
+ MOV A,L ;get error code.
+ STA STATUS
+ JMP SETS2B7
+;
+; Read a random record.
+;
+READRAN MVI C,0FFH ;set 'read' status.
+ CALL POSITION;position the file to proper record.
+ CZ RDSEQ1 ;and read it as usual (if no errors).
+ RET
+;
+; Write to a random record.
+;
+WRITERAN:MVI C,0 ;set 'writing' flag.
+ CALL POSITION;position the file to proper record.
+ CZ WTSEQ1 ;and write as usual (if no errors).
+ RET
+;
+; Compute the random record number. Enter with (HL) pointing
+; to a fcb an (DE) contains a relative location of a record
+; number. On exit, (C) contains the 'r0' byte, (B) the 'r1'
+; byte, and (A) the 'r2' byte.
+;
+; On return, the zero flag is set if the record is within
+; bounds. Otherwise, an overflow occured.
+;
+COMPRAND:XCHG ;save fcb pointer in (DE).
+ DAD D ;compute relative position of record #.
+ MOV C,M ;get record number into (BC).
+ MVI B,0
+ LXI H,12 ;now get extent.
+ DAD D
+ MOV A,M ;compute (BC)=(record #)+(extent)*128.
+ RRC ;move lower bit into bit 7.
+ ANI 80H ;and ignore all other bits.
+ ADD C ;add to our record number.
+ MOV C,A
+ MVI A,0 ;take care of any carry.
+ ADC B
+ MOV B,A
+ MOV A,M ;now get the upper bits of extent into
+ RRC ;bit positions 0-3.
+ ANI 0FH ;and ignore all others.
+ ADD B ;add this in to 'r1' byte.
+ MOV B,A
+ LXI H,14 ;get the 's2' byte (extra extent).
+ DAD D
+ MOV A,M
+ ADD A ;and shift it left 4 bits (bits 4-7).
+ ADD A
+ ADD A
+ ADD A
+ PUSH PSW ;save carry flag (bit 0 of flag byte).
+ ADD B ;now add extra extent into 'r1'.
+ MOV B,A
+ PUSH PSW ;and save carry (overflow byte 'r2').
+ POP H ;bit 0 of (L) is the overflow indicator.
+ MOV A,L
+ POP H ;and same for first carry flag.
+ ORA L ;either one of these set?
+ ANI 01H ;only check the carry flags.
+ RET
+;
+; Routine to setup the fcb (bytes 'r0', 'r1', 'r2') to
+; reflect the last record used for a random (or other) file.
+; This reads the directory and looks at all extents computing
+; the largerst record number for each and keeping the maximum
+; value only. Then 'r0', 'r1', and 'r2' will reflect this
+; maximum record number. This is used to compute the space used
+; by a random file.
+;
+RANSIZE MVI C,12 ;look thru directory for first entry with
+ CALL FINDFST ;this name.
+ LHLD PARAMS ;zero out the 'r0, r1, r2' bytes.
+ LXI D,33
+ DAD D
+ PUSH H
+ MOV M,D ;note that (D)=0.
+ INX H
+ MOV M,D
+ INX H
+ MOV M,D
+RANSIZ1 CALL CKFILPOS;is there an extent to process?
+ JZ RANSIZ3 ;no, we are done.
+ CALL FCB2HL ;set (HL) pointing to proper fcb in dir.
+ LXI D,15 ;point to last record in extent.
+ CALL COMPRAND;and compute random parameters.
+ POP H
+ PUSH H ;now check these values against those
+ MOV E,A ;already in fcb.
+ MOV A,C ;the carry flag will be set if those
+ SUB M ;in the fcb represent a larger size than
+ INX H ;this extent does.
+ MOV A,B
+ SBB M
+ INX H
+ MOV A,E
+ SBB M
+ JC RANSIZ2
+ MOV M,E ;we found a larger (in size) extent.
+ DCX H ;stuff these values into fcb.
+ MOV M,B
+ DCX H
+ MOV M,C
+RANSIZ2 CALL FINDNXT ;now get the next extent.
+ JMP RANSIZ1 ;continue til all done.
+RANSIZ3 POP H ;we are done, restore the stack and
+ RET ;return.
+;
+; Function to return the random record position of a given
+; file which has been read in sequential mode up to now.
+;
+SETRAN LHLD PARAMS ;point to fcb.
+ LXI D,32 ;and to last used record.
+ CALL COMPRAND;compute random position.
+ LXI H,33 ;now stuff these values into fcb.
+ DAD D
+ MOV M,C ;move 'r0'.
+ INX H
+ MOV M,B ;and 'r1'.
+ INX H
+ MOV M,A ;and lastly 'r2'.
+ RET
+;
+; This routine select the drive specified in (ACTIVE) and
+; update the login vector and bitmap table if this drive was
+; not already active.
+;
+LOGINDRV:LHLD LOGIN ;get the login vector.
+ LDA ACTIVE ;get the default drive.
+ MOV C,A
+ CALL SHIFTR ;position active bit for this drive
+ PUSH H ;into bit 0.
+ XCHG
+ CALL SELECT ;select this drive.
+ POP H
+ CZ SLCTERR ;valid drive?
+ MOV A,L ;is this a newly activated drive?
+ RAR
+ RC
+ LHLD LOGIN ;yes, update the login vector.
+ MOV C,L
+ MOV B,H
+ CALL SETBIT
+ SHLD LOGIN ;and save.
+ JMP BITMAP ;now update the bitmap.
+;
+; Function to set the active disk number.
+;
+SETDSK LDA EPARAM ;get parameter passed and see if this
+ LXI H,ACTIVE;represents a change in drives.
+ CMP M
+ RZ
+ MOV M,A ;yes it does, log it in.
+ JMP LOGINDRV
+;
+; This is the 'auto disk select' routine. The firsst byte
+; of the fcb is examined for a drive specification. If non
+; zero then the drive will be selected and loged in.
+;
+AUTOSEL MVI A,0FFH ;say 'auto-select activated'.
+ STA AUTO
+ LHLD PARAMS ;get drive specified.
+ MOV A,M
+ ANI 1FH ;look at lower 5 bits.
+ DCR A ;adjust for (1=A, 2=B) etc.
+ STA EPARAM ;and save for the select routine.
+ CPI 1EH ;check for 'no change' condition.
+ JNC AUTOSL1 ;yes, don't change.
+ LDA ACTIVE ;we must change, save currently active
+ STA OLDDRV ;drive.
+ MOV A,M ;and save first byte of fcb also.
+ STA AUTOFLAG;this must be non-zero.
+ ANI 0E0H ;whats this for (bits 6,7 are used for
+ MOV M,A ;something)?
+ CALL SETDSK ;select and log in this drive.
+AUTOSL1 LDA USERNO ;move user number into fcb.
+ LHLD PARAMS ;(* upper half of first byte *)
+ ORA M
+ MOV M,A
+ RET ;and return (all done).
+;
+; Function to return the current cp/m version number.
+;
+GETVER MVI A,022h ;version 2.2
+ JMP SETSTAT
+;
+; Function to reset the disk system.
+;
+RSTDSK LXI H,0 ;clear write protect status and log
+ SHLD WRTPRT ;in vector.
+ SHLD LOGIN
+ XRA A ;select drive 'A'.
+ STA ACTIVE
+ LXI H,TBUFF ;setup default dma address.
+ SHLD USERDMA
+ CALL DEFDMA
+ JMP LOGINDRV;now log in drive 'A'.
+;
+; Function to open a specified file.
+;
+OPENFIL CALL CLEARS2 ;clear 's2' byte.
+ CALL AUTOSEL ;select proper disk.
+ JMP OPENIT ;and open the file.
+;
+; Function to close a specified file.
+;
+CLOSEFIL:CALL AUTOSEL ;select proper disk.
+ JMP CLOSEIT ;and close the file.
+;
+; Function to return the first occurence of a specified file
+; name. If the first byte of the fcb is '?' then the name will
+; not be checked (get the first entry no matter what).
+;
+GETFST MVI C,0 ;prepare for special search.
+ XCHG
+ MOV A,M ;is first byte a '?'?
+ CPI '?'
+ JZ GETFST1 ;yes, just get very first entry (zero length match).
+ CALL SETEXT ;get the extension byte from fcb.
+ MOV A,M ;is it '?'? if yes, then we want
+ CPI '?' ;an entry with a specific 's2' byte.
+ CNZ CLEARS2 ;otherwise, look for a zero 's2' byte.
+ CALL AUTOSEL ;select proper drive.
+ MVI C,15 ;compare bytes 0-14 in fcb (12&13 excluded).
+GETFST1 CALL FINDFST ;find an entry and then move it into
+ JMP MOVEDIR ;the users dma space.
+;
+; Function to return the next occurence of a file name.
+;
+GETNXT LHLD SAVEFCB ;restore pointers. note that no
+ SHLD PARAMS ;other dbos calls are allowed.
+ CALL AUTOSEL ;no error will be returned, but the
+ CALL FINDNXT ;results will be wrong.
+ JMP MOVEDIR
+;
+; Function to delete a file by name.
+;
+DELFILE CALL AUTOSEL ;select proper drive.
+ CALL ERAFILE ;erase the file.
+ JMP STSTATUS;set status and return.
+;
+; Function to execute a sequential read of the specified
+; record number.
+;
+READSEQ CALL AUTOSEL ;select proper drive then read.
+ JMP RDSEQ
+;
+; Function to write the net sequential record.
+;
+WRTSEQ CALL AUTOSEL ;select proper drive then write.
+ JMP WTSEQ
+;
+; Create a file function.
+;
+FCREATE CALL CLEARS2 ;clear the 's2' byte on all creates.
+ CALL AUTOSEL ;select proper drive and get the next
+ JMP GETEMPTY;empty directory space.
+;
+; Function to rename a file.
+;
+RENFILE CALL AUTOSEL ;select proper drive and then switch
+ CALL CHGNAMES;file names.
+ JMP STSTATUS
+;
+; Function to return the login vector.
+;
+GETLOG LHLD LOGIN
+ JMP GETPRM1
+;
+; Function to return the current disk assignment.
+;
+GETCRNT LDA ACTIVE
+ JMP SETSTAT
+;
+; Function to set the dma address.
+;
+PUTDMA XCHG
+ SHLD USERDMA ;save in our space and then get to
+ JMP DEFDMA ;the bios with this also.
+;
+; Function to return the allocation vector.
+;
+GETALOC LHLD ALOCVECT
+ JMP GETPRM1
+;
+; Function to return the read-only status vector.
+;
+GETROV LHLD WRTPRT
+ JMP GETPRM1
+;
+; Function to set the file attributes (read-only, system).
+;
+SETATTR CALL AUTOSEL ;select proper drive then save attributes.
+ CALL SAVEATTR
+ JMP STSTATUS
+;
+; Function to return the address of the disk parameter block
+; for the current drive.
+;
+GETPARM LHLD DISKPB
+GETPRM1 SHLD STATUS
+ RET
+;
+; Function to get or set the user number. If (E) was (FF)
+; then this is a request to return the current user number.
+; Else set the user number from (E).
+;
+GETUSER LDA EPARAM ;get parameter.
+ CPI 0FFH ;get user number?
+ JNZ SETUSER
+ LDA USERNO ;yes, just do it.
+ JMP SETSTAT
+SETUSER ANI 1FH ;no, we should set it instead. keep low
+ STA USERNO ;bits (0-4) only.
+ RET
+;
+; Function to read a random record from a file.
+;
+RDRANDOM:CALL AUTOSEL ;select proper drive and read.
+ JMP READRAN
+;
+; Function to compute the file size for random files.
+;
+WTRANDOM:CALL AUTOSEL ;select proper drive and write.
+ JMP WRITERAN
+;
+; Function to compute the size of a random file.
+;
+FILESIZE:CALL AUTOSEL ;select proper drive and check file length
+ JMP RANSIZE
+;
+; Function #37. This allows a program to log off any drives.
+; On entry, set (DE) to contain a word with bits set for those
+; drives that are to be logged off. The log-in vector and the
+; write protect vector will be updated. This must be a M/PM
+; special function.
+;
+LOGOFF LHLD PARAMS ;get drives to log off.
+ MOV A,L ;for each bit that is set, we want
+ CMA ;to clear that bit in (LOGIN)
+ MOV E,A ;and (WRTPRT).
+ MOV A,H
+ CMA
+ LHLD LOGIN ;reset the login vector.
+ ANA H
+ MOV D,A
+ MOV A,L
+ ANA E
+ MOV E,A
+ LHLD WRTPRT
+ XCHG
+ SHLD LOGIN ;and save.
+ MOV A,L ;now do the write protect vector.
+ ANA E
+ MOV L,A
+ MOV A,H
+ ANA D
+ MOV H,A
+ SHLD WRTPRT ;and save. all done.
+ RET
+;
+; Get here to return to the user.
+;
+GOBACK LDA AUTO ;was auto select activated?
+ ORA A
+ JZ GOBACK1
+ LHLD PARAMS ;yes, but was a change made?
+ MVI M,0 ;(* reset first byte of fcb *)
+ LDA AUTOFLAG
+ ORA A
+ JZ GOBACK1
+ MOV M,A ;yes, reset first byte properly.
+ LDA OLDDRV ;and get the old drive and select it.
+ STA EPARAM
+ CALL SETDSK
+GOBACK1 LHLD USRSTACK;reset the users stack pointer.
+ SPHL
+ LHLD STATUS ;get return status.
+ MOV A,L ;force version 1.4 compatability.
+ MOV B,H
+ RET ;and go back to user.
+;
+; Function #40. This is a special entry to do random i/o.
+; For the case where we are writing to unused disk space, this
+; space will be zeroed out first. This must be a M/PM special
+; purpose function, because why would any normal program even
+; care about the previous contents of a sector about to be
+; written over.
+;
+WTSPECL CALL AUTOSEL ;select proper drive.
+ MVI A,2 ;use special write mode.
+ STA MODE
+ MVI C,0 ;set write indicator.
+ CALL POSITN1 ;position the file.
+ CZ WTSEQ1 ;and write (if no errors).
+ RET
+;
+;**************************************************************
+;*
+;* BDOS data storage pool.
+;*
+;**************************************************************
+;
+EMPTYFCB:DB 0E5H ;empty directory segment indicator.
+WRTPRT DW 0 ;write protect status for all 16 drives.
+LOGIN DW 0 ;drive active word (1 bit per drive).
+USERDMA DW 080H ;user's dma address (defaults to 80h).
+;
+; Scratch areas from parameter block.
+;
+SCRATCH1:DW 0 ;relative position within dir segment for file (0-3).
+SCRATCH2:DW 0 ;last selected track number.
+SCRATCH3:DW 0 ;last selected sector number.
+;
+; Disk storage areas from parameter block.
+;
+DIRBUF DW 0 ;address of directory buffer to use.
+DISKPB DW 0 ;contains address of disk parameter block.
+CHKVECT DW 0 ;address of check vector.
+ALOCVECT:DW 0 ;address of allocation vector (bit map).
+;
+; Parameter block returned from the bios.
+;
+SECTORS DW 0 ;sectors per track from bios.
+BLKSHFT DB 0 ;block shift.
+BLKMASK DB 0 ;block mask.
+EXTMASK DB 0 ;extent mask.
+DSKSIZE DW 0 ;disk size from bios (number of blocks-1).
+DIRSIZE DW 0 ;directory size.
+ALLOC0 DW 0 ;storage for first bytes of bit map (dir space used).
+ALLOC1 DW 0
+OFFSET DW 0 ;first usable track number.
+XLATE DW 0 ;sector translation table address.
+;
+;
+CLOSEFLG:DB 0 ;close flag (=0ffh is extent written ok).
+RDWRTFLG:DB 0 ;read/write flag (0ffh=read, 0=write).
+FNDSTAT DB 0 ;filename found status (0=found first entry).
+MODE DB 0 ;I/o mode select (0=random, 1=sequential, 2=special random).
+EPARAM DB 0 ;storage for register (E) on entry to bdos.
+RELBLOCK:DB 0 ;relative position within fcb of block number written.
+COUNTER DB 0 ;byte counter for directory name searches.
+SAVEFCB DW 0,0 ;save space for address of fcb (for directory searches).
+BIGDISK DB 0 ;if =0 then disk is > 256 blocks long.
+AUTO DB 0 ;if non-zero, then auto select activated.
+OLDDRV DB 0 ;on auto select, storage for previous drive.
+AUTOFLAG:DB 0 ;if non-zero, then auto select changed drives.
+SAVNXT DB 0 ;storage for next record number to access.
+SAVEXT DB 0 ;storage for extent number of file.
+SAVNREC DW 0 ;storage for number of records in file.
+BLKNMBR DW 0 ;block number (physical sector) used within a file or logical sector.
+LOGSECT DW 0 ;starting logical (128 byte) sector of block (physical sector).
+FCBPOS DB 0 ;relative position within buffer for fcb of file of interest.
+FILEPOS DW 0 ;files position within directory (0 to max entries -1).
+;
+; Disk directory buffer checksum bytes. One for each of the
+; 16 possible drives.
+;
+CKSUMTBL:DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;
+; Extra space ?
+;
+ DB 0,0,0,0
+;
+;**************************************************************
+;*
+;* B I O S J U M P T A B L E
+;*
+;**************************************************************
+;
+BOOT JMP 0 ;NOTE WE USE FAKE DESTINATIONS
+WBOOT JMP 0
+CONST JMP 0
+CONIN JMP 0
+CONOUT JMP 0
+LIST JMP 0
+PUNCH JMP 0
+READER JMP 0
+HOME JMP 0
+SELDSK JMP 0
+SETTRK JMP 0
+SETSEC JMP 0
+SETDMA JMP 0
+READ JMP 0
+WRITE JMP 0
+PRSTAT JMP 0
+SECTRN JMP 0
+;
+;*
+;****************** E N D O F C P / M *****************
+;*
+
diff --git a/cpm/cpm2-asm/CPM22.Z80 b/cpm/cpm2-asm/CPM22.Z80
new file mode 100644
index 0000000..115d8c5
--- /dev/null
+++ b/cpm/cpm2-asm/CPM22.Z80
@@ -0,0 +1,3738 @@
+;**************************************************************
+;*
+;* C P / M version 2 . 2
+;*
+;* Reconstructed from memory image on February 27, 1981
+;*
+;* by Clark A. Calkins
+;*
+;**************************************************************
+;
+; Set memory limit here. This is the amount of contigeous
+; ram starting from 0000. CP/M will reside at the end of this space.
+;
+MEM EQU 62 ;for a 62k system (TS802 TEST - WORKS OK).
+;
+IOBYTE EQU 3 ;i/o definition byte.
+TDRIVE EQU 4 ;current drive name and user number.
+ENTRY EQU 5 ;entry point for the cp/m bdos.
+TFCB EQU 5CH ;default file control block.
+TBUFF EQU 80H ;i/o buffer and command line storage.
+TBASE EQU 100H ;transiant program storage area.
+;
+; Set control character equates.
+;
+CNTRLC EQU 3 ;control-c
+CNTRLE EQU 05H ;control-e
+BS EQU 08H ;backspace
+TAB EQU 09H ;tab
+LF EQU 0AH ;line feed
+FF EQU 0CH ;form feed
+CR EQU 0DH ;carriage return
+CNTRLP EQU 10H ;control-p
+CNTRLR EQU 12H ;control-r
+CNTRLS EQU 13H ;control-s
+CNTRLU EQU 15H ;control-u
+CNTRLX EQU 18H ;control-x
+CNTRLZ EQU 1AH ;control-z (end-of-file mark)
+DEL EQU 7FH ;rubout
+;
+; Set origin for CP/M
+;
+ ORG (MEM-7)*1024
+;
+CBASE: JP COMMAND ;execute command processor (ccp).
+ JP CLEARBUF ;entry to empty input buffer before starting ccp.
+
+;
+; Standard cp/m ccp input buffer. Format is (max length),
+; (actual length), (char #1), (char #2), (char #3), etc.
+;
+INBUFF: DEFB 127 ;length of input buffer.
+ DEFB 0 ;current length of contents.
+ DEFB 'Copyright'
+ DEFB ' 1979 (c) by Digital Research '
+ DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+INPOINT:DEFW INBUFF+2 ;input line pointer
+NAMEPNT:DEFW 0 ;input line pointer used for error message. Points to
+; ;start of name in error.
+;
+; Routine to print (A) on the console. All registers used.
+;
+PRINT: LD E,A ;setup bdos call.
+ LD C,2
+ JP ENTRY
+;
+; Routine to print (A) on the console and to save (BC).
+;
+PRINTB: PUSH BC
+ CALL PRINT
+ POP BC
+ RET
+;
+; Routine to send a carriage return, line feed combination
+; to the console.
+;
+CRLF: LD A,CR
+ CALL PRINTB
+ LD A,LF
+ JP PRINTB
+;
+; Routine to send one space to the console and save (BC).
+;
+SPACE: LD A,' '
+ JP PRINTB
+;
+; Routine to print character string pointed to be (BC) on the
+; console. It must terminate with a null byte.
+;
+PLINE: PUSH BC
+ CALL CRLF
+ POP HL
+PLINE2: LD A,(HL)
+ OR A
+ RET Z
+ INC HL
+ PUSH HL
+ CALL PRINT
+ POP HL
+ JP PLINE2
+;
+; Routine to reset the disk system.
+;
+RESDSK: LD C,13
+ JP ENTRY
+;
+; Routine to select disk (A).
+;
+DSKSEL: LD E,A
+ LD C,14
+ JP ENTRY
+;
+; Routine to call bdos and save the return code. The zero
+; flag is set on a return of 0ffh.
+;
+ENTRY1: CALL ENTRY
+ LD (RTNCODE),A ;save return code.
+ INC A ;set zero if 0ffh returned.
+ RET
+;
+; Routine to open a file. (DE) must point to the FCB.
+;
+OPEN: LD C,15
+ JP ENTRY1
+;
+; Routine to open file at (FCB).
+;
+OPENFCB:XOR A ;clear the record number byte at fcb+32
+ LD (FCB+32),A
+ LD DE,FCB
+ JP OPEN
+;
+; Routine to close a file. (DE) points to FCB.
+;
+CLOSE: LD C,16
+ JP ENTRY1
+;
+; Routine to search for the first file with ambigueous name
+; (DE).
+;
+SRCHFST:LD C,17
+ JP ENTRY1
+;
+; Search for the next ambigeous file name.
+;
+SRCHNXT:LD C,18
+ JP ENTRY1
+;
+; Search for file at (FCB).
+;
+SRCHFCB:LD DE,FCB
+ JP SRCHFST
+;
+; Routine to delete a file pointed to by (DE).
+;
+DELETE: LD C,19
+ JP ENTRY
+;
+; Routine to call the bdos and set the zero flag if a zero
+; status is returned.
+;
+ENTRY2: CALL ENTRY
+ OR A ;set zero flag if appropriate.
+ RET
+;
+; Routine to read the next record from a sequential file.
+; (DE) points to the FCB.
+;
+RDREC: LD C,20
+ JP ENTRY2
+;
+; Routine to read file at (FCB).
+;
+READFCB:LD DE,FCB
+ JP RDREC
+;
+; Routine to write the next record of a sequential file.
+; (DE) points to the FCB.
+;
+WRTREC: LD C,21
+ JP ENTRY2
+;
+; Routine to create the file pointed to by (DE).
+;
+CREATE: LD C,22
+ JP ENTRY1
+;
+; Routine to rename the file pointed to by (DE). Note that
+; the new name starts at (DE+16).
+;
+RENAM: LD C,23
+ JP ENTRY
+;
+; Get the current user code.
+;
+GETUSR: LD E,0FFH
+;
+; Routne to get or set the current user code.
+; If (E) is FF then this is a GET, else it is a SET.
+;
+GETSETUC: LD C,32
+ JP ENTRY
+;
+; Routine to set the current drive byte at (TDRIVE).
+;
+SETCDRV:CALL GETUSR ;get user number
+ ADD A,A ;and shift into the upper 4 bits.
+ ADD A,A
+ ADD A,A
+ ADD A,A
+ LD HL,CDRIVE ;now add in the current drive number.
+ OR (HL)
+ LD (TDRIVE),A ;and save.
+ RET
+;
+; Move currently active drive down to (TDRIVE).
+;
+MOVECD: LD A,(CDRIVE)
+ LD (TDRIVE),A
+ RET
+;
+; Routine to convert (A) into upper case ascii. Only letters
+; are affected.
+;
+UPPER: CP 'a' ;check for letters in the range of 'a' to 'z'.
+ RET C
+ CP '{'
+ RET NC
+ AND 5FH ;convert it if found.
+ RET
+;
+; Routine to get a line of input. We must check to see if the
+; user is in (BATCH) mode. If so, then read the input from file
+; ($$$.SUB). At the end, reset to console input.
+;
+GETINP: LD A,(BATCH) ;if =0, then use console input.
+ OR A
+ JP Z,GETINP1
+;
+; Use the submit file ($$$.sub) which is prepared by a
+; SUBMIT run. It must be on drive (A) and it will be deleted
+; if and error occures (like eof).
+;
+ LD A,(CDRIVE) ;select drive 0 if need be.
+ OR A
+ LD A,0 ;always use drive A for submit.
+ CALL NZ,DSKSEL ;select it if required.
+ LD DE,BATCHFCB
+ CALL OPEN ;look for it.
+ JP Z,GETINP1 ;if not there, use normal input.
+ LD A,(BATCHFCB+15) ;get last record number+1.
+ DEC A
+ LD (BATCHFCB+32),A
+ LD DE,BATCHFCB
+ CALL RDREC ;read last record.
+ JP NZ,GETINP1 ;quit on end of file.
+;
+; Move this record into input buffer.
+;
+ LD DE,INBUFF+1
+ LD HL,TBUFF ;data was read into buffer here.
+ LD B,128 ;all 128 characters may be used.
+ CALL HL2DE ;(HL) to (DE), (B) bytes.
+ LD HL,BATCHFCB+14
+ LD (HL),0 ;zero out the 's2' byte.
+ INC HL ;and decrement the record count.
+ DEC (HL)
+ LD DE,BATCHFCB ;close the batch file now.
+ CALL CLOSE
+ JP Z,GETINP1 ;quit on an error.
+ LD A,(CDRIVE) ;re-select previous drive if need be.
+ OR A
+ CALL NZ,DSKSEL ;don't do needless selects.
+;
+; Print line just read on console.
+;
+ LD HL,INBUFF+2
+ CALL PLINE2
+ CALL CHKCON ;check console, quit on a key.
+ JP Z,GETINP2 ;jump if no key is pressed.
+;
+; Terminate the submit job on any keyboard input. Delete this
+; file such that it is not re-started and jump to normal keyboard
+; input section.
+;
+ CALL DELBATCH ;delete the batch file.
+ JP CMMND1 ;and restart command input.
+;
+; Get here for normal keyboard input. Delete the submit file
+; incase there was one.
+;
+GETINP1:CALL DELBATCH ;delete file ($$$.sub).
+ CALL SETCDRV ;reset active disk.
+ LD C,10 ;get line from console device.
+ LD DE,INBUFF
+ CALL ENTRY
+ CALL MOVECD ;reset current drive (again).
+;
+; Convert input line to upper case.
+;
+GETINP2:LD HL,INBUFF+1
+ LD B,(HL) ;(B)=character counter.
+GETINP3:INC HL
+ LD A,B ;end of the line?
+ OR A
+ JP Z,GETINP4
+ LD A,(HL) ;convert to upper case.
+ CALL UPPER
+ LD (HL),A
+ DEC B ;adjust character count.
+ JP GETINP3
+GETINP4:LD (HL),A ;add trailing null.
+ LD HL,INBUFF+2
+ LD (INPOINT),HL ;reset input line pointer.
+ RET
+;
+; Routine to check the console for a key pressed. The zero
+; flag is set is none, else the character is returned in (A).
+;
+CHKCON: LD C,11 ;check console.
+ CALL ENTRY
+ OR A
+ RET Z ;return if nothing.
+ LD C,1 ;else get character.
+ CALL ENTRY
+ OR A ;clear zero flag and return.
+ RET
+;
+; Routine to get the currently active drive number.
+;
+GETDSK: LD C,25
+ JP ENTRY
+;
+; Set the stabdard dma address.
+;
+STDDMA: LD DE,TBUFF
+;
+; Routine to set the dma address to (DE).
+;
+DMASET: LD C,26
+ JP ENTRY
+;
+; Delete the batch file created by SUBMIT.
+;
+DELBATCH: LD HL,BATCH ;is batch active?
+ LD A,(HL)
+ OR A
+ RET Z
+ LD (HL),0 ;yes, de-activate it.
+ XOR A
+ CALL DSKSEL ;select drive 0 for sure.
+ LD DE,BATCHFCB ;and delete this file.
+ CALL DELETE
+ LD A,(CDRIVE) ;reset current drive.
+ JP DSKSEL
+;
+; Check to two strings at (PATTRN1) and (PATTRN2). They must be
+; the same or we halt....
+;
+VERIFY: LD DE,PATTRN1 ;these are the serial number bytes.
+ LD HL,PATTRN2 ;ditto, but how could they be different?
+ LD B,6 ;6 bytes each.
+VERIFY1:LD A,(DE)
+ CP (HL)
+ JP NZ,HALT ;jump to halt routine.
+ INC DE
+ INC HL
+ DEC B
+ JP NZ,VERIFY1
+ RET
+;
+; Print back file name with a '?' to indicate a syntax error.
+;
+SYNERR: CALL CRLF ;end current line.
+ LD HL,(NAMEPNT) ;this points to name in error.
+SYNERR1:LD A,(HL) ;print it until a space or null is found.
+ CP ' '
+ JP Z,SYNERR2
+ OR A
+ JP Z,SYNERR2
+ PUSH HL
+ CALL PRINT
+ POP HL
+ INC HL
+ JP SYNERR1
+SYNERR2:LD A,'?' ;add trailing '?'.
+ CALL PRINT
+ CALL CRLF
+ CALL DELBATCH ;delete any batch file.
+ JP CMMND1 ;and restart from console input.
+;
+; Check character at (DE) for legal command input. Note that the
+; zero flag is set if the character is a delimiter.
+;
+CHECK: LD A,(DE)
+ OR A
+ RET Z
+ CP ' ' ;control characters are not legal here.
+ JP C,SYNERR
+ RET Z ;check for valid delimiter.
+ CP '='
+ RET Z
+ CP '_'
+ RET Z
+ CP '.'
+ RET Z
+ CP ':'
+ RET Z
+ CP ';'
+ RET Z
+ CP '<'
+ RET Z
+ CP '>'
+ RET Z
+ RET
+;
+; Get the next non-blank character from (DE).
+;
+NONBLANK: LD A,(DE)
+ OR A ;string ends with a null.
+ RET Z
+ CP ' '
+ RET NZ
+ INC DE
+ JP NONBLANK
+;
+; Add (HL)=(HL)+(A)
+;
+ADDHL: ADD A,L
+ LD L,A
+ RET NC ;take care of any carry.
+ INC H
+ RET
+;
+; Convert the first name in (FCB).
+;
+CONVFST:LD A,0
+;
+; Format a file name (convert * to '?', etc.). On return,
+; (A)=0 is an unambigeous name was specified. Enter with (A) equal to
+; the position within the fcb for the name (either 0 or 16).
+;
+CONVERT:LD HL,FCB
+ CALL ADDHL
+ PUSH HL
+ PUSH HL
+ XOR A
+ LD (CHGDRV),A ;initialize drive change flag.
+ LD HL,(INPOINT) ;set (HL) as pointer into input line.
+ EX DE,HL
+ CALL NONBLANK ;get next non-blank character.
+ EX DE,HL
+ LD (NAMEPNT),HL ;save pointer here for any error message.
+ EX DE,HL
+ POP HL
+ LD A,(DE) ;get first character.
+ OR A
+ JP Z,CONVRT1
+ SBC A,'A'-1 ;might be a drive name, convert to binary.
+ LD B,A ;and save.
+ INC DE ;check next character for a ':'.
+ LD A,(DE)
+ CP ':'
+ JP Z,CONVRT2
+ DEC DE ;nope, move pointer back to the start of the line.
+CONVRT1:LD A,(CDRIVE)
+ LD (HL),A
+ JP CONVRT3
+CONVRT2:LD A,B
+ LD (CHGDRV),A ;set change in drives flag.
+ LD (HL),B
+ INC DE
+;
+; Convert the basic file name.
+;
+CONVRT3:LD B,08H
+CONVRT4:CALL CHECK
+ JP Z,CONVRT8
+ INC HL
+ CP '*' ;note that an '*' will fill the remaining
+ JP NZ,CONVRT5 ;field with '?'.
+ LD (HL),'?'
+ JP CONVRT6
+CONVRT5:LD (HL),A
+ INC DE
+CONVRT6:DEC B
+ JP NZ,CONVRT4
+CONVRT7:CALL CHECK ;get next delimiter.
+ JP Z,GETEXT
+ INC DE
+ JP CONVRT7
+CONVRT8:INC HL ;blank fill the file name.
+ LD (HL),' '
+ DEC B
+ JP NZ,CONVRT8
+;
+; Get the extension and convert it.
+;
+GETEXT: LD B,03H
+ CP '.'
+ JP NZ,GETEXT5
+ INC DE
+GETEXT1:CALL CHECK
+ JP Z,GETEXT5
+ INC HL
+ CP '*'
+ JP NZ,GETEXT2
+ LD (HL),'?'
+ JP GETEXT3
+GETEXT2:LD (HL),A
+ INC DE
+GETEXT3:DEC B
+ JP NZ,GETEXT1
+GETEXT4:CALL CHECK
+ JP Z,GETEXT6
+ INC DE
+ JP GETEXT4
+GETEXT5:INC HL
+ LD (HL),' '
+ DEC B
+ JP NZ,GETEXT5
+GETEXT6:LD B,3
+GETEXT7:INC HL
+ LD (HL),0
+ DEC B
+ JP NZ,GETEXT7
+ EX DE,HL
+ LD (INPOINT),HL ;save input line pointer.
+ POP HL
+;
+; Check to see if this is an ambigeous file name specification.
+; Set the (A) register to non zero if it is.
+;
+ LD BC,11 ;set name length.
+GETEXT8:INC HL
+ LD A,(HL)
+ CP '?' ;any question marks?
+ JP NZ,GETEXT9
+ INC B ;count them.
+GETEXT9:DEC C
+ JP NZ,GETEXT8
+ LD A,B
+ OR A
+ RET
+;
+; CP/M command table. Note commands can be either 3 or 4 characters long.
+;
+NUMCMDS EQU 6 ;number of commands
+CMDTBL: DEFB 'DIR '
+ DEFB 'ERA '
+ DEFB 'TYPE'
+ DEFB 'SAVE'
+ DEFB 'REN '
+ DEFB 'USER'
+;
+; The following six bytes must agree with those at (PATTRN2)
+; or cp/m will HALT. Why?
+;
+PATTRN1:DEFB 0,22,0,0,0,0 ;(* serial number bytes *).
+;
+; Search the command table for a match with what has just
+; been entered. If a match is found, then we jump to the
+; proper section. Else jump to (UNKNOWN).
+; On return, the (C) register is set to the command number
+; that matched (or NUMCMDS+1 if no match).
+;
+SEARCH: LD HL,CMDTBL
+ LD C,0
+SEARCH1:LD A,C
+ CP NUMCMDS ;this commands exists.
+ RET NC
+ LD DE,FCB+1 ;check this one.
+ LD B,4 ;max command length.
+SEARCH2:LD A,(DE)
+ CP (HL)
+ JP NZ,SEARCH3 ;not a match.
+ INC DE
+ INC HL
+ DEC B
+ JP NZ,SEARCH2
+ LD A,(DE) ;allow a 3 character command to match.
+ CP ' '
+ JP NZ,SEARCH4
+ LD A,C ;set return register for this command.
+ RET
+SEARCH3:INC HL
+ DEC B
+ JP NZ,SEARCH3
+SEARCH4:INC C
+ JP SEARCH1
+;
+; Set the input buffer to empty and then start the command
+; processor (ccp).
+;
+CLEARBUF: XOR A
+ LD (INBUFF+1),A ;second byte is actual length.
+;
+;**************************************************************
+;*
+;*
+;* C C P - C o n s o l e C o m m a n d P r o c e s s o r
+;*
+;**************************************************************
+;*
+COMMAND:LD SP,CCPSTACK ;setup stack area.
+ PUSH BC ;note that (C) should be equal to:
+ LD A,C ;(uuuudddd) where 'uuuu' is the user number
+ RRA ;and 'dddd' is the drive number.
+ RRA
+ RRA
+ RRA
+ AND 0FH ;isolate the user number.
+ LD E,A
+ CALL GETSETUC ;and set it.
+ CALL RESDSK ;reset the disk system.
+ LD (BATCH),A ;clear batch mode flag.
+ POP BC
+ LD A,C
+ AND 0FH ;isolate the drive number.
+ LD (CDRIVE),A ;and save.
+ CALL DSKSEL ;...and select.
+ LD A,(INBUFF+1)
+ OR A ;anything in input buffer already?
+ JP NZ,CMMND2 ;yes, we just process it.
+;
+; Entry point to get a command line from the console.
+;
+CMMND1: LD SP,CCPSTACK ;set stack straight.
+ CALL CRLF ;start a new line on the screen.
+ CALL GETDSK ;get current drive.
+ ADD A,'a'
+ CALL PRINT ;print current drive.
+ LD A,'>'
+ CALL PRINT ;and add prompt.
+ CALL GETINP ;get line from user.
+;
+; Process command line here.
+;
+CMMND2: LD DE,TBUFF
+ CALL DMASET ;set standard dma address.
+ CALL GETDSK
+ LD (CDRIVE),A ;set current drive.
+ CALL CONVFST ;convert name typed in.
+ CALL NZ,SYNERR ;wild cards are not allowed.
+ LD A,(CHGDRV) ;if a change in drives was indicated,
+ OR A ;then treat this as an unknown command
+ JP NZ,UNKNOWN ;which gets executed.
+ CALL SEARCH ;else search command table for a match.
+;
+; Note that an unknown command returns
+; with (A) pointing to the last address
+; in our table which is (UNKNOWN).
+;
+ LD HL,CMDADR ;now, look thru our address table for command (A).
+ LD E,A ;set (DE) to command number.
+ LD D,0
+ ADD HL,DE
+ ADD HL,DE ;(HL)=(CMDADR)+2*(command number).
+ LD A,(HL) ;now pick out this address.
+ INC HL
+ LD H,(HL)
+ LD L,A
+ JP (HL) ;now execute it.
+;
+; CP/M command address table.
+;
+CMDADR: DEFW DIRECT,ERASE,TYPE,SAVE
+ DEFW RENAME,USER,UNKNOWN
+;
+; Halt the system. Reason for this is unknown at present.
+;
+HALT: LD HL,76F3H ;'DI HLT' instructions.
+ LD (CBASE),HL
+ LD HL,CBASE
+ JP (HL)
+;
+; Read error while TYPEing a file.
+;
+RDERROR:LD BC,RDERR
+ JP PLINE
+RDERR: DEFB 'Read error',0
+;
+; Required file was not located.
+;
+NONE: LD BC,NOFILE
+ JP PLINE
+NOFILE: DEFB 'No file',0
+;
+; Decode a command of the form 'A>filename number{ filename}.
+; Note that a drive specifier is not allowed on the first file
+; name. On return, the number is in register (A). Any error
+; causes 'filename?' to be printed and the command is aborted.
+;
+DECODE: CALL CONVFST ;convert filename.
+ LD A,(CHGDRV) ;do not allow a drive to be specified.
+ OR A
+ JP NZ,SYNERR
+ LD HL,FCB+1 ;convert number now.
+ LD BC,11 ;(B)=sum register, (C)=max digit count.
+DECODE1:LD A,(HL)
+ CP ' ' ;a space terminates the numeral.
+ JP Z,DECODE3
+ INC HL
+ SUB '0' ;make binary from ascii.
+ CP 10 ;legal digit?
+ JP NC,SYNERR
+ LD D,A ;yes, save it in (D).
+ LD A,B ;compute (B)=(B)*10 and check for overflow.
+ AND 0E0H
+ JP NZ,SYNERR
+ LD A,B
+ RLCA
+ RLCA
+ RLCA ;(A)=(B)*8
+ ADD A,B ;.......*9
+ JP C,SYNERR
+ ADD A,B ;.......*10
+ JP C,SYNERR
+ ADD A,D ;add in new digit now.
+DECODE2:JP C,SYNERR
+ LD B,A ;and save result.
+ DEC C ;only look at 11 digits.
+ JP NZ,DECODE1
+ RET
+DECODE3:LD A,(HL) ;spaces must follow (why?).
+ CP ' '
+ JP NZ,SYNERR
+ INC HL
+DECODE4:DEC C
+ JP NZ,DECODE3
+ LD A,B ;set (A)=the numeric value entered.
+ RET
+;
+; Move 3 bytes from (HL) to (DE). Note that there is only
+; one reference to this at (A2D5h).
+;
+MOVE3: LD B,3
+;
+; Move (B) bytes from (HL) to (DE).
+;
+HL2DE: LD A,(HL)
+ LD (DE),A
+ INC HL
+ INC DE
+ DEC B
+ JP NZ,HL2DE
+ RET
+;
+; Compute (HL)=(TBUFF)+(A)+(C) and get the byte that's here.
+;
+EXTRACT:LD HL,TBUFF
+ ADD A,C
+ CALL ADDHL
+ LD A,(HL)
+ RET
+;
+; Check drive specified. If it means a change, then the new
+; drive will be selected. In any case, the drive byte of the
+; fcb will be set to null (means use current drive).
+;
+DSELECT:XOR A ;null out first byte of fcb.
+ LD (FCB),A
+ LD A,(CHGDRV) ;a drive change indicated?
+ OR A
+ RET Z
+ DEC A ;yes, is it the same as the current drive?
+ LD HL,CDRIVE
+ CP (HL)
+ RET Z
+ JP DSKSEL ;no. Select it then.
+;
+; Check the drive selection and reset it to the previous
+; drive if it was changed for the preceeding command.
+;
+RESETDR:LD A,(CHGDRV) ;drive change indicated?
+ OR A
+ RET Z
+ DEC A ;yes, was it a different drive?
+ LD HL,CDRIVE
+ CP (HL)
+ RET Z
+ LD A,(CDRIVE) ;yes, re-select our old drive.
+ JP DSKSEL
+;
+;**************************************************************
+;*
+;* D I R E C T O R Y C O M M A N D
+;*
+;**************************************************************
+;
+DIRECT: CALL CONVFST ;convert file name.
+ CALL DSELECT ;select indicated drive.
+ LD HL,FCB+1 ;was any file indicated?
+ LD A,(HL)
+ CP ' '
+ JP NZ,DIRECT2
+ LD B,11 ;no. Fill field with '?' - same as *.*.
+DIRECT1:LD (HL),'?'
+ INC HL
+ DEC B
+ JP NZ,DIRECT1
+DIRECT2:LD E,0 ;set initial cursor position.
+ PUSH DE
+ CALL SRCHFCB ;get first file name.
+ CALL Z,NONE ;none found at all?
+DIRECT3:JP Z,DIRECT9 ;terminate if no more names.
+ LD A,(RTNCODE) ;get file's position in segment (0-3).
+ RRCA
+ RRCA
+ RRCA
+ AND 60H ;(A)=position*32
+ LD C,A
+ LD A,10
+ CALL EXTRACT ;extract the tenth entry in fcb.
+ RLA ;check system file status bit.
+ JP C,DIRECT8 ;we don't list them.
+ POP DE
+ LD A,E ;bump name count.
+ INC E
+ PUSH DE
+ AND 03H ;at end of line?
+ PUSH AF
+ JP NZ,DIRECT4
+ CALL CRLF ;yes, end this line and start another.
+ PUSH BC
+ CALL GETDSK ;start line with ('A:').
+ POP BC
+ ADD A,'A'
+ CALL PRINTB
+ LD A,':'
+ CALL PRINTB
+ JP DIRECT5
+DIRECT4:CALL SPACE ;add seperator between file names.
+ LD A,':'
+ CALL PRINTB
+DIRECT5:CALL SPACE
+ LD B,1 ;'extract' each file name character at a time.
+DIRECT6:LD A,B
+ CALL EXTRACT
+ AND 7FH ;strip bit 7 (status bit).
+ CP ' ' ;are we at the end of the name?
+ JP NZ,DRECT65
+ POP AF ;yes, don't print spaces at the end of a line.
+ PUSH AF
+ CP 3
+ JP NZ,DRECT63
+ LD A,9 ;first check for no extension.
+ CALL EXTRACT
+ AND 7FH
+ CP ' '
+ JP Z,DIRECT7 ;don't print spaces.
+DRECT63:LD A,' ' ;else print them.
+DRECT65:CALL PRINTB
+ INC B ;bump to next character psoition.
+ LD A,B
+ CP 12 ;end of the name?
+ JP NC,DIRECT7
+ CP 9 ;nope, starting extension?
+ JP NZ,DIRECT6
+ CALL SPACE ;yes, add seperating space.
+ JP DIRECT6
+DIRECT7:POP AF ;get the next file name.
+DIRECT8:CALL CHKCON ;first check console, quit on anything.
+ JP NZ,DIRECT9
+ CALL SRCHNXT ;get next name.
+ JP DIRECT3 ;and continue with our list.
+DIRECT9:POP DE ;restore the stack and return to command level.
+ JP GETBACK
+;
+;**************************************************************
+;*
+;* E R A S E C O M M A N D
+;*
+;**************************************************************
+;
+ERASE: CALL CONVFST ;convert file name.
+ CP 11 ;was '*.*' entered?
+ JP NZ,ERASE1
+ LD BC,YESNO ;yes, ask for confirmation.
+ CALL PLINE
+ CALL GETINP
+ LD HL,INBUFF+1
+ DEC (HL) ;must be exactly 'y'.
+ JP NZ,CMMND1
+ INC HL
+ LD A,(HL)
+ CP 'Y'
+ JP NZ,CMMND1
+ INC HL
+ LD (INPOINT),HL ;save input line pointer.
+ERASE1: CALL DSELECT ;select desired disk.
+ LD DE,FCB
+ CALL DELETE ;delete the file.
+ INC A
+ CALL Z,NONE ;not there?
+ JP GETBACK ;return to command level now.
+YESNO: DEFB 'All (y/n)?',0
+;
+;**************************************************************
+;*
+;* T Y P E C O M M A N D
+;*
+;**************************************************************
+;
+TYPE: CALL CONVFST ;convert file name.
+ JP NZ,SYNERR ;wild cards not allowed.
+ CALL DSELECT ;select indicated drive.
+ CALL OPENFCB ;open the file.
+ JP Z,TYPE5 ;not there?
+ CALL CRLF ;ok, start a new line on the screen.
+ LD HL,NBYTES ;initialize byte counter.
+ LD (HL),0FFH ;set to read first sector.
+TYPE1: LD HL,NBYTES
+TYPE2: LD A,(HL) ;have we written the entire sector?
+ CP 128
+ JP C,TYPE3
+ PUSH HL ;yes, read in the next one.
+ CALL READFCB
+ POP HL
+ JP NZ,TYPE4 ;end or error?
+ XOR A ;ok, clear byte counter.
+ LD (HL),A
+TYPE3: INC (HL) ;count this byte.
+ LD HL,TBUFF ;and get the (A)th one from the buffer (TBUFF).
+ CALL ADDHL
+ LD A,(HL)
+ CP CNTRLZ ;end of file mark?
+ JP Z,GETBACK
+ CALL PRINT ;no, print it.
+ CALL CHKCON ;check console, quit if anything ready.
+ JP NZ,GETBACK
+ JP TYPE1
+;
+; Get here on an end of file or read error.
+;
+TYPE4: DEC A ;read error?
+ JP Z,GETBACK
+ CALL RDERROR ;yes, print message.
+TYPE5: CALL RESETDR ;and reset proper drive
+ JP SYNERR ;now print file name with problem.
+;
+;**************************************************************
+;*
+;* S A V E C O M M A N D
+;*
+;**************************************************************
+;
+SAVE: CALL DECODE ;get numeric number that follows SAVE.
+ PUSH AF ;save number of pages to write.
+ CALL CONVFST ;convert file name.
+ JP NZ,SYNERR ;wild cards not allowed.
+ CALL DSELECT ;select specified drive.
+ LD DE,FCB ;now delete this file.
+ PUSH DE
+ CALL DELETE
+ POP DE
+ CALL CREATE ;and create it again.
+ JP Z,SAVE3 ;can't create?
+ XOR A ;clear record number byte.
+ LD (FCB+32),A
+ POP AF ;convert pages to sectors.
+ LD L,A
+ LD H,0
+ ADD HL,HL ;(HL)=number of sectors to write.
+ LD DE,TBASE ;and we start from here.
+SAVE1: LD A,H ;done yet?
+ OR L
+ JP Z,SAVE2
+ DEC HL ;nope, count this and compute the start
+ PUSH HL ;of the next 128 byte sector.
+ LD HL,128
+ ADD HL,DE
+ PUSH HL ;save it and set the transfer address.
+ CALL DMASET
+ LD DE,FCB ;write out this sector now.
+ CALL WRTREC
+ POP DE ;reset (DE) to the start of the last sector.
+ POP HL ;restore sector count.
+ JP NZ,SAVE3 ;write error?
+ JP SAVE1
+;
+; Get here after writing all of the file.
+;
+SAVE2: LD DE,FCB ;now close the file.
+ CALL CLOSE
+ INC A ;did it close ok?
+ JP NZ,SAVE4
+;
+; Print out error message (no space).
+;
+SAVE3: LD BC,NOSPACE
+ CALL PLINE
+SAVE4: CALL STDDMA ;reset the standard dma address.
+ JP GETBACK
+NOSPACE:DEFB 'No space',0
+;
+;**************************************************************
+;*
+;* R E N A M E C O M M A N D
+;*
+;**************************************************************
+;
+RENAME: CALL CONVFST ;convert first file name.
+ JP NZ,SYNERR ;wild cards not allowed.
+ LD A,(CHGDRV) ;remember any change in drives specified.
+ PUSH AF
+ CALL DSELECT ;and select this drive.
+ CALL SRCHFCB ;is this file present?
+ JP NZ,RENAME6 ;yes, print error message.
+ LD HL,FCB ;yes, move this name into second slot.
+ LD DE,FCB+16
+ LD B,16
+ CALL HL2DE
+ LD HL,(INPOINT) ;get input pointer.
+ EX DE,HL
+ CALL NONBLANK ;get next non blank character.
+ CP '=' ;only allow an '=' or '_' seperator.
+ JP Z,RENAME1
+ CP '_'
+ JP NZ,RENAME5
+RENAME1:EX DE,HL
+ INC HL ;ok, skip seperator.
+ LD (INPOINT),HL ;save input line pointer.
+ CALL CONVFST ;convert this second file name now.
+ JP NZ,RENAME5 ;again, no wild cards.
+ POP AF ;if a drive was specified, then it
+ LD B,A ;must be the same as before.
+ LD HL,CHGDRV
+ LD A,(HL)
+ OR A
+ JP Z,RENAME2
+ CP B
+ LD (HL),B
+ JP NZ,RENAME5 ;they were different, error.
+RENAME2:LD (HL),B ; reset as per the first file specification.
+ XOR A
+ LD (FCB),A ;clear the drive byte of the fcb.
+RENAME3:CALL SRCHFCB ;and go look for second file.
+ JP Z,RENAME4 ;doesn't exist?
+ LD DE,FCB
+ CALL RENAM ;ok, rename the file.
+ JP GETBACK
+;
+; Process rename errors here.
+;
+RENAME4:CALL NONE ;file not there.
+ JP GETBACK
+RENAME5:CALL RESETDR ;bad command format.
+ JP SYNERR
+RENAME6:LD BC,EXISTS ;destination file already exists.
+ CALL PLINE
+ JP GETBACK
+EXISTS: DEFB 'File exists',0
+;
+;**************************************************************
+;*
+;* U S E R C O M M A N D
+;*
+;**************************************************************
+;
+USER: CALL DECODE ;get numeric value following command.
+ CP 16 ;legal user number?
+ JP NC,SYNERR
+ LD E,A ;yes but is there anything else?
+ LD A,(FCB+1)
+ CP ' '
+ JP Z,SYNERR ;yes, that is not allowed.
+ CALL GETSETUC ;ok, set user code.
+ JP GETBACK1
+;
+;**************************************************************
+;*
+;* T R A N S I A N T P R O G R A M C O M M A N D
+;*
+;**************************************************************
+;
+UNKNOWN:CALL VERIFY ;check for valid system (why?).
+ LD A,(FCB+1) ;anything to execute?
+ CP ' '
+ JP NZ,UNKWN1
+ LD A,(CHGDRV) ;nope, only a drive change?
+ OR A
+ JP Z,GETBACK1 ;neither???
+ DEC A
+ LD (CDRIVE),A ;ok, store new drive.
+ CALL MOVECD ;set (TDRIVE) also.
+ CALL DSKSEL ;and select this drive.
+ JP GETBACK1 ;then return.
+;
+; Here a file name was typed. Prepare to execute it.
+;
+UNKWN1: LD DE,FCB+9 ;an extension specified?
+ LD A,(DE)
+ CP ' '
+ JP NZ,SYNERR ;yes, not allowed.
+UNKWN2: PUSH DE
+ CALL DSELECT ;select specified drive.
+ POP DE
+ LD HL,COMFILE ;set the extension to 'COM'.
+ CALL MOVE3
+ CALL OPENFCB ;and open this file.
+ JP Z,UNKWN9 ;not present?
+;
+; Load in the program.
+;
+ LD HL,TBASE ;store the program starting here.
+UNKWN3: PUSH HL
+ EX DE,HL
+ CALL DMASET ;set transfer address.
+ LD DE,FCB ;and read the next record.
+ CALL RDREC
+ JP NZ,UNKWN4 ;end of file or read error?
+ POP HL ;nope, bump pointer for next sector.
+ LD DE,128
+ ADD HL,DE
+ LD DE,CBASE ;enough room for the whole file?
+ LD A,L
+ SUB E
+ LD A,H
+ SBC A,D
+ JP NC,UNKWN0 ;no, it can't fit.
+ JP UNKWN3
+;
+; Get here after finished reading.
+;
+UNKWN4: POP HL
+ DEC A ;normal end of file?
+ JP NZ,UNKWN0
+ CALL RESETDR ;yes, reset previous drive.
+ CALL CONVFST ;convert the first file name that follows
+ LD HL,CHGDRV ;command name.
+ PUSH HL
+ LD A,(HL) ;set drive code in default fcb.
+ LD (FCB),A
+ LD A,16 ;put second name 16 bytes later.
+ CALL CONVERT ;convert second file name.
+ POP HL
+ LD A,(HL) ;and set the drive for this second file.
+ LD (FCB+16),A
+ XOR A ;clear record byte in fcb.
+ LD (FCB+32),A
+ LD DE,TFCB ;move it into place at(005Ch).
+ LD HL,FCB
+ LD B,33
+ CALL HL2DE
+ LD HL,INBUFF+2 ;now move the remainder of the input
+UNKWN5: LD A,(HL) ;line down to (0080h). Look for a non blank.
+ OR A ;or a null.
+ JP Z,UNKWN6
+ CP ' '
+ JP Z,UNKWN6
+ INC HL
+ JP UNKWN5
+;
+; Do the line move now. It ends in a null byte.
+;
+UNKWN6: LD B,0 ;keep a character count.
+ LD DE,TBUFF+1 ;data gets put here.
+UNKWN7: LD A,(HL) ;move it now.
+ LD (DE),A
+ OR A
+ JP Z,UNKWN8
+ INC B
+ INC HL
+ INC DE
+ JP UNKWN7
+UNKWN8: LD A,B ;now store the character count.
+ LD (TBUFF),A
+ CALL CRLF ;clean up the screen.
+ CALL STDDMA ;set standard transfer address.
+ CALL SETCDRV ;reset current drive.
+ CALL TBASE ;and execute the program.
+;
+; Transiant programs return here (or reboot).
+;
+ LD SP,BATCH ;set stack first off.
+ CALL MOVECD ;move current drive into place (TDRIVE).
+ CALL DSKSEL ;and reselect it.
+ JP CMMND1 ;back to comand mode.
+;
+; Get here if some error occured.
+;
+UNKWN9: CALL RESETDR ;inproper format.
+ JP SYNERR
+UNKWN0: LD BC,BADLOAD ;read error or won't fit.
+ CALL PLINE
+ JP GETBACK
+BADLOAD:DEFB 'Bad load',0
+COMFILE:DEFB 'COM' ;command file extension.
+;
+; Get here to return to command level. We will reset the
+; previous active drive and then either return to command
+; level directly or print error message and then return.
+;
+GETBACK:CALL RESETDR ;reset previous drive.
+GETBACK1: CALL CONVFST ;convert first name in (FCB).
+ LD A,(FCB+1) ;if this was just a drive change request,
+ SUB ' ' ;make sure it was valid.
+ LD HL,CHGDRV
+ OR (HL)
+ JP NZ,SYNERR
+ JP CMMND1 ;ok, return to command level.
+;
+; ccp stack area.
+;
+ DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+CCPSTACK EQU $ ;end of ccp stack area.
+;
+; Batch (or SUBMIT) processing information storage.
+;
+BATCH: DEFB 0 ;batch mode flag (0=not active).
+BATCHFCB: DEFB 0,'$$$ SUB',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;
+; File control block setup by the CCP.
+;
+FCB: DEFB 0,' ',0,0,0,0,0,' ',0,0,0,0,0
+RTNCODE:DEFB 0 ;status returned from bdos call.
+CDRIVE: DEFB 0 ;currently active drive.
+CHGDRV: DEFB 0 ;change in drives flag (0=no change).
+NBYTES: DEFW 0 ;byte counter used by TYPE.
+;
+; Room for expansion?
+;
+ DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0
+;
+; Note that the following six bytes must match those at
+; (PATTRN1) or cp/m will HALT. Why?
+;
+PATTRN2:DEFB 0,22,0,0,0,0 ;(* serial number bytes *).
+;
+;**************************************************************
+;*
+;* B D O S E N T R Y
+;*
+;**************************************************************
+;
+FBASE: JP FBASE1
+;
+; Bdos error table.
+;
+BADSCTR:DEFW ERROR1 ;bad sector on read or write.
+BADSLCT:DEFW ERROR2 ;bad disk select.
+RODISK: DEFW ERROR3 ;disk is read only.
+ROFILE: DEFW ERROR4 ;file is read only.
+;
+; Entry into bdos. (DE) or (E) are the parameters passed. The
+; function number desired is in register (C).
+;
+FBASE1: EX DE,HL ;save the (DE) parameters.
+ LD (PARAMS),HL
+ EX DE,HL
+ LD A,E ;and save register (E) in particular.
+ LD (EPARAM),A
+ LD HL,0
+ LD (STATUS),HL ;clear return status.
+ ADD HL,SP
+ LD (USRSTACK),HL ;save users stack pointer.
+ LD SP,STKAREA ;and set our own.
+ XOR A ;clear auto select storage space.
+ LD (AUTOFLAG),A
+ LD (AUTO),A
+ LD HL,GOBACK ;set return address.
+ PUSH HL
+ LD A,C ;get function number.
+ CP NFUNCTS ;valid function number?
+ RET NC
+ LD C,E ;keep single register function here.
+ LD HL,FUNCTNS ;now look thru the function table.
+ LD E,A
+ LD D,0 ;(DE)=function number.
+ ADD HL,DE
+ ADD HL,DE ;(HL)=(start of table)+2*(function number).
+ LD E,(HL)
+ INC HL
+ LD D,(HL) ;now (DE)=address for this function.
+ LD HL,(PARAMS) ;retrieve parameters.
+ EX DE,HL ;now (DE) has the original parameters.
+ JP (HL) ;execute desired function.
+;
+; BDOS function jump table.
+;
+NFUNCTS EQU 41 ;number of functions in followin table.
+;
+FUNCTNS:DEFW WBOOT,GETCON,OUTCON,GETRDR,PUNCH,LIST,DIRCIO,GETIOB
+ DEFW SETIOB,PRTSTR,RDBUFF,GETCSTS,GETVER,RSTDSK,SETDSK,OPENFIL
+ DEFW CLOSEFIL,GETFST,GETNXT,DELFILE,READSEQ,WRTSEQ,FCREATE
+ DEFW RENFILE,GETLOG,GETCRNT,PUTDMA,GETALOC,WRTPRTD,GETROV,SETATTR
+ DEFW GETPARM,GETUSER,RDRANDOM,WTRANDOM,FILESIZE,SETRAN,LOGOFF,RTN
+ DEFW RTN,WTSPECL
+;
+; Bdos error message section.
+;
+ERROR1: LD HL,BADSEC ;bad sector message.
+ CALL PRTERR ;print it and get a 1 char responce.
+ CP CNTRLC ;re-boot request (control-c)?
+ JP Z,0 ;yes.
+ RET ;no, return to retry i/o function.
+;
+ERROR2: LD HL,BADSEL ;bad drive selected.
+ JP ERROR5
+;
+ERROR3: LD HL,DISKRO ;disk is read only.
+ JP ERROR5
+;
+ERROR4: LD HL,FILERO ;file is read only.
+;
+ERROR5: CALL PRTERR
+ JP 0 ;always reboot on these errors.
+;
+BDOSERR:DEFB 'Bdos Err On '
+BDOSDRV:DEFB ' : $'
+BADSEC: DEFB 'Bad Sector$'
+BADSEL: DEFB 'Select$'
+FILERO: DEFB 'File '
+DISKRO: DEFB 'R/O$'
+;
+; Print bdos error message.
+;
+PRTERR: PUSH HL ;save second message pointer.
+ CALL OUTCRLF ;send (cr)(lf).
+ LD A,(ACTIVE) ;get active drive.
+ ADD A,'A' ;make ascii.
+ LD (BDOSDRV),A ;and put in message.
+ LD BC,BDOSERR ;and print it.
+ CALL PRTMESG
+ POP BC ;print second message line now.
+ CALL PRTMESG
+;
+; Get an input character. We will check our 1 character
+; buffer first. This may be set by the console status routine.
+;
+GETCHAR:LD HL,CHARBUF ;check character buffer.
+ LD A,(HL) ;anything present already?
+ LD (HL),0 ;...either case clear it.
+ OR A
+ RET NZ ;yes, use it.
+ JP CONIN ;nope, go get a character responce.
+;
+; Input and echo a character.
+;
+GETECHO:CALL GETCHAR ;input a character.
+ CALL CHKCHAR ;carriage control?
+ RET C ;no, a regular control char so don't echo.
+ PUSH AF ;ok, save character now.
+ LD C,A
+ CALL OUTCON ;and echo it.
+ POP AF ;get character and return.
+ RET
+;
+; Check character in (A). Set the zero flag on a carriage
+; control character and the carry flag on any other control
+; character.
+;
+CHKCHAR:CP CR ;check for carriage return, line feed, backspace,
+ RET Z ;or a tab.
+ CP LF
+ RET Z
+ CP TAB
+ RET Z
+ CP BS
+ RET Z
+ CP ' ' ;other control char? Set carry flag.
+ RET
+;
+; Check the console during output. Halt on a control-s, then
+; reboot on a control-c. If anything else is ready, clear the
+; zero flag and return (the calling routine may want to do
+; something).
+;
+CKCONSOL: LD A,(CHARBUF) ;check buffer.
+ OR A ;if anything, just return without checking.
+ JP NZ,CKCON2
+ CALL CONST ;nothing in buffer. Check console.
+ AND 01H ;look at bit 0.
+ RET Z ;return if nothing.
+ CALL CONIN ;ok, get it.
+ CP CNTRLS ;if not control-s, return with zero cleared.
+ JP NZ,CKCON1
+ CALL CONIN ;halt processing until another char
+ CP CNTRLC ;is typed. Control-c?
+ JP Z,0 ;yes, reboot now.
+ XOR A ;no, just pretend nothing was ever ready.
+ RET
+CKCON1: LD (CHARBUF),A ;save character in buffer for later processing.
+CKCON2: LD A,1 ;set (A) to non zero to mean something is ready.
+ RET
+;
+; Output (C) to the screen. If the printer flip-flop flag
+; is set, we will send character to printer also. The console
+; will be checked in the process.
+;
+OUTCHAR:LD A,(OUTFLAG) ;check output flag.
+ OR A ;anything and we won't generate output.
+ JP NZ,OUTCHR1
+ PUSH BC
+ CALL CKCONSOL ;check console (we don't care whats there).
+ POP BC
+ PUSH BC
+ CALL CONOUT ;output (C) to the screen.
+ POP BC
+ PUSH BC
+ LD A,(PRTFLAG) ;check printer flip-flop flag.
+ OR A
+ CALL NZ,LIST ;print it also if non-zero.
+ POP BC
+OUTCHR1:LD A,C ;update cursors position.
+ LD HL,CURPOS
+ CP DEL ;rubouts don't do anything here.
+ RET Z
+ INC (HL) ;bump line pointer.
+ CP ' ' ;and return if a normal character.
+ RET NC
+ DEC (HL) ;restore and check for the start of the line.
+ LD A,(HL)
+ OR A
+ RET Z ;ingnore control characters at the start of the line.
+ LD A,C
+ CP BS ;is it a backspace?
+ JP NZ,OUTCHR2
+ DEC (HL) ;yes, backup pointer.
+ RET
+OUTCHR2:CP LF ;is it a line feed?
+ RET NZ ;ignore anything else.
+ LD (HL),0 ;reset pointer to start of line.
+ RET
+;
+; Output (A) to the screen. If it is a control character
+; (other than carriage control), use ^x format.
+;
+SHOWIT: LD A,C
+ CALL CHKCHAR ;check character.
+ JP NC,OUTCON ;not a control, use normal output.
+ PUSH AF
+ LD C,'^' ;for a control character, preceed it with '^'.
+ CALL OUTCHAR
+ POP AF
+ OR '@' ;and then use the letter equivelant.
+ LD C,A
+;
+; Function to output (C) to the console device and expand tabs
+; if necessary.
+;
+OUTCON: LD A,C
+ CP TAB ;is it a tab?
+ JP NZ,OUTCHAR ;use regular output.
+OUTCON1:LD C,' ' ;yes it is, use spaces instead.
+ CALL OUTCHAR
+ LD A,(CURPOS) ;go until the cursor is at a multiple of 8
+
+ AND 07H ;position.
+ JP NZ,OUTCON1
+ RET
+;
+; Echo a backspace character. Erase the prevoius character
+; on the screen.
+;
+BACKUP: CALL BACKUP1 ;backup the screen 1 place.
+ LD C,' ' ;then blank that character.
+ CALL CONOUT
+BACKUP1:LD C,BS ;then back space once more.
+ JP CONOUT
+;
+; Signal a deleted line. Print a '#' at the end and start
+; over.
+;
+NEWLINE:LD C,'#'
+ CALL OUTCHAR ;print this.
+ CALL OUTCRLF ;start new line.
+NEWLN1: LD A,(CURPOS) ;move the cursor to the starting position.
+ LD HL,STARTING
+ CP (HL)
+ RET NC ;there yet?
+ LD C,' '
+ CALL OUTCHAR ;nope, keep going.
+ JP NEWLN1
+;
+; Output a (cr) (lf) to the console device (screen).
+;
+OUTCRLF:LD C,CR
+ CALL OUTCHAR
+ LD C,LF
+ JP OUTCHAR
+;
+; Print message pointed to by (BC). It will end with a '$'.
+;
+PRTMESG:LD A,(BC) ;check for terminating character.
+ CP '$'
+ RET Z
+ INC BC
+ PUSH BC ;otherwise, bump pointer and print it.
+ LD C,A
+ CALL OUTCON
+ POP BC
+ JP PRTMESG
+;
+; Function to execute a buffered read.
+;
+RDBUFF: LD A,(CURPOS) ;use present location as starting one.
+ LD (STARTING),A
+ LD HL,(PARAMS) ;get the maximum buffer space.
+ LD C,(HL)
+ INC HL ;point to first available space.
+ PUSH HL ;and save.
+ LD B,0 ;keep a character count.
+RDBUF1: PUSH BC
+ PUSH HL
+RDBUF2: CALL GETCHAR ;get the next input character.
+ AND 7FH ;strip bit 7.
+ POP HL ;reset registers.
+ POP BC
+ CP CR ;en of the line?
+ JP Z,RDBUF17
+ CP LF
+ JP Z,RDBUF17
+ CP BS ;how about a backspace?
+ JP NZ,RDBUF3
+ LD A,B ;yes, but ignore at the beginning of the line.
+ OR A
+ JP Z,RDBUF1
+ DEC B ;ok, update counter.
+ LD A,(CURPOS) ;if we backspace to the start of the line,
+ LD (OUTFLAG),A ;treat as a cancel (control-x).
+ JP RDBUF10
+RDBUF3: CP DEL ;user typed a rubout?
+ JP NZ,RDBUF4
+ LD A,B ;ignore at the start of the line.
+ OR A
+ JP Z,RDBUF1
+ LD A,(HL) ;ok, echo the prevoius character.
+ DEC B ;and reset pointers (counters).
+ DEC HL
+ JP RDBUF15
+RDBUF4: CP CNTRLE ;physical end of line?
+ JP NZ,RDBUF5
+ PUSH BC ;yes, do it.
+ PUSH HL
+ CALL OUTCRLF
+ XOR A ;and update starting position.
+ LD (STARTING),A
+ JP RDBUF2
+RDBUF5: CP CNTRLP ;control-p?
+ JP NZ,RDBUF6
+ PUSH HL ;yes, flip the print flag filp-flop byte.
+ LD HL,PRTFLAG
+ LD A,1 ;PRTFLAG=1-PRTFLAG
+ SUB (HL)
+ LD (HL),A
+ POP HL
+ JP RDBUF1
+RDBUF6: CP CNTRLX ;control-x (cancel)?
+ JP NZ,RDBUF8
+ POP HL
+RDBUF7: LD A,(STARTING) ;yes, backup the cursor to here.
+ LD HL,CURPOS
+ CP (HL)
+ JP NC,RDBUFF ;done yet?
+ DEC (HL) ;no, decrement pointer and output back up one space.
+ CALL BACKUP
+ JP RDBUF7
+RDBUF8: CP CNTRLU ;cntrol-u (cancel line)?
+ JP NZ,RDBUF9
+ CALL NEWLINE ;start a new line.
+ POP HL
+ JP RDBUFF
+RDBUF9: CP CNTRLR ;control-r?
+ JP NZ,RDBUF14
+RDBUF10:PUSH BC ;yes, start a new line and retype the old one.
+ CALL NEWLINE
+ POP BC
+ POP HL
+ PUSH HL
+ PUSH BC
+RDBUF11:LD A,B ;done whole line yet?
+ OR A
+ JP Z,RDBUF12
+ INC HL ;nope, get next character.
+ LD C,(HL)
+ DEC B ;count it.
+ PUSH BC
+ PUSH HL
+ CALL SHOWIT ;and display it.
+ POP HL
+ POP BC
+ JP RDBUF11
+RDBUF12:PUSH HL ;done with line. If we were displaying
+ LD A,(OUTFLAG) ;then update cursor position.
+ OR A
+ JP Z,RDBUF2
+ LD HL,CURPOS ;because this line is shorter, we must
+ SUB (HL) ;back up the cursor (not the screen however)
+ LD (OUTFLAG),A ;some number of positions.
+RDBUF13:CALL BACKUP ;note that as long as (OUTFLAG) is non
+ LD HL,OUTFLAG ;zero, the screen will not be changed.
+ DEC (HL)
+ JP NZ,RDBUF13
+ JP RDBUF2 ;now just get the next character.
+;
+; Just a normal character, put this in our buffer and echo.
+;
+RDBUF14:INC HL
+ LD (HL),A ;store character.
+ INC B ;and count it.
+RDBUF15:PUSH BC
+ PUSH HL
+ LD C,A ;echo it now.
+ CALL SHOWIT
+ POP HL
+ POP BC
+ LD A,(HL) ;was it an abort request?
+ CP CNTRLC ;control-c abort?
+ LD A,B
+ JP NZ,RDBUF16
+ CP 1 ;only if at start of line.
+ JP Z,0
+RDBUF16:CP C ;nope, have we filled the buffer?
+ JP C,RDBUF1
+RDBUF17:POP HL ;yes end the line and return.
+ LD (HL),B
+ LD C,CR
+ JP OUTCHAR ;output (cr) and return.
+;
+; Function to get a character from the console device.
+;
+GETCON: CALL GETECHO ;get and echo.
+ JP SETSTAT ;save status and return.
+;
+; Function to get a character from the tape reader device.
+;
+GETRDR: CALL READER ;get a character from reader, set status and return.
+ JP SETSTAT
+;
+; Function to perform direct console i/o. If (C) contains (FF)
+; then this is an input request. If (C) contains (FE) then
+; this is a status request. Otherwise we are to output (C).
+;
+DIRCIO: LD A,C ;test for (FF).
+ INC A
+ JP Z,DIRC1
+ INC A ;test for (FE).
+ JP Z,CONST
+ JP CONOUT ;just output (C).
+DIRC1: CALL CONST ;this is an input request.
+ OR A
+ JP Z,GOBACK1 ;not ready? Just return (directly).
+ CALL CONIN ;yes, get character.
+ JP SETSTAT ;set status and return.
+;
+; Function to return the i/o byte.
+;
+GETIOB: LD A,(IOBYTE)
+ JP SETSTAT
+;
+; Function to set the i/o byte.
+;
+SETIOB: LD HL,IOBYTE
+ LD (HL),C
+ RET
+;
+; Function to print the character string pointed to by (DE)
+; on the console device. The string ends with a '$'.
+;
+PRTSTR: EX DE,HL
+ LD C,L
+ LD B,H ;now (BC) points to it.
+ JP PRTMESG
+;
+; Function to interigate the console device.
+;
+GETCSTS:CALL CKCONSOL
+;
+; Get here to set the status and return to the cleanup
+; section. Then back to the user.
+;
+SETSTAT:LD (STATUS),A
+RTN: RET
+;
+; Set the status to 1 (read or write error code).
+;
+IOERR1: LD A,1
+ JP SETSTAT
+;
+OUTFLAG:DEFB 0 ;output flag (non zero means no output).
+STARTING: DEFB 2 ;starting position for cursor.
+CURPOS: DEFB 0 ;cursor position (0=start of line).
+PRTFLAG:DEFB 0 ;printer flag (control-p toggle). List if non zero.
+CHARBUF:DEFB 0 ;single input character buffer.
+;
+; Stack area for BDOS calls.
+;
+USRSTACK: DEFW 0 ;save users stack pointer here.
+;
+ DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+STKAREA EQU $ ;end of stack area.
+;
+USERNO: DEFB 0 ;current user number.
+ACTIVE: DEFB 0 ;currently active drive.
+PARAMS: DEFW 0 ;save (DE) parameters here on entry.
+STATUS: DEFW 0 ;status returned from bdos function.
+;
+; Select error occured, jump to error routine.
+;
+SLCTERR:LD HL,BADSLCT
+;
+; Jump to (HL) indirectly.
+;
+JUMPHL: LD E,(HL)
+ INC HL
+ LD D,(HL) ;now (DE) contain the desired address.
+ EX DE,HL
+ JP (HL)
+;
+; Block move. (DE) to (HL), (C) bytes total.
+;
+DE2HL: INC C ;is count down to zero?
+DE2HL1: DEC C
+ RET Z ;yes, we are done.
+ LD A,(DE) ;no, move one more byte.
+ LD (HL),A
+ INC DE
+ INC HL
+ JP DE2HL1 ;and repeat.
+;
+; Select the desired drive.
+;
+SELECT: LD A,(ACTIVE) ;get active disk.
+ LD C,A
+ CALL SELDSK ;select it.
+ LD A,H ;valid drive?
+ OR L ;valid drive?
+ RET Z ;return if not.
+;
+; Here, the BIOS returned the address of the parameter block
+; in (HL). We will extract the necessary pointers and save them.
+;
+ LD E,(HL) ;yes, get address of translation table into (DE).
+ INC HL
+ LD D,(HL)
+ INC HL
+ LD (SCRATCH1),HL ;save pointers to scratch areas.
+ INC HL
+ INC HL
+ LD (SCRATCH2),HL ;ditto.
+ INC HL
+ INC HL
+ LD (SCRATCH3),HL ;ditto.
+ INC HL
+ INC HL
+ EX DE,HL ;now save the translation table address.
+ LD (XLATE),HL
+ LD HL,DIRBUF ;put the next 8 bytes here.
+ LD C,8 ;they consist of the directory buffer
+ CALL DE2HL ;pointer, parameter block pointer,
+ LD HL,(DISKPB) ;check and allocation vectors.
+ EX DE,HL
+ LD HL,SECTORS ;move parameter block into our ram.
+ LD C,15 ;it is 15 bytes long.
+ CALL DE2HL
+ LD HL,(DSKSIZE) ;check disk size.
+ LD A,H ;more than 256 blocks on this?
+ LD HL,BIGDISK
+ LD (HL),0FFH ;set to samll.
+ OR A
+ JP Z,SELECT1
+ LD (HL),0 ;wrong, set to large.
+SELECT1:LD A,0FFH ;clear the zero flag.
+ OR A
+ RET
+;
+; Routine to home the disk track head and clear pointers.
+;
+HOMEDRV:CALL HOME ;home the head.
+ XOR A
+ LD HL,(SCRATCH2) ;set our track pointer also.
+ LD (HL),A
+ INC HL
+ LD (HL),A
+ LD HL,(SCRATCH3) ;and our sector pointer.
+ LD (HL),A
+ INC HL
+ LD (HL),A
+ RET
+;
+; Do the actual disk read and check the error return status.
+;
+DOREAD: CALL READ
+ JP IORET
+;
+; Do the actual disk write and handle any bios error.
+;
+DOWRITE:CALL WRITE
+IORET: OR A
+ RET Z ;return unless an error occured.
+ LD HL,BADSCTR ;bad read/write on this sector.
+ JP JUMPHL
+;
+; Routine to select the track and sector that the desired
+; block number falls in.
+;
+TRKSEC: LD HL,(FILEPOS) ;get position of last accessed file
+ LD C,2 ;in directory and compute sector #.
+ CALL SHIFTR ;sector #=file-position/4.
+ LD (BLKNMBR),HL ;save this as the block number of interest.
+ LD (CKSUMTBL),HL ;what's it doing here too?
+;
+; if the sector number has already been set (BLKNMBR), enter
+; at this point.
+;
+TRKSEC1:LD HL,BLKNMBR
+ LD C,(HL) ;move sector number into (BC).
+ INC HL
+ LD B,(HL)
+ LD HL,(SCRATCH3) ;get current sector number and
+ LD E,(HL) ;move this into (DE).
+ INC HL
+ LD D,(HL)
+ LD HL,(SCRATCH2) ;get current track number.
+ LD A,(HL) ;and this into (HL).
+ INC HL
+ LD H,(HL)
+ LD L,A
+TRKSEC2:LD A,C ;is desired sector before current one?
+ SUB E
+ LD A,B
+ SBC A,D
+ JP NC,TRKSEC3
+ PUSH HL ;yes, decrement sectors by one track.
+ LD HL,(SECTORS) ;get sectors per track.
+ LD A,E
+ SUB L
+ LD E,A
+ LD A,D
+ SBC A,H
+ LD D,A ;now we have backed up one full track.
+ POP HL
+ DEC HL ;adjust track counter.
+ JP TRKSEC2
+TRKSEC3:PUSH HL ;desired sector is after current one.
+ LD HL,(SECTORS) ;get sectors per track.
+ ADD HL,DE ;bump sector pointer to next track.
+ JP C,TRKSEC4
+ LD A,C ;is desired sector now before current one?
+ SUB L
+ LD A,B
+ SBC A,H
+ JP C,TRKSEC4
+ EX DE,HL ;not yes, increment track counter
+ POP HL ;and continue until it is.
+ INC HL
+ JP TRKSEC3
+;
+; here we have determined the track number that contains the
+; desired sector.
+;
+TRKSEC4:POP HL ;get track number (HL).
+ PUSH BC
+ PUSH DE
+ PUSH HL
+ EX DE,HL
+ LD HL,(OFFSET) ;adjust for first track offset.
+ ADD HL,DE
+ LD B,H
+ LD C,L
+ CALL SETTRK ;select this track.
+ POP DE ;reset current track pointer.
+ LD HL,(SCRATCH2)
+ LD (HL),E
+ INC HL
+ LD (HL),D
+ POP DE
+ LD HL,(SCRATCH3) ;reset the first sector on this track.
+ LD (HL),E
+ INC HL
+ LD (HL),D
+ POP BC
+ LD A,C ;now subtract the desired one.
+ SUB E ;to make it relative (1-# sectors/track).
+ LD C,A
+ LD A,B
+ SBC A,D
+ LD B,A
+ LD HL,(XLATE) ;translate this sector according to this table.
+ EX DE,HL
+ CALL SECTRN ;let the bios translate it.
+ LD C,L
+ LD B,H
+ JP SETSEC ;and select it.
+;
+; Compute block number from record number (SAVNREC) and
+; extent number (SAVEXT).
+;
+GETBLOCK: LD HL,BLKSHFT ;get logical to physical conversion.
+ LD C,(HL) ;note that this is base 2 log of ratio.
+ LD A,(SAVNREC) ;get record number.
+GETBLK1:OR A ;compute (A)=(A)/2^BLKSHFT.
+ RRA
+ DEC C
+ JP NZ,GETBLK1
+ LD B,A ;save result in (B).
+ LD A,8
+ SUB (HL)
+ LD C,A ;compute (C)=8-BLKSHFT.
+ LD A,(SAVEXT)
+GETBLK2:DEC C ;compute (A)=SAVEXT*2^(8-BLKSHFT).
+ JP Z,GETBLK3
+ OR A
+ RLA
+ JP GETBLK2
+GETBLK3:ADD A,B
+ RET
+;
+; Routine to extract the (BC) block byte from the fcb pointed
+; to by (PARAMS). If this is a big-disk, then these are 16 bit
+; block numbers, else they are 8 bit numbers.
+; Number is returned in (HL).
+;
+EXTBLK: LD HL,(PARAMS) ;get fcb address.
+ LD DE,16 ;block numbers start 16 bytes into fcb.
+ ADD HL,DE
+ ADD HL,BC
+ LD A,(BIGDISK) ;are we using a big-disk?
+ OR A
+ JP Z,EXTBLK1
+ LD L,(HL) ;no, extract an 8 bit number from the fcb.
+ LD H,0
+ RET
+EXTBLK1:ADD HL,BC ;yes, extract a 16 bit number.
+ LD E,(HL)
+ INC HL
+ LD D,(HL)
+ EX DE,HL ;return in (HL).
+ RET
+;
+; Compute block number.
+;
+COMBLK: CALL GETBLOCK
+ LD C,A
+ LD B,0
+ CALL EXTBLK
+ LD (BLKNMBR),HL
+ RET
+;
+; Check for a zero block number (unused).
+;
+CHKBLK: LD HL,(BLKNMBR)
+ LD A,L ;is it zero?
+ OR H
+ RET
+;
+; Adjust physical block (BLKNMBR) and convert to logical
+; sector (LOGSECT). This is the starting sector of this block.
+; The actual sector of interest is then added to this and the
+; resulting sector number is stored back in (BLKNMBR). This
+; will still have to be adjusted for the track number.
+;
+LOGICAL:LD A,(BLKSHFT) ;get log2(physical/logical sectors).
+ LD HL,(BLKNMBR) ;get physical sector desired.
+LOGICL1:ADD HL,HL ;compute logical sector number.
+ DEC A ;note logical sectors are 128 bytes long.
+ JP NZ,LOGICL1
+ LD (LOGSECT),HL ;save logical sector.
+ LD A,(BLKMASK) ;get block mask.
+ LD C,A
+ LD A,(SAVNREC) ;get next sector to access.
+ AND C ;extract the relative position within physical block.
+ OR L ;and add it too logical sector.
+ LD L,A
+ LD (BLKNMBR),HL ;and store.
+ RET
+;
+; Set (HL) to point to extent byte in fcb.
+;
+SETEXT: LD HL,(PARAMS)
+ LD DE,12 ;it is the twelth byte.
+ ADD HL,DE
+ RET
+;
+; Set (HL) to point to record count byte in fcb and (DE) to
+; next record number byte.
+;
+SETHLDE:LD HL,(PARAMS)
+ LD DE,15 ;record count byte (#15).
+ ADD HL,DE
+ EX DE,HL
+ LD HL,17 ;next record number (#32).
+ ADD HL,DE
+ RET
+;
+; Save current file data from fcb.
+;
+STRDATA:CALL SETHLDE
+ LD A,(HL) ;get and store record count byte.
+ LD (SAVNREC),A
+ EX DE,HL
+ LD A,(HL) ;get and store next record number byte.
+ LD (SAVNXT),A
+ CALL SETEXT ;point to extent byte.
+ LD A,(EXTMASK) ;get extent mask.
+ AND (HL)
+ LD (SAVEXT),A ;and save extent here.
+ RET
+;
+; Set the next record to access. If (MODE) is set to 2, then
+; the last record byte (SAVNREC) has the correct number to access.
+; For sequential access, (MODE) will be equal to 1.
+;
+SETNREC:CALL SETHLDE
+ LD A,(MODE) ;get sequential flag (=1).
+ CP 2 ;a 2 indicates that no adder is needed.
+ JP NZ,STNREC1
+ XOR A ;clear adder (random access?).
+STNREC1:LD C,A
+ LD A,(SAVNREC) ;get last record number.
+ ADD A,C ;increment record count.
+ LD (HL),A ;and set fcb's next record byte.
+ EX DE,HL
+ LD A,(SAVNXT) ;get next record byte from storage.
+ LD (HL),A ;and put this into fcb as number of records used.
+ RET
+;
+; Shift (HL) right (C) bits.
+;
+SHIFTR: INC C
+SHIFTR1:DEC C
+ RET Z
+ LD A,H
+ OR A
+ RRA
+ LD H,A
+ LD A,L
+ RRA
+ LD L,A
+ JP SHIFTR1
+;
+; Compute the check-sum for the directory buffer. Return
+; integer sum in (A).
+;
+CHECKSUM: LD C,128 ;length of buffer.
+ LD HL,(DIRBUF) ;get its location.
+ XOR A ;clear summation byte.
+CHKSUM1:ADD A,M ;and compute sum ignoring carries.
+ INC HL
+ DEC C
+ JP NZ,CHKSUM1
+ RET
+;
+; Shift (HL) left (C) bits.
+;
+SHIFTL: INC C
+SHIFTL1:DEC C
+ RET Z
+ ADD HL,HL ;shift left 1 bit.
+ JP SHIFTL1
+;
+; Routine to set a bit in a 16 bit value contained in (BC).
+; The bit set depends on the current drive selection.
+;
+SETBIT: PUSH BC ;save 16 bit word.
+ LD A,(ACTIVE) ;get active drive.
+ LD C,A
+ LD HL,1
+ CALL SHIFTL ;shift bit 0 into place.
+ POP BC ;now 'or' this with the original word.
+ LD A,C
+ OR L
+ LD L,A ;low byte done, do high byte.
+ LD A,B
+ OR H
+ LD H,A
+ RET
+;
+; Extract the write protect status bit for the current drive.
+; The result is returned in (A), bit 0.
+;
+GETWPRT:LD HL,(WRTPRT) ;get status bytes.
+ LD A,(ACTIVE) ;which drive is current?
+ LD C,A
+ CALL SHIFTR ;shift status such that bit 0 is the
+ LD A,L ;one of interest for this drive.
+ AND 01H ;and isolate it.
+ RET
+;
+; Function to write protect the current disk.
+;
+WRTPRTD:LD HL,WRTPRT ;point to status word.
+ LD C,(HL) ;set (BC) equal to the status.
+ INC HL
+ LD B,(HL)
+ CALL SETBIT ;and set this bit according to current drive.
+ LD (WRTPRT),HL ;then save.
+ LD HL,(DIRSIZE) ;now save directory size limit.
+ INC HL ;remember the last one.
+ EX DE,HL
+ LD HL,(SCRATCH1) ;and store it here.
+ LD (HL),E ;put low byte.
+ INC HL
+ LD (HL),D ;then high byte.
+ RET
+;
+; Check for a read only file.
+;
+CHKROFL:CALL FCB2HL ;set (HL) to file entry in directory buffer.
+CKROF1: LD DE,9 ;look at bit 7 of the ninth byte.
+ ADD HL,DE
+ LD A,(HL)
+ RLA
+ RET NC ;return if ok.
+ LD HL,ROFILE ;else, print error message and terminate.
+ JP JUMPHL
+;
+; Check the write protect status of the active disk.
+;
+CHKWPRT:CALL GETWPRT
+ RET Z ;return if ok.
+ LD HL,RODISK ;else print message and terminate.
+ JP JUMPHL
+;
+; Routine to set (HL) pointing to the proper entry in the
+; directory buffer.
+;
+FCB2HL: LD HL,(DIRBUF) ;get address of buffer.
+ LD A,(FCBPOS) ;relative position of file.
+;
+; Routine to add (A) to (HL).
+;
+ADDA2HL:ADD A,L
+ LD L,A
+ RET NC
+ INC H ;take care of any carry.
+ RET
+;
+; Routine to get the 's2' byte from the fcb supplied in
+; the initial parameter specification.
+;
+GETS2: LD HL,(PARAMS) ;get address of fcb.
+ LD DE,14 ;relative position of 's2'.
+ ADD HL,DE
+ LD A,(HL) ;extract this byte.
+ RET
+;
+; Clear the 's2' byte in the fcb.
+;
+CLEARS2:CALL GETS2 ;this sets (HL) pointing to it.
+ LD (HL),0 ;now clear it.
+ RET
+;
+; Set bit 7 in the 's2' byte of the fcb.
+;
+SETS2B7:CALL GETS2 ;get the byte.
+ OR 80H ;and set bit 7.
+ LD (HL),A ;then store.
+ RET
+;
+; Compare (FILEPOS) with (SCRATCH1) and set flags based on
+; the difference. This checks to see if there are more file
+; names in the directory. We are at (FILEPOS) and there are
+; (SCRATCH1) of them to check.
+;
+MOREFLS:LD HL,(FILEPOS) ;we are here.
+ EX DE,HL
+ LD HL,(SCRATCH1) ;and don't go past here.
+ LD A,E ;compute difference but don't keep.
+ SUB (HL)
+ INC HL
+ LD A,D
+ SBC A,M ;set carry if no more names.
+ RET
+;
+; Call this routine to prevent (SCRATCH1) from being greater
+; than (FILEPOS).
+;
+CHKNMBR:CALL MOREFLS ;SCRATCH1 too big?
+ RET C
+ INC DE ;yes, reset it to (FILEPOS).
+ LD (HL),D
+ DEC HL
+ LD (HL),E
+ RET
+;
+; Compute (HL)=(DE)-(HL)
+;
+SUBHL: LD A,E ;compute difference.
+ SUB L
+ LD L,A ;store low byte.
+ LD A,D
+ SBC A,H
+ LD H,A ;and then high byte.
+ RET
+;
+; Set the directory checksum byte.
+;
+SETDIR: LD C,0FFH
+;
+; Routine to set or compare the directory checksum byte. If
+; (C)=0ffh, then this will set the checksum byte. Else the byte
+; will be checked. If the check fails (the disk has been changed),
+; then this disk will be write protected.
+;
+CHECKDIR: LD HL,(CKSUMTBL)
+ EX DE,HL
+ LD HL,(ALLOC1)
+ CALL SUBHL
+ RET NC ;ok if (CKSUMTBL) > (ALLOC1), so return.
+ PUSH BC
+ CALL CHECKSUM ;else compute checksum.
+ LD HL,(CHKVECT) ;get address of checksum table.
+ EX DE,HL
+ LD HL,(CKSUMTBL)
+ ADD HL,DE ;set (HL) to point to byte for this drive.
+ POP BC
+ INC C ;set or check ?
+ JP Z,CHKDIR1
+ CP (HL) ;check them.
+ RET Z ;return if they are the same.
+ CALL MOREFLS ;not the same, do we care?
+ RET NC
+ CALL WRTPRTD ;yes, mark this as write protected.
+ RET
+CHKDIR1:LD (HL),A ;just set the byte.
+ RET
+;
+; Do a write to the directory of the current disk.
+;
+DIRWRITE: CALL SETDIR ;set checksum byte.
+ CALL DIRDMA ;set directory dma address.
+ LD C,1 ;tell the bios to actually write.
+ CALL DOWRITE ;then do the write.
+ JP DEFDMA
+;
+; Read from the directory.
+;
+DIRREAD:CALL DIRDMA ;set the directory dma address.
+ CALL DOREAD ;and read it.
+;
+; Routine to set the dma address to the users choice.
+;
+DEFDMA: LD HL,USERDMA ;reset the default dma address and return.
+ JP DIRDMA1
+;
+; Routine to set the dma address for directory work.
+;
+DIRDMA: LD HL,DIRBUF
+;
+; Set the dma address. On entry, (HL) points to
+; word containing the desired dma address.
+;
+DIRDMA1:LD C,(HL)
+ INC HL
+ LD B,(HL) ;setup (BC) and go to the bios to set it.
+ JP SETDMA
+;
+; Move the directory buffer into user's dma space.
+;
+MOVEDIR:LD HL,(DIRBUF) ;buffer is located here, and
+ EX DE,HL
+ LD HL,(USERDMA) ; put it here.
+ LD C,128 ;this is its length.
+ JP DE2HL ;move it now and return.
+;
+; Check (FILEPOS) and set the zero flag if it equals 0ffffh.
+;
+CKFILPOS: LD HL,FILEPOS
+ LD A,(HL)
+ INC HL
+ CP (HL) ;are both bytes the same?
+ RET NZ
+ INC A ;yes, but are they each 0ffh?
+ RET
+;
+; Set location (FILEPOS) to 0ffffh.
+;
+STFILPOS: LD HL,0FFFFH
+ LD (FILEPOS),HL
+ RET
+;
+; Move on to the next file position within the current
+; directory buffer. If no more exist, set pointer to 0ffffh
+; and the calling routine will check for this. Enter with (C)
+; equal to 0ffh to cause the checksum byte to be set, else we
+; will check this disk and set write protect if checksums are
+; not the same (applies only if another directory sector must
+; be read).
+;
+NXENTRY:LD HL,(DIRSIZE) ;get directory entry size limit.
+ EX DE,HL
+ LD HL,(FILEPOS) ;get current count.
+ INC HL ;go on to the next one.
+ LD (FILEPOS),HL
+ CALL SUBHL ;(HL)=(DIRSIZE)-(FILEPOS)
+ JP NC,NXENT1 ;is there more room left?
+ JP STFILPOS ;no. Set this flag and return.
+NXENT1: LD A,(FILEPOS) ;get file position within directory.
+ AND 03H ;only look within this sector (only 4 entries fit).
+ LD B,5 ;convert to relative position (32 bytes each).
+NXENT2: ADD A,A ;note that this is not efficient code.
+ DEC B ;5 'ADD A's would be better.
+ JP NZ,NXENT2
+ LD (FCBPOS),A ;save it as position of fcb.
+ OR A
+ RET NZ ;return if we are within buffer.
+ PUSH BC
+ CALL TRKSEC ;we need the next directory sector.
+ CALL DIRREAD
+ POP BC
+ JP CHECKDIR
+;
+; Routine to to get a bit from the disk space allocation
+; map. It is returned in (A), bit position 0. On entry to here,
+; set (BC) to the block number on the disk to check.
+; On return, (D) will contain the original bit position for
+; this block number and (HL) will point to the address for it.
+;
+CKBITMAP: LD A,C ;determine bit number of interest.
+ AND 07H ;compute (D)=(E)=(C and 7)+1.
+ INC A
+ LD E,A ;save particular bit number.
+ LD D,A
+;
+; compute (BC)=(BC)/8.
+;
+ LD A,C
+ RRCA ;now shift right 3 bits.
+ RRCA
+ RRCA
+ AND 1FH ;and clear bits 7,6,5.
+ LD C,A
+ LD A,B
+ ADD A,A ;now shift (B) into bits 7,6,5.
+ ADD A,A
+ ADD A,A
+ ADD A,A
+ ADD A,A
+ OR C ;and add in (C).
+ LD C,A ;ok, (C) ha been completed.
+ LD A,B ;is there a better way of doing this?
+ RRCA
+ RRCA
+ RRCA
+ AND 1FH
+ LD B,A ;and now (B) is completed.
+;
+; use this as an offset into the disk space allocation
+; table.
+;
+ LD HL,(ALOCVECT)
+ ADD HL,BC
+ LD A,(HL) ;now get correct byte.
+CKBMAP1:RLCA ;get correct bit into position 0.
+ DEC E
+ JP NZ,CKBMAP1
+ RET
+;
+; Set or clear the bit map such that block number (BC) will be marked
+; as used. On entry, if (E)=0 then this bit will be cleared, if it equals
+; 1 then it will be set (don't use anyother values).
+;
+STBITMAP: PUSH DE
+ CALL CKBITMAP ;get the byte of interest.
+ AND 0FEH ;clear the affected bit.
+ POP BC
+ OR C ;and now set it acording to (C).
+;
+; entry to restore the original bit position and then store
+; in table. (A) contains the value, (D) contains the bit
+; position (1-8), and (HL) points to the address within the
+; space allocation table for this byte.
+;
+STBMAP1:RRCA ;restore original bit position.
+ DEC D
+ JP NZ,STBMAP1
+ LD (HL),A ;and stor byte in table.
+ RET
+;
+; Set/clear space used bits in allocation map for this file.
+; On entry, (C)=1 to set the map and (C)=0 to clear it.
+;
+SETFILE:CALL FCB2HL ;get address of fcb
+ LD DE,16
+ ADD HL,DE ;get to block number bytes.
+ PUSH BC
+ LD C,17 ;check all 17 bytes (max) of table.
+SETFL1: POP DE
+ DEC C ;done all bytes yet?
+ RET Z
+ PUSH DE
+ LD A,(BIGDISK) ;check disk size for 16 bit block numbers.
+ OR A
+ JP Z,SETFL2
+ PUSH BC ;only 8 bit numbers. set (BC) to this one.
+ PUSH HL
+ LD C,(HL) ;get low byte from table, always
+ LD B,0 ;set high byte to zero.
+ JP SETFL3
+SETFL2: DEC C ;for 16 bit block numbers, adjust counter.
+ PUSH BC
+ LD C,(HL) ;now get both the low and high bytes.
+ INC HL
+ LD B,(HL)
+ PUSH HL
+SETFL3: LD A,C ;block used?
+ OR B
+ JP Z,SETFL4
+ LD HL,(DSKSIZE) ;is this block number within the
+ LD A,L ;space on the disk?
+ SUB C
+ LD A,H
+ SBC A,B
+ CALL NC,STBITMAP ;yes, set the proper bit.
+SETFL4: POP HL ;point to next block number in fcb.
+ INC HL
+ POP BC
+ JP SETFL1
+;
+; Construct the space used allocation bit map for the active
+; drive. If a file name starts with '$' and it is under the
+; current user number, then (STATUS) is set to minus 1. Otherwise
+; it is not set at all.
+;
+BITMAP: LD HL,(DSKSIZE) ;compute size of allocation table.
+ LD C,3
+ CALL SHIFTR ;(HL)=(HL)/8.
+ INC HL ;at lease 1 byte.
+ LD B,H
+ LD C,L ;set (BC) to the allocation table length.
+;
+; Initialize the bitmap for this drive. Right now, the first
+; two bytes are specified by the disk parameter block. However
+; a patch could be entered here if it were necessary to setup
+; this table in a special mannor. For example, the bios could
+; determine locations of 'bad blocks' and set them as already
+; 'used' in the map.
+;
+ LD HL,(ALOCVECT) ;now zero out the table now.
+BITMAP1:LD (HL),0
+ INC HL
+ DEC BC
+ LD A,B
+ OR C
+ JP NZ,BITMAP1
+ LD HL,(ALLOC0) ;get initial space used by directory.
+ EX DE,HL
+ LD HL,(ALOCVECT) ;and put this into map.
+ LD (HL),E
+ INC HL
+ LD (HL),D
+;
+; End of initialization portion.
+;
+ CALL HOMEDRV ;now home the drive.
+ LD HL,(SCRATCH1)
+ LD (HL),3 ;force next directory request to read
+ INC HL ;in a sector.
+ LD (HL),0
+ CALL STFILPOS ;clear initial file position also.
+BITMAP2:LD C,0FFH ;read next file name in directory
+ CALL NXENTRY ;and set checksum byte.
+ CALL CKFILPOS ;is there another file?
+ RET Z
+ CALL FCB2HL ;yes, get its address.
+ LD A,0E5H
+ CP (HL) ;empty file entry?
+ JP Z,BITMAP2
+ LD A,(USERNO) ;no, correct user number?
+ CP (HL)
+ JP NZ,BITMAP3
+ INC HL
+ LD A,(HL) ;yes, does name start with a '$'?
+ SUB '$'
+ JP NZ,BITMAP3
+ DEC A ;yes, set atatus to minus one.
+ LD (STATUS),A
+BITMAP3:LD C,1 ;now set this file's space as used in bit map.
+ CALL SETFILE
+ CALL CHKNMBR ;keep (SCRATCH1) in bounds.
+ JP BITMAP2
+;
+; Set the status (STATUS) and return.
+;
+STSTATUS: LD A,(FNDSTAT)
+ JP SETSTAT
+;
+; Check extents in (A) and (C). Set the zero flag if they
+; are the same. The number of 16k chunks of disk space that
+; the directory extent covers is expressad is (EXTMASK+1).
+; No registers are modified.
+;
+SAMEXT: PUSH BC
+ PUSH AF
+ LD A,(EXTMASK) ;get extent mask and use it to
+ CPL ;to compare both extent numbers.
+ LD B,A ;save resulting mask here.
+ LD A,C ;mask first extent and save in (C).
+ AND B
+ LD C,A
+ POP AF ;now mask second extent and compare
+ AND B ;with the first one.
+ SUB C
+ AND 1FH ;(* only check buts 0-4 *)
+ POP BC ;the zero flag is set if they are the same.
+ RET ;restore (BC) and return.
+;
+; Search for the first occurence of a file name. On entry,
+; register (C) should contain the number of bytes of the fcb
+; that must match.
+;
+FINDFST:LD A,0FFH
+ LD (FNDSTAT),A
+ LD HL,COUNTER ;save character count.
+ LD (HL),C
+ LD HL,(PARAMS) ;get filename to match.
+ LD (SAVEFCB),HL ;and save.
+ CALL STFILPOS ;clear initial file position (set to 0ffffh).
+ CALL HOMEDRV ;home the drive.
+;
+; Entry to locate the next occurence of a filename within the
+; directory. The disk is not expected to have been changed. If
+; it was, then it will be write protected.
+;
+FINDNXT:LD C,0 ;write protect the disk if changed.
+ CALL NXENTRY ;get next filename entry in directory.
+ CALL CKFILPOS ;is file position = 0ffffh?
+ JP Z,FNDNXT6 ;yes, exit now then.
+ LD HL,(SAVEFCB) ;set (DE) pointing to filename to match.
+ EX DE,HL
+ LD A,(DE)
+ CP 0E5H ;empty directory entry?
+ JP Z,FNDNXT1 ;(* are we trying to reserect erased entries? *)
+ PUSH DE
+ CALL MOREFLS ;more files in directory?
+ POP DE
+ JP NC,FNDNXT6 ;no more. Exit now.
+FNDNXT1:CALL FCB2HL ;get address of this fcb in directory.
+ LD A,(COUNTER) ;get number of bytes (characters) to check.
+ LD C,A
+ LD B,0 ;initialize byte position counter.
+FNDNXT2:LD A,C ;are we done with the compare?
+ OR A
+ JP Z,FNDNXT5
+ LD A,(DE) ;no, check next byte.
+ CP '?' ;don't care about this character?
+ JP Z,FNDNXT4
+ LD A,B ;get bytes position in fcb.
+ CP 13 ;don't care about the thirteenth byte either.
+ JP Z,FNDNXT4
+ CP 12 ;extent byte?
+ LD A,(DE)
+ JP Z,FNDNXT3
+ SUB (HL) ;otherwise compare characters.
+ AND 7FH
+ JP NZ,FINDNXT ;not the same, check next entry.
+ JP FNDNXT4 ;so far so good, keep checking.
+FNDNXT3:PUSH BC ;check the extent byte here.
+ LD C,(HL)
+ CALL SAMEXT
+ POP BC
+ JP NZ,FINDNXT ;not the same, look some more.
+;
+; So far the names compare. Bump pointers to the next byte
+; and continue until all (C) characters have been checked.
+;
+FNDNXT4:INC DE ;bump pointers.
+ INC HL
+ INC B
+ DEC C ;adjust character counter.
+ JP FNDNXT2
+FNDNXT5:LD A,(FILEPOS) ;return the position of this entry.
+ AND 03H
+ LD (STATUS),A
+ LD HL,FNDSTAT
+ LD A,(HL)
+ RLA
+ RET NC
+ XOR A
+ LD (HL),A
+ RET
+;
+; Filename was not found. Set appropriate status.
+;
+FNDNXT6:CALL STFILPOS ;set (FILEPOS) to 0ffffh.
+ LD A,0FFH ;say not located.
+ JP SETSTAT
+;
+; Erase files from the directory. Only the first byte of the
+; fcb will be affected. It is set to (E5).
+;
+ERAFILE:CALL CHKWPRT ;is disk write protected?
+ LD C,12 ;only compare file names.
+ CALL FINDFST ;get first file name.
+ERAFIL1:CALL CKFILPOS ;any found?
+ RET Z ;nope, we must be done.
+ CALL CHKROFL ;is file read only?
+ CALL FCB2HL ;nope, get address of fcb and
+ LD (HL),0E5H ;set first byte to 'empty'.
+ LD C,0 ;clear the space from the bit map.
+ CALL SETFILE
+ CALL DIRWRITE ;now write the directory sector back out.
+ CALL FINDNXT ;find the next file name.
+ JP ERAFIL1 ;and repeat process.
+;
+; Look through the space allocation map (bit map) for the
+; next available block. Start searching at block number (BC-1).
+; The search procedure is to look for an empty block that is
+; before the starting block. If not empty, look at a later
+; block number. In this way, we return the closest empty block
+; on either side of the 'target' block number. This will speed
+; access on random devices. For serial devices, this should be
+; changed to look in the forward direction first and then start
+; at the front and search some more.
+;
+; On return, (DE)= block number that is empty and (HL) =0
+; if no empry block was found.
+;
+FNDSPACE: LD D,B ;set (DE) as the block that is checked.
+ LD E,C
+;
+; Look before target block. Registers (BC) are used as the lower
+; pointer and (DE) as the upper pointer.
+;
+FNDSPA1:LD A,C ;is block 0 specified?
+ OR B
+ JP Z,FNDSPA2
+ DEC BC ;nope, check previous block.
+ PUSH DE
+ PUSH BC
+ CALL CKBITMAP
+ RRA ;is this block empty?
+ JP NC,FNDSPA3 ;yes. use this.
+;
+; Note that the above logic gets the first block that it finds
+; that is empty. Thus a file could be written 'backward' making
+; it very slow to access. This could be changed to look for the
+; first empty block and then continue until the start of this
+; empty space is located and then used that starting block.
+; This should help speed up access to some files especially on
+; a well used disk with lots of fairly small 'holes'.
+;
+ POP BC ;nope, check some more.
+ POP DE
+;
+; Now look after target block.
+;
+FNDSPA2:LD HL,(DSKSIZE) ;is block (DE) within disk limits?
+ LD A,E
+ SUB L
+ LD A,D
+ SBC A,H
+ JP NC,FNDSPA4
+ INC DE ;yes, move on to next one.
+ PUSH BC
+ PUSH DE
+ LD B,D
+ LD C,E
+ CALL CKBITMAP ;check it.
+ RRA ;empty?
+ JP NC,FNDSPA3
+ POP DE ;nope, continue searching.
+ POP BC
+ JP FNDSPA1
+;
+; Empty block found. Set it as used and return with (HL)
+; pointing to it (true?).
+;
+FNDSPA3:RLA ;reset byte.
+ INC A ;and set bit 0.
+ CALL STBMAP1 ;update bit map.
+ POP HL ;set return registers.
+ POP DE
+ RET
+;
+; Free block was not found. If (BC) is not zero, then we have
+; not checked all of the disk space.
+;
+FNDSPA4:LD A,C
+ OR B
+ JP NZ,FNDSPA1
+ LD HL,0 ;set 'not found' status.
+ RET
+;
+; Move a complete fcb entry into the directory and write it.
+;
+FCBSET: LD C,0
+ LD E,32 ;length of each entry.
+;
+; Move (E) bytes from the fcb pointed to by (PARAMS) into
+; fcb in directory starting at relative byte (C). This updated
+; directory buffer is then written to the disk.
+;
+UPDATE: PUSH DE
+ LD B,0 ;set (BC) to relative byte position.
+ LD HL,(PARAMS) ;get address of fcb.
+ ADD HL,BC ;compute starting byte.
+ EX DE,HL
+ CALL FCB2HL ;get address of fcb to update in directory.
+ POP BC ;set (C) to number of bytes to change.
+ CALL DE2HL
+UPDATE1:CALL TRKSEC ;determine the track and sector affected.
+ JP DIRWRITE ;then write this sector out.
+;
+; Routine to change the name of all files on the disk with a
+; specified name. The fcb contains the current name as the
+; first 12 characters and the new name 16 bytes into the fcb.
+;
+CHGNAMES: CALL CHKWPRT ;check for a write protected disk.
+ LD C,12 ;match first 12 bytes of fcb only.
+ CALL FINDFST ;get first name.
+ LD HL,(PARAMS) ;get address of fcb.
+ LD A,(HL) ;get user number.
+ LD DE,16 ;move over to desired name.
+ ADD HL,DE
+ LD (HL),A ;keep same user number.
+CHGNAM1:CALL CKFILPOS ;any matching file found?
+ RET Z ;no, we must be done.
+ CALL CHKROFL ;check for read only file.
+ LD C,16 ;start 16 bytes into fcb.
+ LD E,12 ;and update the first 12 bytes of directory.
+ CALL UPDATE
+ CALL FINDNXT ;get te next file name.
+ JP CHGNAM1 ;and continue.
+;
+; Update a files attributes. The procedure is to search for
+; every file with the same name as shown in fcb (ignoring bit 7)
+; and then to update it (which includes bit 7). No other changes
+; are made.
+;
+SAVEATTR: LD C,12 ;match first 12 bytes.
+ CALL FINDFST ;look for first filename.
+SAVATR1:CALL CKFILPOS ;was one found?
+ RET Z ;nope, we must be done.
+ LD C,0 ;yes, update the first 12 bytes now.
+ LD E,12
+ CALL UPDATE ;update filename and write directory.
+ CALL FINDNXT ;and get the next file.
+ JP SAVATR1 ;then continue until done.
+;
+; Open a file (name specified in fcb).
+;
+OPENIT: LD C,15 ;compare the first 15 bytes.
+ CALL FINDFST ;get the first one in directory.
+ CALL CKFILPOS ;any at all?
+ RET Z
+OPENIT1:CALL SETEXT ;point to extent byte within users fcb.
+ LD A,(HL) ;and get it.
+ PUSH AF ;save it and address.
+ PUSH HL
+ CALL FCB2HL ;point to fcb in directory.
+ EX DE,HL
+ LD HL,(PARAMS) ;this is the users copy.
+ LD C,32 ;move it into users space.
+ PUSH DE
+ CALL DE2HL
+ CALL SETS2B7 ;set bit 7 in 's2' byte (unmodified).
+ POP DE ;now get the extent byte from this fcb.
+ LD HL,12
+ ADD HL,DE
+ LD C,(HL) ;into (C).
+ LD HL,15 ;now get the record count byte into (B).
+ ADD HL,DE
+ LD B,(HL)
+ POP HL ;keep the same extent as the user had originally.
+ POP AF
+ LD (HL),A
+ LD A,C ;is it the same as in the directory fcb?
+ CP (HL)
+ LD A,B ;if yes, then use the same record count.
+ JP Z,OPENIT2
+ LD A,0 ;if the user specified an extent greater than
+ JP C,OPENIT2 ;the one in the directory, then set record count to 0.
+ LD A,128 ;otherwise set to maximum.
+OPENIT2:LD HL,(PARAMS) ;set record count in users fcb to (A).
+ LD DE,15
+ ADD HL,DE ;compute relative position.
+ LD (HL),A ;and set the record count.
+ RET
+;
+; Move two bytes from (DE) to (HL) if (and only if) (HL)
+; point to a zero value (16 bit).
+; Return with zero flag set it (DE) was moved. Registers (DE)
+; and (HL) are not changed. However (A) is.
+;
+MOVEWORD: LD A,(HL) ;check for a zero word.
+ INC HL
+ OR (HL) ;both bytes zero?
+ DEC HL
+ RET NZ ;nope, just return.
+ LD A,(DE) ;yes, move two bytes from (DE) into
+ LD (HL),A ;this zero space.
+ INC DE
+ INC HL
+ LD A,(DE)
+ LD (HL),A
+ DEC DE ;don't disturb these registers.
+ DEC HL
+ RET
+;
+; Get here to close a file specified by (fcb).
+;
+CLOSEIT:XOR A ;clear status and file position bytes.
+ LD (STATUS),A
+ LD (FILEPOS),A
+ LD (FILEPOS+1),A
+ CALL GETWPRT ;get write protect bit for this drive.
+ RET NZ ;just return if it is set.
+ CALL GETS2 ;else get the 's2' byte.
+ AND 80H ;and look at bit 7 (file unmodified?).
+ RET NZ ;just return if set.
+ LD C,15 ;else look up this file in directory.
+ CALL FINDFST
+ CALL CKFILPOS ;was it found?
+ RET Z ;just return if not.
+ LD BC,16 ;set (HL) pointing to records used section.
+ CALL FCB2HL
+ ADD HL,BC
+ EX DE,HL
+ LD HL,(PARAMS) ;do the same for users specified fcb.
+ ADD HL,BC
+ LD C,16 ;this many bytes are present in this extent.
+CLOSEIT1: LD A,(BIGDISK) ;8 or 16 bit record numbers?
+ OR A
+ JP Z,CLOSEIT4
+ LD A,(HL) ;just 8 bit. Get one from users fcb.
+ OR A
+ LD A,(DE) ;now get one from directory fcb.
+ JP NZ,CLOSEIT2
+ LD (HL),A ;users byte was zero. Update from directory.
+CLOSEIT2: OR A
+ JP NZ,CLOSEIT3
+ LD A,(HL) ;directories byte was zero, update from users fcb.
+ LD (DE),A
+CLOSEIT3: CP (HL) ;if neither one of these bytes were zero,
+ JP NZ,CLOSEIT7 ;then close error if they are not the same.
+ JP CLOSEIT5 ;ok so far, get to next byte in fcbs.
+CLOSEIT4: CALL MOVEWORD ;update users fcb if it is zero.
+ EX DE,HL
+ CALL MOVEWORD ;update directories fcb if it is zero.
+ EX DE,HL
+ LD A,(DE) ;if these two values are no different,
+ CP (HL) ;then a close error occured.
+ JP NZ,CLOSEIT7
+ INC DE ;check second byte.
+ INC HL
+ LD A,(DE)
+ CP (HL)
+ JP NZ,CLOSEIT7
+ DEC C ;remember 16 bit values.
+CLOSEIT5: INC DE ;bump to next item in table.
+ INC HL
+ DEC C ;there are 16 entries only.
+ JP NZ,CLOSEIT1 ;continue if more to do.
+ LD BC,0FFECH ;backup 20 places (extent byte).
+ ADD HL,BC
+ EX DE,HL
+ ADD HL,BC
+ LD A,(DE)
+ CP (HL) ;directory's extent already greater than the
+ JP C,CLOSEIT6 ;users extent?
+ LD (HL),A ;no, update directory extent.
+ LD BC,3 ;and update the record count byte in
+ ADD HL,BC ;directories fcb.
+ EX DE,HL
+ ADD HL,BC
+ LD A,(HL) ;get from user.
+ LD (DE),A ;and put in directory.
+CLOSEIT6: LD A,0FFH ;set 'was open and is now closed' byte.
+ LD (CLOSEFLG),A
+ JP UPDATE1 ;update the directory now.
+CLOSEIT7: LD HL,STATUS ;set return status and then return.
+ DEC (HL)
+ RET
+;
+; Routine to get the next empty space in the directory. It
+; will then be cleared for use.
+;
+GETEMPTY: CALL CHKWPRT ;make sure disk is not write protected.
+ LD HL,(PARAMS) ;save current parameters (fcb).
+ PUSH HL
+ LD HL,EMPTYFCB ;use special one for empty space.
+ LD (PARAMS),HL
+ LD C,1 ;search for first empty spot in directory.
+ CALL FINDFST ;(* only check first byte *)
+ CALL CKFILPOS ;none?
+ POP HL
+ LD (PARAMS),HL ;restore original fcb address.
+ RET Z ;return if no more space.
+ EX DE,HL
+ LD HL,15 ;point to number of records for this file.
+ ADD HL,DE
+ LD C,17 ;and clear all of this space.
+ XOR A
+GETMT1: LD (HL),A
+ INC HL
+ DEC C
+ JP NZ,GETMT1
+ LD HL,13 ;clear the 's1' byte also.
+ ADD HL,DE
+ LD (HL),A
+ CALL CHKNMBR ;keep (SCRATCH1) within bounds.
+ CALL FCBSET ;write out this fcb entry to directory.
+ JP SETS2B7 ;set 's2' byte bit 7 (unmodified at present).
+;
+; Routine to close the current extent and open the next one
+; for reading.
+;
+GETNEXT:XOR A
+ LD (CLOSEFLG),A ;clear close flag.
+ CALL CLOSEIT ;close this extent.
+ CALL CKFILPOS
+ RET Z ;not there???
+ LD HL,(PARAMS) ;get extent byte.
+ LD BC,12
+ ADD HL,BC
+ LD A,(HL) ;and increment it.
+ INC A
+ AND 1FH ;keep within range 0-31.
+ LD (HL),A
+ JP Z,GTNEXT1 ;overflow?
+ LD B,A ;mask extent byte.
+ LD A,(EXTMASK)
+ AND B
+ LD HL,CLOSEFLG ;check close flag (0ffh is ok).
+ AND (HL)
+ JP Z,GTNEXT2 ;if zero, we must read in next extent.
+ JP GTNEXT3 ;else, it is already in memory.
+GTNEXT1:LD BC,2 ;Point to the 's2' byte.
+ ADD HL,BC
+ INC (HL) ;and bump it.
+ LD A,(HL) ;too many extents?
+ AND 0FH
+ JP Z,GTNEXT5 ;yes, set error code.
+;
+; Get here to open the next extent.
+;
+GTNEXT2:LD C,15 ;set to check first 15 bytes of fcb.
+ CALL FINDFST ;find the first one.
+ CALL CKFILPOS ;none available?
+ JP NZ,GTNEXT3
+ LD A,(RDWRTFLG) ;no extent present. Can we open an empty one?
+ INC A ;0ffh means reading (so not possible).
+ JP Z,GTNEXT5 ;or an error.
+ CALL GETEMPTY ;we are writing, get an empty entry.
+ CALL CKFILPOS ;none?
+ JP Z,GTNEXT5 ;error if true.
+ JP GTNEXT4 ;else we are almost done.
+GTNEXT3:CALL OPENIT1 ;open this extent.
+GTNEXT4:CALL STRDATA ;move in updated data (rec #, extent #, etc.)
+ XOR A ;clear status and return.
+ JP SETSTAT
+;
+; Error in extending the file. Too many extents were needed
+; or not enough space on the disk.
+;
+GTNEXT5:CALL IOERR1 ;set error code, clear bit 7 of 's2'
+ JP SETS2B7 ;so this is not written on a close.
+;
+; Read a sequential file.
+;
+RDSEQ: LD A,1 ;set sequential access mode.
+ LD (MODE),A
+RDSEQ1: LD A,0FFH ;don't allow reading unwritten space.
+ LD (RDWRTFLG),A
+ CALL STRDATA ;put rec# and ext# into fcb.
+ LD A,(SAVNREC) ;get next record to read.
+ LD HL,SAVNXT ;get number of records in extent.
+ CP (HL) ;within this extent?
+ JP C,RDSEQ2
+ CP 128 ;no. Is this extent fully used?
+ JP NZ,RDSEQ3 ;no. End-of-file.
+ CALL GETNEXT ;yes, open the next one.
+ XOR A ;reset next record to read.
+ LD (SAVNREC),A
+ LD A,(STATUS) ;check on open, successful?
+ OR A
+ JP NZ,RDSEQ3 ;no, error.
+RDSEQ2: CALL COMBLK ;ok. compute block number to read.
+ CALL CHKBLK ;check it. Within bounds?
+ JP Z,RDSEQ3 ;no, error.
+ CALL LOGICAL ;convert (BLKNMBR) to logical sector (128 byte).
+ CALL TRKSEC1 ;set the track and sector for this block #.
+ CALL DOREAD ;and read it.
+ JP SETNREC ;and set the next record to be accessed.
+;
+; Read error occured. Set status and return.
+;
+RDSEQ3: JP IOERR1
+;
+; Write the next sequential record.
+;
+WTSEQ: LD A,1 ;set sequential access mode.
+ LD (MODE),A
+WTSEQ1: LD A,0 ;allow an addition empty extent to be opened.
+ LD (RDWRTFLG),A
+ CALL CHKWPRT ;check write protect status.
+ LD HL,(PARAMS)
+ CALL CKROF1 ;check for read only file, (HL) already set to fcb.
+ CALL STRDATA ;put updated data into fcb.
+ LD A,(SAVNREC) ;get record number to write.
+ CP 128 ;within range?
+ JP NC,IOERR1 ;no, error(?).
+ CALL COMBLK ;compute block number.
+ CALL CHKBLK ;check number.
+ LD C,0 ;is there one to write to?
+ JP NZ,WTSEQ6 ;yes, go do it.
+ CALL GETBLOCK ;get next block number within fcb to use.
+ LD (RELBLOCK),A ;and save.
+ LD BC,0 ;start looking for space from the start
+ OR A ;if none allocated as yet.
+ JP Z,WTSEQ2
+ LD C,A ;extract previous block number from fcb
+ DEC BC ;so we can be closest to it.
+ CALL EXTBLK
+ LD B,H
+ LD C,L
+WTSEQ2: CALL FNDSPACE ;find the next empty block nearest number (BC).
+ LD A,L ;check for a zero number.
+ OR H
+ JP NZ,WTSEQ3
+ LD A,2 ;no more space?
+ JP SETSTAT
+WTSEQ3: LD (BLKNMBR),HL ;save block number to access.
+ EX DE,HL ;put block number into (DE).
+ LD HL,(PARAMS) ;now we must update the fcb for this
+ LD BC,16 ;newly allocated block.
+ ADD HL,BC
+ LD A,(BIGDISK) ;8 or 16 bit block numbers?
+ OR A
+ LD A,(RELBLOCK) ;(* update this entry *)
+ JP Z,WTSEQ4 ;zero means 16 bit ones.
+ CALL ADDA2HL ;(HL)=(HL)+(A)
+ LD (HL),E ;store new block number.
+ JP WTSEQ5
+WTSEQ4: LD C,A ;compute spot in this 16 bit table.
+ LD B,0
+ ADD HL,BC
+ ADD HL,BC
+ LD (HL),E ;stuff block number (DE) there.
+ INC HL
+ LD (HL),D
+WTSEQ5: LD C,2 ;set (C) to indicate writing to un-used disk space.
+WTSEQ6: LD A,(STATUS) ;are we ok so far?
+ OR A
+ RET NZ
+ PUSH BC ;yes, save write flag for bios (register C).
+ CALL LOGICAL ;convert (BLKNMBR) over to loical sectors.
+ LD A,(MODE) ;get access mode flag (1=sequential,
+ DEC A ;0=random, 2=special?).
+ DEC A
+ JP NZ,WTSEQ9
+;
+; Special random i/o from function #40. Maybe for M/PM, but the
+; current block, if it has not been written to, will be zeroed
+; out and then written (reason?).
+;
+ POP BC
+ PUSH BC
+ LD A,C ;get write status flag (2=writing unused space).
+ DEC A
+ DEC A
+ JP NZ,WTSEQ9
+ PUSH HL
+ LD HL,(DIRBUF) ;zero out the directory buffer.
+ LD D,A ;note that (A) is zero here.
+WTSEQ7: LD (HL),A
+ INC HL
+ INC D ;do 128 bytes.
+ JP P,WTSEQ7
+ CALL DIRDMA ;tell the bios the dma address for directory access.
+ LD HL,(LOGSECT) ;get sector that starts current block.
+ LD C,2 ;set 'writing to unused space' flag.
+WTSEQ8: LD (BLKNMBR),HL ;save sector to write.
+ PUSH BC
+ CALL TRKSEC1 ;determine its track and sector numbers.
+ POP BC
+ CALL DOWRITE ;now write out 128 bytes of zeros.
+ LD HL,(BLKNMBR) ;get sector number.
+ LD C,0 ;set normal write flag.
+ LD A,(BLKMASK) ;determine if we have written the entire
+ LD B,A ;physical block.
+ AND L
+ CP B
+ INC HL ;prepare for the next one.
+ JP NZ,WTSEQ8 ;continue until (BLKMASK+1) sectors written.
+ POP HL ;reset next sector number.
+ LD (BLKNMBR),HL
+ CALL DEFDMA ;and reset dma address.
+;
+; Normal disk write. Set the desired track and sector then
+; do the actual write.
+;
+WTSEQ9: CALL TRKSEC1 ;determine track and sector for this write.
+ POP BC ;get write status flag.
+ PUSH BC
+ CALL DOWRITE ;and write this out.
+ POP BC
+ LD A,(SAVNREC) ;get number of records in file.
+ LD HL,SAVNXT ;get last record written.
+ CP (HL)
+ JP C,WTSEQ10
+ LD (HL),A ;we have to update record count.
+ INC (HL)
+ LD C,2
+;
+;* This area has been patched to correct disk update problem
+;* when using blocking and de-blocking in the BIOS.
+;
+WTSEQ10:NOP ;was 'dcr c'
+ NOP ;was 'dcr c'
+ LD HL,0 ;was 'jnz wtseq99'
+;
+; * End of patch.
+;
+ PUSH AF
+ CALL GETS2 ;set 'extent written to' flag.
+ AND 7FH ;(* clear bit 7 *)
+ LD (HL),A
+ POP AF ;get record count for this extent.
+WTSEQ99:CP 127 ;is it full?
+ JP NZ,WTSEQ12
+ LD A,(MODE) ;yes, are we in sequential mode?
+ CP 1
+ JP NZ,WTSEQ12
+ CALL SETNREC ;yes, set next record number.
+ CALL GETNEXT ;and get next empty space in directory.
+ LD HL,STATUS ;ok?
+ LD A,(HL)
+ OR A
+ JP NZ,WTSEQ11
+ DEC A ;yes, set record count to -1.
+ LD (SAVNREC),A
+WTSEQ11:LD (HL),0 ;clear status.
+WTSEQ12:JP SETNREC ;set next record to access.
+;
+; For random i/o, set the fcb for the desired record number
+; based on the 'r0,r1,r2' bytes. These bytes in the fcb are
+; used as follows:
+;
+; fcb+35 fcb+34 fcb+33
+; | 'r-2' | 'r-1' | 'r-0' |
+; |7 0 | 7 0 | 7 0|
+; |0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0|
+; | overflow | | extra | extent | record # |
+; | ______________| |_extent|__number___|_____________|
+; also 's2'
+;
+; On entry, register (C) contains 0ffh if this is a read
+; and thus we can not access unwritten disk space. Otherwise,
+; another extent will be opened (for writing) if required.
+;
+POSITION: XOR A ;set random i/o flag.
+ LD (MODE),A
+;
+; Special entry (function #40). M/PM ?
+;
+POSITN1:PUSH BC ;save read/write flag.
+ LD HL,(PARAMS) ;get address of fcb.
+ EX DE,HL
+ LD HL,33 ;now get byte 'r0'.
+ ADD HL,DE
+ LD A,(HL)
+ AND 7FH ;keep bits 0-6 for the record number to access.
+ PUSH AF
+ LD A,(HL) ;now get bit 7 of 'r0' and bits 0-3 of 'r1'.
+ RLA
+ INC HL
+ LD A,(HL)
+ RLA
+ AND 1FH ;and save this in bits 0-4 of (C).
+ LD C,A ;this is the extent byte.
+ LD A,(HL) ;now get the extra extent byte.
+ RRA
+ RRA
+ RRA
+ RRA
+ AND 0FH
+ LD B,A ;and save it in (B).
+ POP AF ;get record number back to (A).
+ INC HL ;check overflow byte 'r2'.
+ LD L,(HL)
+ INC L
+ DEC L
+ LD L,6 ;prepare for error.
+ JP NZ,POSITN5 ;out of disk space error.
+ LD HL,32 ;store record number into fcb.
+ ADD HL,DE
+ LD (HL),A
+ LD HL,12 ;and now check the extent byte.
+ ADD HL,DE
+ LD A,C
+ SUB (HL) ;same extent as before?
+ JP NZ,POSITN2
+ LD HL,14 ;yes, check extra extent byte 's2' also.
+ ADD HL,DE
+ LD A,B
+ SUB (HL)
+ AND 7FH
+ JP Z,POSITN3 ;same, we are almost done then.
+;
+; Get here when another extent is required.
+;
+POSITN2:PUSH BC
+ PUSH DE
+ CALL CLOSEIT ;close current extent.
+ POP DE
+ POP BC
+ LD L,3 ;prepare for error.
+ LD A,(STATUS)
+ INC A
+ JP Z,POSITN4 ;close error.
+ LD HL,12 ;put desired extent into fcb now.
+ ADD HL,DE
+ LD (HL),C
+ LD HL,14 ;and store extra extent byte 's2'.
+ ADD HL,DE
+ LD (HL),B
+ CALL OPENIT ;try and get this extent.
+ LD A,(STATUS) ;was it there?
+ INC A
+ JP NZ,POSITN3
+ POP BC ;no. can we create a new one (writing?).
+ PUSH BC
+ LD L,4 ;prepare for error.
+ INC C
+ JP Z,POSITN4 ;nope, reading unwritten space error.
+ CALL GETEMPTY ;yes we can, try to find space.
+ LD L,5 ;prepare for error.
+ LD A,(STATUS)
+ INC A
+ JP Z,POSITN4 ;out of space?
+;
+; Normal return location. Clear error code and return.
+;
+POSITN3:POP BC ;restore stack.
+ XOR A ;and clear error code byte.
+ JP SETSTAT
+;
+; Error. Set the 's2' byte to indicate this (why?).
+;
+POSITN4:PUSH HL
+ CALL GETS2
+ LD (HL),0C0H
+ POP HL
+;
+; Return with error code (presently in L).
+;
+POSITN5:POP BC
+ LD A,L ;get error code.
+ LD (STATUS),A
+ JP SETS2B7
+;
+; Read a random record.
+;
+READRAN:LD C,0FFH ;set 'read' status.
+ CALL POSITION ;position the file to proper record.
+ CALL Z,RDSEQ1 ;and read it as usual (if no errors).
+ RET
+;
+; Write to a random record.
+;
+WRITERAN: LD C,0 ;set 'writing' flag.
+ CALL POSITION ;position the file to proper record.
+ CALL Z,WTSEQ1 ;and write as usual (if no errors).
+ RET
+;
+; Compute the random record number. Enter with (HL) pointing
+; to a fcb an (DE) contains a relative location of a record
+; number. On exit, (C) contains the 'r0' byte, (B) the 'r1'
+; byte, and (A) the 'r2' byte.
+;
+; On return, the zero flag is set if the record is within
+; bounds. Otherwise, an overflow occured.
+;
+COMPRAND: EX DE,HL ;save fcb pointer in (DE).
+ ADD HL,DE ;compute relative position of record #.
+ LD C,(HL) ;get record number into (BC).
+ LD B,0
+ LD HL,12 ;now get extent.
+ ADD HL,DE
+ LD A,(HL) ;compute (BC)=(record #)+(extent)*128.
+ RRCA ;move lower bit into bit 7.
+ AND 80H ;and ignore all other bits.
+ ADD A,C ;add to our record number.
+ LD C,A
+ LD A,0 ;take care of any carry.
+ ADC A,B
+ LD B,A
+ LD A,(HL) ;now get the upper bits of extent into
+ RRCA ;bit positions 0-3.
+ AND 0FH ;and ignore all others.
+ ADD A,B ;add this in to 'r1' byte.
+ LD B,A
+ LD HL,14 ;get the 's2' byte (extra extent).
+ ADD HL,DE
+ LD A,(HL)
+ ADD A,A ;and shift it left 4 bits (bits 4-7).
+ ADD A,A
+ ADD A,A
+ ADD A,A
+ PUSH AF ;save carry flag (bit 0 of flag byte).
+ ADD A,B ;now add extra extent into 'r1'.
+ LD B,A
+ PUSH AF ;and save carry (overflow byte 'r2').
+ POP HL ;bit 0 of (L) is the overflow indicator.
+ LD A,L
+ POP HL ;and same for first carry flag.
+ OR L ;either one of these set?
+ AND 01H ;only check the carry flags.
+ RET
+;
+; Routine to setup the fcb (bytes 'r0', 'r1', 'r2') to
+; reflect the last record used for a random (or other) file.
+; This reads the directory and looks at all extents computing
+; the largerst record number for each and keeping the maximum
+; value only. Then 'r0', 'r1', and 'r2' will reflect this
+; maximum record number. This is used to compute the space used
+; by a random file.
+;
+RANSIZE:LD C,12 ;look thru directory for first entry with
+ CALL FINDFST ;this name.
+ LD HL,(PARAMS) ;zero out the 'r0, r1, r2' bytes.
+ LD DE,33
+ ADD HL,DE
+ PUSH HL
+ LD (HL),D ;note that (D)=0.
+ INC HL
+ LD (HL),D
+ INC HL
+ LD (HL),D
+RANSIZ1:CALL CKFILPOS ;is there an extent to process?
+ JP Z,RANSIZ3 ;no, we are done.
+ CALL FCB2HL ;set (HL) pointing to proper fcb in dir.
+ LD DE,15 ;point to last record in extent.
+ CALL COMPRAND ;and compute random parameters.
+ POP HL
+ PUSH HL ;now check these values against those
+ LD E,A ;already in fcb.
+ LD A,C ;the carry flag will be set if those
+ SUB (HL) ;in the fcb represent a larger size than
+ INC HL ;this extent does.
+ LD A,B
+ SBC A,M
+ INC HL
+ LD A,E
+ SBC A,M
+ JP C,RANSIZ2
+ LD (HL),E ;we found a larger (in size) extent.
+ DEC HL ;stuff these values into fcb.
+ LD (HL),B
+ DEC HL
+ LD (HL),C
+RANSIZ2:CALL FINDNXT ;now get the next extent.
+ JP RANSIZ1 ;continue til all done.
+RANSIZ3:POP HL ;we are done, restore the stack and
+ RET ;return.
+;
+; Function to return the random record position of a given
+; file which has been read in sequential mode up to now.
+;
+SETRAN: LD HL,(PARAMS) ;point to fcb.
+ LD DE,32 ;and to last used record.
+ CALL COMPRAND ;compute random position.
+ LD HL,33 ;now stuff these values into fcb.
+ ADD HL,DE
+ LD (HL),C ;move 'r0'.
+ INC HL
+ LD (HL),B ;and 'r1'.
+ INC HL
+ LD (HL),A ;and lastly 'r2'.
+ RET
+;
+; This routine select the drive specified in (ACTIVE) and
+; update the login vector and bitmap table if this drive was
+; not already active.
+;
+LOGINDRV: LD HL,(LOGIN) ;get the login vector.
+ LD A,(ACTIVE) ;get the default drive.
+ LD C,A
+ CALL SHIFTR ;position active bit for this drive
+ PUSH HL ;into bit 0.
+ EX DE,HL
+ CALL SELECT ;select this drive.
+ POP HL
+ CALL Z,SLCTERR ;valid drive?
+ LD A,L ;is this a newly activated drive?
+ RRA
+ RET C
+ LD HL,(LOGIN) ;yes, update the login vector.
+ LD C,L
+ LD B,H
+ CALL SETBIT
+ LD (LOGIN),HL ;and save.
+ JP BITMAP ;now update the bitmap.
+;
+; Function to set the active disk number.
+;
+SETDSK: LD A,(EPARAM) ;get parameter passed and see if this
+ LD HL,ACTIVE ;represents a change in drives.
+ CP (HL)
+ RET Z
+ LD (HL),A ;yes it does, log it in.
+ JP LOGINDRV
+;
+; This is the 'auto disk select' routine. The firsst byte
+; of the fcb is examined for a drive specification. If non
+; zero then the drive will be selected and loged in.
+;
+AUTOSEL:LD A,0FFH ;say 'auto-select activated'.
+ LD (AUTO),A
+ LD HL,(PARAMS) ;get drive specified.
+ LD A,(HL)
+ AND 1FH ;look at lower 5 bits.
+ DEC A ;adjust for (1=A, 2=B) etc.
+ LD (EPARAM),A ;and save for the select routine.
+ CP 1EH ;check for 'no change' condition.
+ JP NC,AUTOSL1 ;yes, don't change.
+ LD A,(ACTIVE) ;we must change, save currently active
+ LD (OLDDRV),A ;drive.
+ LD A,(HL) ;and save first byte of fcb also.
+ LD (AUTOFLAG),A ;this must be non-zero.
+ AND 0E0H ;whats this for (bits 6,7 are used for
+ LD (HL),A ;something)?
+ CALL SETDSK ;select and log in this drive.
+AUTOSL1:LD A,(USERNO) ;move user number into fcb.
+ LD HL,(PARAMS) ;(* upper half of first byte *)
+ OR (HL)
+ LD (HL),A
+ RET ;and return (all done).
+;
+; Function to return the current cp/m version number.
+;
+GETVER: LD A,022H ;version 2.2
+ JP SETSTAT
+;
+; Function to reset the disk system.
+;
+RSTDSK: LD HL,0 ;clear write protect status and log
+ LD (WRTPRT),HL ;in vector.
+ LD (LOGIN),HL
+ XOR A ;select drive 'A'.
+ LD (ACTIVE),A
+ LD HL,TBUFF ;setup default dma address.
+ LD (USERDMA),HL
+ CALL DEFDMA
+ JP LOGINDRV ;now log in drive 'A'.
+;
+; Function to open a specified file.
+;
+OPENFIL:CALL CLEARS2 ;clear 's2' byte.
+ CALL AUTOSEL ;select proper disk.
+ JP OPENIT ;and open the file.
+;
+; Function to close a specified file.
+;
+CLOSEFIL: CALL AUTOSEL ;select proper disk.
+ JP CLOSEIT ;and close the file.
+;
+; Function to return the first occurence of a specified file
+; name. If the first byte of the fcb is '?' then the name will
+; not be checked (get the first entry no matter what).
+;
+GETFST: LD C,0 ;prepare for special search.
+ EX DE,HL
+ LD A,(HL) ;is first byte a '?'?
+ CP '?'
+ JP Z,GETFST1 ;yes, just get very first entry (zero length match).
+ CALL SETEXT ;get the extension byte from fcb.
+ LD A,(HL) ;is it '?'? if yes, then we want
+ CP '?' ;an entry with a specific 's2' byte.
+ CALL NZ,CLEARS2 ;otherwise, look for a zero 's2' byte.
+ CALL AUTOSEL ;select proper drive.
+ LD C,15 ;compare bytes 0-14 in fcb (12&13 excluded).
+GETFST1:CALL FINDFST ;find an entry and then move it into
+ JP MOVEDIR ;the users dma space.
+;
+; Function to return the next occurence of a file name.
+;
+GETNXT: LD HL,(SAVEFCB) ;restore pointers. note that no
+ LD (PARAMS),HL ;other dbos calls are allowed.
+ CALL AUTOSEL ;no error will be returned, but the
+ CALL FINDNXT ;results will be wrong.
+ JP MOVEDIR
+;
+; Function to delete a file by name.
+;
+DELFILE:CALL AUTOSEL ;select proper drive.
+ CALL ERAFILE ;erase the file.
+ JP STSTATUS ;set status and return.
+;
+; Function to execute a sequential read of the specified
+; record number.
+;
+READSEQ:CALL AUTOSEL ;select proper drive then read.
+ JP RDSEQ
+;
+; Function to write the net sequential record.
+;
+WRTSEQ: CALL AUTOSEL ;select proper drive then write.
+ JP WTSEQ
+;
+; Create a file function.
+;
+FCREATE:CALL CLEARS2 ;clear the 's2' byte on all creates.
+ CALL AUTOSEL ;select proper drive and get the next
+ JP GETEMPTY ;empty directory space.
+;
+; Function to rename a file.
+;
+RENFILE:CALL AUTOSEL ;select proper drive and then switch
+ CALL CHGNAMES ;file names.
+ JP STSTATUS
+;
+; Function to return the login vector.
+;
+GETLOG: LD HL,(LOGIN)
+ JP GETPRM1
+;
+; Function to return the current disk assignment.
+;
+GETCRNT:LD A,(ACTIVE)
+ JP SETSTAT
+;
+; Function to set the dma address.
+;
+PUTDMA: EX DE,HL
+ LD (USERDMA),HL ;save in our space and then get to
+ JP DEFDMA ;the bios with this also.
+;
+; Function to return the allocation vector.
+;
+GETALOC:LD HL,(ALOCVECT)
+ JP GETPRM1
+;
+; Function to return the read-only status vector.
+;
+GETROV: LD HL,(WRTPRT)
+ JP GETPRM1
+;
+; Function to set the file attributes (read-only, system).
+;
+SETATTR:CALL AUTOSEL ;select proper drive then save attributes.
+ CALL SAVEATTR
+ JP STSTATUS
+;
+; Function to return the address of the disk parameter block
+; for the current drive.
+;
+GETPARM:LD HL,(DISKPB)
+GETPRM1:LD (STATUS),HL
+ RET
+;
+; Function to get or set the user number. If (E) was (FF)
+; then this is a request to return the current user number.
+; Else set the user number from (E).
+;
+GETUSER:LD A,(EPARAM) ;get parameter.
+ CP 0FFH ;get user number?
+ JP NZ,SETUSER
+ LD A,(USERNO) ;yes, just do it.
+ JP SETSTAT
+SETUSER:AND 1FH ;no, we should set it instead. keep low
+ LD (USERNO),A ;bits (0-4) only.
+ RET
+;
+; Function to read a random record from a file.
+;
+RDRANDOM: CALL AUTOSEL ;select proper drive and read.
+ JP READRAN
+;
+; Function to compute the file size for random files.
+;
+WTRANDOM: CALL AUTOSEL ;select proper drive and write.
+ JP WRITERAN
+;
+; Function to compute the size of a random file.
+;
+FILESIZE: CALL AUTOSEL ;select proper drive and check file length
+ JP RANSIZE
+;
+; Function #37. This allows a program to log off any drives.
+; On entry, set (DE) to contain a word with bits set for those
+; drives that are to be logged off. The log-in vector and the
+; write protect vector will be updated. This must be a M/PM
+; special function.
+;
+LOGOFF: LD HL,(PARAMS) ;get drives to log off.
+ LD A,L ;for each bit that is set, we want
+ CPL ;to clear that bit in (LOGIN)
+ LD E,A ;and (WRTPRT).
+ LD A,H
+ CPL
+ LD HL,(LOGIN) ;reset the login vector.
+ AND H
+ LD D,A
+ LD A,L
+ AND E
+ LD E,A
+ LD HL,(WRTPRT)
+ EX DE,HL
+ LD (LOGIN),HL ;and save.
+ LD A,L ;now do the write protect vector.
+ AND E
+ LD L,A
+ LD A,H
+ AND D
+ LD H,A
+ LD (WRTPRT),HL ;and save. all done.
+ RET
+;
+; Get here to return to the user.
+;
+GOBACK: LD A,(AUTO) ;was auto select activated?
+ OR A
+ JP Z,GOBACK1
+ LD HL,(PARAMS) ;yes, but was a change made?
+ LD (HL),0 ;(* reset first byte of fcb *)
+ LD A,(AUTOFLAG)
+ OR A
+ JP Z,GOBACK1
+ LD (HL),A ;yes, reset first byte properly.
+ LD A,(OLDDRV) ;and get the old drive and select it.
+ LD (EPARAM),A
+ CALL SETDSK
+GOBACK1:LD HL,(USRSTACK) ;reset the users stack pointer.
+ LD SP,HL
+ LD HL,(STATUS) ;get return status.
+ LD A,L ;force version 1.4 compatability.
+ LD B,H
+ RET ;and go back to user.
+;
+; Function #40. This is a special entry to do random i/o.
+; For the case where we are writing to unused disk space, this
+; space will be zeroed out first. This must be a M/PM special
+; purpose function, because why would any normal program even
+; care about the previous contents of a sector about to be
+; written over.
+;
+WTSPECL:CALL AUTOSEL ;select proper drive.
+ LD A,2 ;use special write mode.
+ LD (MODE),A
+ LD C,0 ;set write indicator.
+ CALL POSITN1 ;position the file.
+ CALL Z,WTSEQ1 ;and write (if no errors).
+ RET
+;
+;**************************************************************
+;*
+;* BDOS data storage pool.
+;*
+;**************************************************************
+;
+EMPTYFCB: DEFB 0E5H ;empty directory segment indicator.
+WRTPRT: DEFW 0 ;write protect status for all 16 drives.
+LOGIN: DEFW 0 ;drive active word (1 bit per drive).
+USERDMA:DEFW 080H ;user's dma address (defaults to 80h).
+;
+; Scratch areas from parameter block.
+;
+SCRATCH1: DEFW 0 ;relative position within dir segment for file (0-3).
+SCRATCH2: DEFW 0 ;last selected track number.
+SCRATCH3: DEFW 0 ;last selected sector number.
+;
+; Disk storage areas from parameter block.
+;
+DIRBUF: DEFW 0 ;address of directory buffer to use.
+DISKPB: DEFW 0 ;contains address of disk parameter block.
+CHKVECT:DEFW 0 ;address of check vector.
+ALOCVECT: DEFW 0 ;address of allocation vector (bit map).
+;
+; Parameter block returned from the bios.
+;
+SECTORS:DEFW 0 ;sectors per track from bios.
+BLKSHFT:DEFB 0 ;block shift.
+BLKMASK:DEFB 0 ;block mask.
+EXTMASK:DEFB 0 ;extent mask.
+DSKSIZE:DEFW 0 ;disk size from bios (number of blocks-1).
+DIRSIZE:DEFW 0 ;directory size.
+ALLOC0: DEFW 0 ;storage for first bytes of bit map (dir space used).
+ALLOC1: DEFW 0
+OFFSET: DEFW 0 ;first usable track number.
+XLATE: DEFW 0 ;sector translation table address.
+;
+;
+CLOSEFLG: DEFB 0 ;close flag (=0ffh is extent written ok).
+RDWRTFLG: DEFB 0 ;read/write flag (0ffh=read, 0=write).
+FNDSTAT:DEFB 0 ;filename found status (0=found first entry).
+MODE: DEFB 0 ;I/o mode select (0=random, 1=sequential, 2=special random).
+EPARAM: DEFB 0 ;storage for register (E) on entry to bdos.
+RELBLOCK: DEFB 0 ;relative position within fcb of block number written.
+COUNTER:DEFB 0 ;byte counter for directory name searches.
+SAVEFCB:DEFW 0,0 ;save space for address of fcb (for directory searches).
+BIGDISK:DEFB 0 ;if =0 then disk is > 256 blocks long.
+AUTO: DEFB 0 ;if non-zero, then auto select activated.
+OLDDRV: DEFB 0 ;on auto select, storage for previous drive.
+AUTOFLAG: DEFB 0 ;if non-zero, then auto select changed drives.
+SAVNXT: DEFB 0 ;storage for next record number to access.
+SAVEXT: DEFB 0 ;storage for extent number of file.
+SAVNREC:DEFW 0 ;storage for number of records in file.
+BLKNMBR:DEFW 0 ;block number (physical sector) used within a file or logical sect
+LOGSECT:DEFW 0 ;starting logical (128 byte) sector of block (physical sector).
+FCBPOS: DEFB 0 ;relative position within buffer for fcb of file of interest.
+FILEPOS:DEFW 0 ;files position within directory (0 to max entries -1).
+;
+; Disk directory buffer checksum bytes. One for each of the
+; 16 possible drives.
+;
+CKSUMTBL: DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+;
+; Extra space ?
+;
+ DEFB 0,0,0,0
+;
+;**************************************************************
+;*
+;* B I O S J U M P T A B L E
+;*
+;**************************************************************
+;
+BOOT: JP 0 ;NOTE WE USE FAKE DESTINATIONS
+WBOOT: JP 0
+CONST: JP 0
+CONIN: JP 0
+CONOUT: JP 0
+LIST: JP 0
+PUNCH: JP 0
+READER: JP 0
+HOME: JP 0
+SELDSK: JP 0
+SETTRK: JP 0
+SETSEC: JP 0
+SETDMA: JP 0
+READ: JP 0
+WRITE: JP 0
+PRSTAT: JP 0
+SECTRN: JP 0
+;
+;*
+;****************** E N D O F C P / M *****************
+;*
+
diff --git a/cpm/cpm2-asm/READ.ME b/cpm/cpm2-asm/READ.ME
new file mode 100644
index 0000000..a648386
--- /dev/null
+++ b/cpm/cpm2-asm/READ.ME
@@ -0,0 +1,9 @@
+The two files in this ZIP file are disassembled CP/M 2.2.
+
+ CPM22.ASM : CP/M 2.2 in 8080 mnemonics
+ CPM22.Z80 : CP/M 2.2 in Z80 mnemonics
+
+Both files claim to implement a fix that affects operation in a sector
+deblocking environment. The Z80 version does not look to have been optimized
+for the Z80, it just uses Z80 mnemonics.
+
diff --git a/cpm/pcpm/BDOS.MAC b/cpm/pcpm/BDOS.MAC
new file mode 100644
index 0000000..fa6949a
--- /dev/null
+++ b/cpm/pcpm/BDOS.MAC
@@ -0,0 +1,4190 @@
+.z80
+subttl Copyright Information
+ title Personal CP/M BDOS, Version 1.0, April 1984
+;*****************************************************************
+;*****************************************************************
+;** **
+;** P E R S O N A L C P / M **
+;** **
+;** B a s i c D i s k O p e r a t i n g S y s t e m **
+;** **
+;** I n t e r f a c e M o d u l e **
+;** **
+;*****************************************************************
+;*****************************************************************
+;
+; Copyright (c) 1984
+; Digital Research
+; Box 579, Pacific Grove
+; California
+
+subttl Equates
+
+on equ 0ffffh
+off equ 00000h
+
+data_low equ on ;code segment will be at lower address
+ ;than data segment
+
+standard equ on ;data not in separate segment
+
+ org 0000H
+BASE equ $
+
+; bios value defined at end of module
+
+SSIZE equ 32 ;32 level stack
+
+; low memory locations
+
+reboot equ 0000h ;reboot system
+
+;
+; equates for non graphic characters
+;
+ctlc equ 03h ;control c
+ctle equ 05h ;physical eol
+ctlh equ 08h ;backspace
+ctlp equ 10h ;prnt toggle
+ctlr equ 12h ;repeat line
+ctls equ 13h ;stop/start screen
+ctlu equ 15h ;line delete
+ctlx equ 18h ;=ctl-u
+ctlz equ 1Ah ;end of file
+rubout equ 7Fh ;char delete
+tab equ 09h ;tab char
+cr equ 0Dh ;carriage return
+lf equ 0Ah ;line feed
+ctl equ 5Eh ;up arrow
+
+subttl PUBLICs and EXTRNs
+
+ name ('BDOS')
+
+ cseg
+
+ ;used
+ ; by
+ public BDOS$CD
+ public BDOS$DT
+ public ?bdos
+ public ?bdosc
+ public ?bdosw
+
+ ;defined in
+
+ extrn ?flush ;bios
+ extrn ?discd ;bios
+ extrn ?mov ;bios
+ extrn ?auxis ;bios
+ extrn ?auxos ;bios
+ extrn ?dscrf ;bios
+ extrn ?bytbc ;bios
+ extrn ?bytba ;bios
+
+subttl BDOS Front End
+BDOS$CD:
+ defb '654321'
+
+; enter here from the user's program with function number in c,
+; and information address in d,e
+
+ if not data_low
+?bdos:
+ endif
+
+ jp bdose ;past parameter block
+
+ defw SUB$FLAG
+ defw OLOG
+
+front_size equ $-bdos$cd ;size of block to load to front of
+ ;data segment
+
+bdose: ;arrive here from user programs
+ ld (info),de ;info = DE
+
+ ld A,C ;FX=BDOS FUNCTION NUMBER
+ ld (FX),a
+
+ ld a,(ACTDSK) ;SELDSK=ACTDSK
+ ld (SELDSK),a
+
+ ld hl,0 ;return value defaults to 0000
+ ld (aret),hl
+
+ ld (RESEL),hl ; RESEL,RELOG = FALSE
+
+;save user's stack pointer, set to local stack
+ ld (entsp),sp ;entsp = SP
+
+ ld sp,lstack ;local stack setup
+ ld hl,goback ;return here after all functions
+ push hl ;jmp goback equivalent to ret
+ ld A,C
+ cp nfuncs
+ jr nc,HIGH$FX
+
+ ld C,E ;possible output character to C
+ ld hl,functab
+DISPATCH:
+ ld E,A ;DE=func, HL=.ciotab
+ ld D,0
+
+ add hl,de ;DE=functab(func)
+ add hl,de
+ ld E,(hl)
+ inc hl
+ ld D,(hl)
+
+ ld hl,(info) ;info in DE for later xchg
+ ex de,hl ;dispatched
+ jp (hl)
+subttl Imbedded copyright message
+
+ defb 'COPYRIGHT (C) 1984, '
+ defb 'DIGITAL RESEARCH '
+ defb '042384'
+subttl
+
+HIGH$FX:
+ cp 45
+ jp z,FUNC45
+
+ cp 48
+ jp z,FUNC48
+
+ cp 124
+ jp z,func124
+
+ cp 125
+ jp z,func125
+
+ ld hl,XFUNCTAB
+ sub 109 ; RETURN IF FX < 109
+ ret c
+
+ cp XNFUNCS ; RETURN IF FX >= 109 + XNFUNCS
+ ret nc
+
+ jr DISPATCH
+
+subttl Cold & Warm Start Initialization
+?bdosc: ;COLD START INITIALIZATION ROUTINE
+ call FUNC13
+ ld C,CS$INIT$SIZE
+ jr WS$INIT0
+
+?bdosw: ;WARM START INITIALIZATION ROUTINE
+ ld C,WS$INIT$SIZE
+WS$INIT0:
+ xor A
+ ld hl,COLUMN
+
+WS$INIT1:
+ ld (hl),A
+ inc hl
+ dec C
+ jr nz,WS$INIT1
+
+ if data_low
+ ld bc,front_size ;move an image of the front of the BDOS code
+ ld de,bdos$dt ;segment to the front of the data segment for
+ ld hl,bdos$cd ;systems with data lower in RAM
+ ldir
+ endif
+
+ ld A,'$'
+ ld (OUT$DELIM),a
+
+ call SCAN$DRIVE
+ jp NOSELECT1
+subttl Dispatch Table for Functions
+functab:
+ defw wbootf,func1,func2,func3
+ defw punchf,listf,func6,func7
+ defw func8,func9,func10,func11
+diskf equ ($-functab)/2 ;disk funcs
+ defw func12,func13,func14,func15
+ defw func16,func17,func18,func19
+ defw func20,func21,func22,func23
+ defw func24,func25,func26,func27
+ defw func28,func29,func30,func31
+ defw func32,func33,func34,func35
+ defw func36,func37,func38,func39
+ defw func40
+nfuncs equ ($-functab)/2
+
+XFUNCTAB:
+ defw FUNC109,FUNC110,FUNC111,FUNC112,FUNC113
+XNFUNCS equ ($-XFUNCTAB)/2
+subttl Error Subroutine
+
+ERROR: ; C = ERROR #, A = FF => RETURN & DISPLAY MODE
+ push af
+ push bc
+ call CPMERR
+ pop bc
+ pop af
+ inc A
+ ret z
+
+ dec C
+ call z,RESET$DRIVE
+ call CONINF
+ jp WBOOTF
+subttl Console Handlers
+
+conin:
+;read console character to A
+ ld hl,kbchar
+ ld A,(hl)
+ ld (hl),0
+ or A
+ ret nz
+
+ ;no previous keyboard character ready
+ jp coninf ;get character externally
+ ;ret
+
+conech: ;read character with echo
+ call conin
+ call echoc
+ jr c,CONECH1
+
+;character must be echoed before return
+ push af
+ ld C,A
+ call tabout
+ pop af
+ ret ;with character in A
+
+CONECH1:
+ cp CTLS
+ ret nz
+
+ call CONBS
+ jr CONECH
+
+echoc:
+;echo character if graphic
+;cr, lf, tab, or backspace
+ cp cr
+ ret z ;carriage return?
+
+ cp lf
+ ret z ;line feed?
+
+ cp tab
+ ret z ;tab?
+
+ cp ctlh
+ ret z ;backspace?
+
+ cp ' '
+ ret ;carry set if not graphic
+
+CONBRKX:
+ ld a,(KBCHAR)
+ or A
+ jr nz,CONB1
+
+CONBRKX1:
+ call CONSTF
+ and 1
+ ret
+
+conbrk: ;check for character ready
+ ld a,(KBCHAR)
+ or A
+ jr nz,CONB1
+
+CONBRK1:
+ call CONBRKX1
+ ret z ; RETURN IF CHARACTER NOT READY
+
+;character ready, read it
+ call coninf ;to A
+ cp ctls
+ jr nz,conb0 ;check stop screen function
+
+CONBS:
+;found ctls, read next character
+ call coninf ;to A
+ cp ctlc
+ jp z,reboot ;ctlc implies re-boot
+
+;not a reboot, act as if nothing has happened
+ xor A
+ ret ;with zero in accumulator
+
+conb0:
+;character in accum, save it
+ ld (kbchar),a
+conb1:
+;return with true set in accumulator
+ ld A,-1
+ ret
+
+conout:
+;compute character position/write console char from C
+;compcol = true if computing column position
+ ld a,(compcol)
+ or A
+ jr nz,compout
+
+;write the character, then compute the column
+;write console character from C
+ push bc
+ call CONBRK1 ;check for screen stop function
+ pop bc
+ push bc ;recall/save character
+ call conoutf ;externally, to console
+ ;may be copying to the list device
+ ld a,(listcp)
+ or A
+ call nz,listf ;to printer, if so
+ pop bc ;recall the character
+compout:
+ ld A,C ;recall the character
+ ;and compute column position
+ ld hl,column ;A = char, HL = .column
+ cp rubout
+ ret z ;no column change if nulls
+
+ inc (hl) ;column = column + 1
+ cp ' '
+ ret nc ;return if graphic
+
+;not graphic, reset column position
+ dec (hl) ;column = column - 1
+ ld A,(hl)
+ or A
+ ret z ;return if at zero
+
+;not at zero, may be backspace or end line
+ ld A,C ;character back to A
+ cp ctlh
+ jr nz,notbacksp
+
+;backspace character
+ dec (hl) ;column = column - 1
+ ret
+
+notbacksp:
+;not a backspace character, eol?
+ cp lf
+ ret nz ;return if not
+
+;end of line, column = 0
+ ld (hl),0 ;column = 0
+ ret
+
+ctlout:
+;send C character with possible preceding up-arrow
+ ld A,C
+ call echoc ;cy if not graphic (or special case)
+ jr nc,tabout ;skip if graphic, tab, cr, lf, or ctlh
+
+;send preceding up arrow
+ push af
+ ld C,ctl
+ call conout ;up arrow
+ pop af
+ or 40h ;becomes graphic letter
+ ld C,A ;ready to print
+ ;(drop through to tabout)
+
+tabout:
+;expand tabs to console
+ ld a,(FX)
+ dec A
+ jr z,TABOUT1
+
+ ld a,(CONMODE)
+ and 10H
+ jp nz,CONOUTF
+
+TABOUT1:
+ ld A,C
+ cp tab
+ jr nz,conout ;direct to conout if not
+
+;tab encountered, move to next tab position
+tab0:
+ ld C,' '
+ call conout ;another blank
+ ld a,(column)
+ and 111b ;column mod 8 = 0 ?
+ jr nz,tab0 ;back for another if not
+
+ ret
+
+backup:
+;back-up one screen position
+ call pctlh
+ ld C,' '
+ call conoutf
+ ;(drop through to pctlh)
+
+pctlh:
+;send ctlh to console without affecting column count
+ ld C,ctlh
+ jp conoutf
+ ;ret
+
+crlfp:
+;print #, cr, lf for ctlx, ctlu, ctlr functions
+;then move to strtcol (starting column)
+ ld C,'#'
+ call conout
+ call crlf
+
+;column = 0, move to position strtcol
+crlfp0:
+ ld a,(column)
+ ld hl,strtcol
+ cp (hl)
+ ret nc ;stop when column reaches strtcol
+
+ ld C,' '
+ call conout ;print blank
+ jr crlfp0
+
+crlf:
+;carriage return line feed sequence
+ ld C,cr
+ call conout
+ ld C,lf
+ jp conout
+ ;ret
+
+print:
+;print message until M(BC) = '$'
+ ld hl,OUT$DELIM
+ ld a,(bc)
+ cp (hl)
+ ret z ;stop on $
+
+;more to print
+ inc bc
+ push bc
+ ld C,A ;char to C
+ call tabout ;another character printed
+ pop bc
+ jr print
+
+read: ;read to info address (max length, current length, buffer)
+ ld A,1
+ ld (FX),a
+ ld a,(column)
+ ld (strtcol),a ;save start for ctl-x, ctl-h
+ ld hl,(info)
+ ld C,(hl)
+ inc hl
+ push hl
+ xor A
+ ld B,A
+ ld (SAVE$POS),a
+
+;B = current buffer length,
+;C = maximum buffer length,
+;HL= next to fill - 1
+readnx:
+;read next character, BC, HL active
+ push bc
+ push hl ;blen, cmax, HL saved
+readn0:
+ call conin ;next char in A
+ pop hl
+ pop bc ;reactivate counters
+ cp cr
+ jp z,readen ;end of line?
+
+ cp lf
+ jp z,readen ;also end of line
+
+ cp ctlh
+ jr nz,noth ;backspace?
+
+;do we have any characters to back over?
+ ld a,(STRTCOL)
+ ld D,A
+ ld a,(COLUMN)
+ cp D
+ jr z,readnx
+
+ ld (COMPCOL),a ;COL>0
+;characters remain in buffer, can we backup one
+ ld a,b ;check character count SCC 22 Apr 84
+ or a ; SCC 22 Apr 84
+ jr z,linelen ;already 0, don't decr SCC 22 Apr 84
+
+ dec B ;remove one character
+;compcol > 0 marks repeat as length compute
+ jr linelen ;uses same code as repeat
+noth:
+;not a backspace
+ cp rubout
+ jr nz,notrub ;rubout char?
+
+;rubout encountered, rubout if possible
+ ld A,B
+ or A
+ jr z,readnx ;skip if len=0
+
+;buffer has characters, resend last char
+ ld A,(hl)
+ dec B
+ dec hl ;A = last char
+;blen=blen-1, next to fill - 1 decremented
+ jp rdech1 ;act like this is an echo
+
+notrub:
+;not a rubout character, check end line
+ cp ctle
+ jr nz,note ;physical end line?
+
+;yes, save active counters and force eol
+ push bc
+ ld A,B
+ ld (SAVE$POS),a
+ push hl
+ call crlf
+ xor A
+ ld (strtcol),a ;start position = 00
+ jr readn0 ;for another character
+
+note:
+;not end of line, list toggle?
+ cp ctlp
+ jr nz,notp ;skip if not ctlp
+
+;list toggle - change parity
+ push hl ;save next to fill - 1
+ ld hl,listcp ;HL=.listcp flag
+ ld A,1
+ sub (hl) ;True-listcp
+ ld (hl),A ;listcp = not listcp
+ pop hl
+ jr readnx ;for another char
+
+notp:
+;not a ctlp, line delete?
+ cp ctlx
+ jr nz,notx
+
+ pop hl ;discard start position
+;loop while column > strtcol
+backx:
+ ld a,(strtcol)
+ ld hl,column
+ cp (hl)
+ jr nc,read ;start again
+
+ dec (hl) ;column = column - 1
+ call backup ;one position
+ jr backx
+
+notx:
+;not control-X, control-U?
+ cp ctlu
+ jr nz,notu ;skip if not
+
+;delete line (ctlu)
+ call crlfp ;physical eol
+ pop hl ;discard starting position
+ jp read ;to start all over
+
+notu:
+;not line delete, repeat line?
+ cp ctlr
+ jr nz,notr
+
+ xor A
+ ld (SAVE$POS),a
+linelen:
+;repeat line, or compute line len (ctlh)
+;if compcol > 0
+ push bc
+ call crlfp ;save line length
+ pop bc
+ pop hl
+ push hl
+ push bc
+;bcur, cmax active, beginning buff at HL
+rep0:
+ ld A,B
+ or A
+ jr z,rep1 ;count len to 00
+
+ inc hl
+ ld C,(hl) ;next to print
+ dec B
+ pop de
+ push de
+ ld A,D
+ sub B
+ ld D,A
+ push bc
+ push hl ;count length down
+ ld a,(save$pos)
+ cp D
+ call c,CTLOUT ;character echoed
+ pop hl
+ pop bc ;recall remaining count
+ jr rep0 ;for the next character
+
+rep1:
+;end of repeat, recall lengths
+;original BC still remains pushed
+ push hl ;save next to fill
+ ld a,(compcol)
+ or A ;>0 if computing length
+ jp z,readn0 ;for another char if so
+
+;column position computed for ctlh
+ ld hl,column
+ sub (hl) ;diff > 0
+ ld (compcol),a ;count down below
+;move back compcol-column spaces
+backsp:
+;move back one more space
+ call backup ;one space
+ ld hl,compcol
+ dec (hl)
+ jr nz,backsp
+
+ jp readn0 ;for next character
+
+notr:
+;not a ctlr, place into buffer
+rdecho:
+ inc hl
+ ld (hl),A ;character filled to mem
+ inc B ;blen = blen + 1
+rdech1:
+;look for a random control character
+ push bc
+ push hl ;active values saved
+ ld C,A ;ready to print
+ call ctlout ;may be up-arrow C
+ pop hl
+ pop bc
+ ld A,(hl) ;recall char
+ cp ctlc ;set flags for reboot test
+ ld A,B ;move length to A
+ jr nz,notc ;skip if not a control c
+
+ cp 1 ;control C, must be length 1
+ jp z,reboot ;reboot if blen = 1
+
+ ;length not one, so skip reboot
+notc:
+ ;not reboot, are we at end of buffer?
+ cp C
+ jp c,readnx ;go for another if not
+
+readen:
+;end of read operation, store blen
+ pop hl
+ ld (hl),B ;M(current len) = B
+ ld C,cr
+ jp conout ;return carriage
+ ;ret
+
+subttl Character I/O Functions
+func1:
+;return console character with echo
+ call conech
+ jr sta$ret
+
+func2 equ tabout
+;write console character with tab expansion
+
+func3:
+;return reader character
+ call readerf
+ jr sta$ret
+
+;func4: equated to punchf
+;write punch character
+
+;func5: equated to listf
+;write list character
+;write to list device
+
+func6:
+;direct console i/o - read if 0FFh
+ ld A,C
+ inc A
+ jr z,dirinp ;0FFh => 00h, means input mode
+
+ inc A
+ jp nz,CONOUTF ;DIRECT OUTPUT FUNCTION
+
+;0FEh => STATUS
+ call CONBRKX
+ ret z
+
+ jp LRET$EQ$FF
+
+dirinp:
+ call CONBRKX ;status check
+ ret z ;skip, return 00 if not ready
+
+;character is ready, get it
+ call CONIN ;to A
+ jr sta$ret
+
+FUNC7: ;READER STATUS
+ call ?auxis
+ jr STA$RET
+
+FUNC8: ;PUNCH STATUS
+ call ?auxos
+ jr STA$RET
+
+func9:
+;write line until $ encountered
+ ex de,hl ;was lhld info
+ ld C,L
+ ld B,H ;BC=string address
+ jp print ;out to console
+
+func10 equ read
+;read a buffered console line
+
+func11:
+;check console status
+ call conbrk
+ ;(drop through to sta$ret)
+
+sta$ret:
+;store the A register to aret
+ ld (aret),a
+func$ret:
+ ret ;jmp goback (pop stack for non cp/m functions)
+
+setlret1:
+;set lret = 1
+ ld A,1
+ jr sta$ret
+subttl CP/M-Plus Function
+FUNC109: ;GET/SET CONSOLE MODE
+
+; CONMODE BITS = 7 6 5 4 3 2 1 0
+; DEFINED BITS = 4
+;
+; BIT 4 = 0: Normal BDOS operation
+; 1: Supress BDOS expansion of tabs, ^P and ^S handling on
+; console output
+
+ ld hl,CONMODE
+TEST$SET:
+ ld A,D
+ and E
+ inc A
+ ld A,(hl)
+ jr z,STA$RET
+
+ ld (hl),E
+ ret
+
+FUNC110: ;GET/SET OUTPUT DELIMITER
+ ld hl,OUT$DELIM
+ jr TEST$SET
+
+FUNC111: ;PRINT BLOCK TO CONSOLE
+
+FUNC112: ;PRINT BLOCK TO LIST
+;
+ ex de,hl
+ ld E,(hl)
+ inc hl
+ ld D,(hl)
+ inc hl
+ ld C,(hl)
+ inc hl
+ ld B,(hl)
+ ex de,hl
+;HL = ADDR OF STRING
+;BC = LENGTH OF STRING
+BLK$OUT:
+ ld A,B
+ or C
+ ret z
+
+ push bc
+ push hl
+ ld C,(hl)
+ call BLK$OUT1
+ pop hl
+ inc hl
+ pop bc
+ dec bc
+ jr BLK$OUT
+
+BLK$OUT1:
+ ld a,(FX)
+ rra
+ jp c,TABOUT
+
+ jp LISTF
+subttl New Personal CP/M Functions
+FUNC113: ;PERFORM SCREEN FUNCTION
+ call ?dscrf
+ jp sthl$ret
+
+func124: ;Byte BLT copy
+ call ?bytbc
+ jr sta$ret
+
+func125: ;Byte BLT alter
+ call ?bytba
+ jr sta$ret
+
+;
+; end of Basic I/O System
+
+subttl BDOS Disk functions
+
+;*****************************************************************
+;*****************************************************************
+;** **
+;** B a s i c D i s k O p e r a t i n g S y s t e m **
+;** **
+;*****************************************************************
+;*****************************************************************
+
+dvers equ 28h ;Personal CP/M 1.0
+
+;
+; module addresses
+;
+
+;;; literal constants
+
+true equ 0ffh ;constant true
+false equ 000h ;constant false
+enddir equ 0ffffh ;end of directory
+byte equ 1 ;number of bytes for "byte" type
+word equ 2 ;number of bytes for "word" type
+
+;
+; fixed addresses in low memory
+;
+
+tfcb equ 005ch ;default fcb location
+tbuff equ 0080h ;default buffer location
+subttl
+;
+; error message handlers
+;
+
+rod$error:
+;report read/only disk error
+ ld C,2
+ jr GOERR
+
+rof$error:
+;report read/only file error
+ ld C,3
+ jr GOERR
+
+sel$error:
+ call RESET$DRIVE
+;report select error
+ ld C,4
+
+goerr:
+ ld H,C
+ ld L,0FFH
+ ld (ARET),hl
+
+GOERR1:
+ ld a,(ERRMODE)
+ inc A
+ call nz,ERROR
+
+ ld A,0FFH
+ ld (CURDSK),a
+
+ ld a,(FX)
+ cp 27
+ jp z,GOBACK0
+
+ cp 31
+ jp z,GOBACK0
+
+ jp GOBACK
+subttl Local Subroutines for Bios Interface
+MOVE:
+ ld B,0 ;move number of bytes in C
+;
+MOVEX:
+ call ?mov
+ ret
+subttl Select Disk
+selectdisk:
+
+;select the disk drive given by register D, and fill
+;the base addresses curtrka - alloca, then fill
+;the values of the disk parameter block
+
+ ld C,D ;current disk# to c
+ ld hl,LSN$NS
+ ld B,0
+ add hl,bc
+ ld (LSN$ADD),hl
+;lsb of e = 0 if not yet logged - in
+ call seldskf ;HL filled by call
+;HL = 0000 if error, otherwise disk headers
+ ld A,H
+ or L
+ ret z ;return with 0000 in HL and z flag
+
+;disk header block address in hl
+ ld E,(hl)
+ inc hl
+ ld D,(hl)
+ inc hl ;DE=.tran
+ ld (cdrmaxa),hl
+ inc hl
+ inc hl ;.cdrmax
+ ld (curtrka),hl
+ inc hl
+ inc hl ;HL=.currec
+ ld (curreca),hl
+ inc hl
+ inc hl ;HL=.buffa
+
+;DE still contains .tran
+
+ ex de,hl
+ ld (tranv),hl ;.tran vector
+ ld hl,buffa ;DE= source for move, HL=dest
+ ld C,addlist
+ call move ;addlist filled
+
+;now fill the disk parameter block
+
+ ld de,(dpbaddr) ;DE is source
+ ld hl,sectpt ;HL is destination
+ ld C,dpblist
+ call move ;data filled
+
+;now set single/double map mode
+
+ ld hl,(maxall) ;largest allocation number
+ ld A,H ;00 indicates < 255
+ ld hl,single
+ ld (hl),true ;assume a=00
+ or A
+ jr z,retselect
+
+;high order of maxall not zero, use double dm
+
+ ld (hl),false
+
+retselect:
+
+ scf
+ ret ;select disk function ok
+subttl HOME - move to track 0, sector 0
+
+home:
+
+;move to home position, then offset to start of dir
+
+ call homef ;move to track 00, sector 00 reference
+
+;lxi h,offset ;mov c,m ;inx h ;mov b,m ;call settrkf ;
+;first directory position selected
+
+ xor A ;constant zero to accumulator
+ ld hl,(curtrka)
+ ld (hl),A
+ inc hl
+ ld (hl),A ;curtrk=0000
+ ld hl,(curreca)
+ ld (hl),A
+ inc hl
+ ld (hl),A ;currec=0000
+
+;curtrk, currec both set to 0000
+
+ ret
+subttl RDBUFF & WRBUFF - read & write disk buffers
+
+rdbuff:
+;read buffer and check condition
+ ld a,1
+ call readf ;current drive, track, sector, dma
+ jr diocomp ;check for i/o errors
+
+wrbuff:
+;write buffer and check condition
+;write type (wrtype) is in register C
+;wrtype = 0 => normal write operation
+;wrtype = 1 => directory write operation
+;wrtype = 2 => start of new block
+
+ call writef ;current drive, track, sector, dma
+
+diocomp: ;check for disk errors
+
+ or A
+ ret z
+
+ ld C,A
+ jp GOERR
+subttl SEEK$DIR - seek the record containing the current dir entry
+
+seek$dir:
+
+ ld hl,(dcnt) ;directory counter to HL
+ ld C,dskshf
+ call hlrotr ;value to HL
+ ld (arecord),hl ;ready for seek
+ ;jmp seek
+ ;ret
+subttl SEEK - seek the track given by actual record
+
+seek:
+;seek the track given by arecord (actual record)
+;load the registers from memory
+
+ ld hl,arecord
+ ld c,(hl) ;arecord
+ inc hl
+ ld b,(hl)
+ ld hl,(curreca)
+ ld e,(hl) ;currec
+ inc hl
+ ld d,(hl)
+ ld hl,(curtrka)
+ ld A,(hl) ;curtrk
+ inc hl
+ ld h,(hl)
+ ld l,A
+
+;loop while arecord < currec
+seek0:
+
+ ld A,c
+ sub e
+ ld A,b
+ sbc a,d
+ jr nc,seek1 ;skip if arecord >= currec
+
+;currec = currec - sectpt
+
+ push hl
+ ld hl,(sectpt)
+ ld A,e
+ sub L
+ ld e,A
+ ld A,d
+ sbc a,H
+ ld d,A
+ pop hl
+
+;curtrk = curtrk - 1
+
+ dec hl
+ jr seek0 ;for another try
+
+seek1:
+;look while arecord >= (t:=currec + sectpt)
+
+ push hl
+ ld hl,(sectpt)
+ add hl,de ;HL = currec+sectpt
+ jr c,seek2 ;can be > FFFFH
+
+ ld A,c
+ sub l
+ ld A,b
+ sbc a,h
+ jr c,seek2 ;skip if t > arecord
+
+;currec = t
+
+ ex de,hl
+
+;curtrk = curtrk + 1
+
+ pop hl
+ inc hl
+ jr seek1 ;for another try
+
+seek2: pop hl
+;arrive here with updated values in each register
+
+ push bc
+ push de
+ push hl ;to stack for later
+
+;stack contains (lowest) BC=arecord, DE=currec, HL=curtrk
+
+ ex de,hl
+ ld hl,(offset)
+ add hl,de ;HL = curtrk+offset
+ ld B,H
+ ld C,L
+ call settrkf ;track set up
+
+;note that BC - curtrk is difference to move in bios
+
+ pop de ;recall curtrk
+ ld hl,(curtrka)
+ ld (hl),E
+ inc hl
+ ld (hl),D ;curtrk updated
+
+;now compute sector as arecord-currec
+
+ pop de ;recall currec
+ ld hl,(curreca)
+ ld (hl),e
+ inc hl
+ ld (hl),d
+ pop bc ;BC=arecord, DE=currec
+ ld A,c
+ sub e
+ ld c,A
+ ld A,b
+ sbc a,d
+ ld b,A
+ ld hl,(tranv)
+ ex de,hl ;BC=sector#, DE=.tran
+ call sectran ;HL = tran(sector)
+ ld C,L
+ ld B,H ;BC = tran(sector)
+ jp setsecf ;sector selected
+ ;ret
+subttl FCB constants
+
+;; file control block (fcb) constants
+
+empty equ 0E5h ;empty directory entry
+lstrec equ 127 ;last record# in extent
+recsiz equ 128 ;record size
+fcblen equ 32 ;file control block size
+dirrec equ recsiz/fcblen ;directory elts / record
+dskshf equ 2 ;log2(dirrec)
+dskmsk equ dirrec-1
+fcbshf equ 5 ;log2(fcblen)
+
+
+extnum equ 12 ;extent number field
+maxext equ 31 ;largest extent number
+ubytes equ 13 ;unfilled bytes field
+modnum equ 14 ;data module number
+maxmod equ 15 ;largest module number
+fwfmsk equ 80h ;file write flag is high order modnum
+namlen equ 15 ;name length
+reccnt equ 15 ;record count field
+dskmap equ 16 ;disk map field
+lstfcb equ fcblen-1
+nxtrec equ fcblen
+ranrec equ nxtrec+1 ;random record field (2 bytes)
+
+;
+; reserved file indicators
+;
+
+rofile equ 9 ;high order of first type char
+invis equ 10 ;invisible file in dir command
+; equ 11 ;reserved
+subttl Utility functions for file access
+dm$position:
+;compute disk map position for vrecord to HL
+
+ ld hl,blkshf
+ ld C,(hl) ;shift count to C
+ ld a,(vrecord) ;current virtual record to A
+
+dmpos0:
+
+ or A
+ rra
+ dec C
+ jr nz,dmpos0
+
+;A = shr(vrecord,blkshf) = vrecord/2**(sect/block)
+
+ ld B,A ;save it for later addition
+ ld A,8
+ sub (hl) ;8-blkshf to accumulator
+ ld C,A ;extent shift count in register c
+ ld a,(extval) ;extent value ani extmsk
+
+dmpos1:
+;blkshf = 3,4,5,6,7, C=5,4,3,2,1
+;shift is 4,3,2,1,0
+
+ dec C
+ jr z,dmpos2
+
+ or A
+ rla
+ jr dmpos1
+
+dmpos2:
+;arrive here with A = shl(ext and extmsk,7-blkshf)
+
+ add a,B ;add the previous shr(vrecord,blkshf) value
+
+;A is one of the following values, depending upon alloc
+;bks blkshf
+;1k 3 v/8 + extval * 16
+;2k 4 v/16+ extval * 8
+;4k 5 v/32+ extval * 4
+;8k 6 v/64+ extval * 2
+;16k 7 v/128+extval * 1
+
+ ret ;with dm$position in A
+subttl GETDM - return disk map value from position given by BC
+
+getdm:
+
+ ld hl,(info) ;base address of file control block
+ ld de,dskmap
+ add hl,de ;HL =.diskmap
+ add hl,bc ;index by a single byte value
+ ld a,(single) ;single byte/map entry?
+ or A
+ jr z,getdmd ;get disk map single byte
+
+ ld L,(hl)
+ ld H,0
+ ret ;with HL=00bb
+
+getdmd:
+
+ add hl,bc ;HL=.fcb(dm+i*2)
+ ;double precision value returned
+ ld E,(hl)
+ inc hl
+ ld D,(hl)
+ ex de,hl
+ ret
+subttl INDEX - compute disk block number from current FCB
+
+index:
+ call dm$position ;0...15 in register A
+ ld C,A
+ ld B,0
+ call getdm ;value to HL
+ ld (arecord),hl
+ ld A,L
+ or H
+ ret
+subttl ATRAN - compute actual record address, assuming index called
+
+atran:
+ ld a,(blkshf) ;shift count to reg A
+ ld hl,(arecord)
+
+atran0:
+
+ add hl,hl
+ dec A
+ jr nz,atran0 ;shl(arecord,blkshf)
+
+ ld (arecord1),hl ;save shifted block #
+ ld a,(blkmsk)
+ ld C,A ;mask value to C
+ ld a,(vrecord)
+ and C ;masked value in A
+ or L
+ ld L,A ;to HL
+ ld (arecord),hl ;arecord=HL or (vrecord and blkmsk)
+ ret
+subttl GETEXTA - get current extent field address
+
+getexta:
+ ld hl,(info)
+ ld de,extnum
+ add hl,de ;HL=.fcb(extnum)
+ ret
+subttl GETFCBA - compute RECCNT and NXTREC addresses for GET/SETFCB
+
+getfcba:
+ ld hl,(info)
+ ld de,reccnt
+ add hl,de
+ ex de,hl ;DE=.fcb(reccnt)
+ ld hl,nxtrec-reccnt
+ add hl,de ;HL=.fcb(nxtrec)
+ ret
+subttl GETFCB - set variables from currently addressed FCB
+
+getfcb:
+ call getfcba ;addresses in DE, HL
+ ld A,(hl)
+ ld (vrecord),a ;vrecord=fcb(nxtrec)
+ ex de,hl
+ ld A,(hl)
+ ld (rcount),a ;rcount=fcb(reccnt)
+ call getexta ;HL=.fcb(extnum)
+ ld a,(extmsk) ;extent mask to a
+ and (hl) ;fcb(extnum) and extmsk
+ ld (extval),a
+ ret
+subttl SETFCB - place values back into current FCB
+
+setfcb:
+ call getfcba ;addresses to DE, HL
+ ld a,(VRECORD)
+ ld (hl),A
+ ld a,(FX)
+ cp 22
+ jr nc,setfcb_1
+
+ inc (hl)
+
+setfcb_1:
+
+ ex de,hl
+ ld a,(rcount)
+ ld (hl),A ;fcb(reccnt)=rcount
+ ret
+subttl HLROTR - HL rotated right by amount C
+
+hlrotr:
+ inc C ;in case zero
+hlrotr0:
+ dec C
+ ret z ;return when zero
+
+ srl h ;SCC - operation performed was actually a
+ rr l ;'shift right logical' of HL
+ jr hlrotr0
+subttl HLROTL - HL rotated left by amount C
+
+hlrotl:
+ inc C ;may be zero
+hlrotl0:
+ dec C
+ ret z ;return if zero
+
+ add hl,hl
+ jr hlrotl0
+subttl
+
+SCAN$DRIVE:
+
+ ld hl,(DLOG)
+
+SD$0:
+
+ ld A,16
+
+SD$1:
+
+ dec A
+ add hl,hl
+ jr nc,SD$4
+
+ push af
+ push hl
+ ld E,A
+ ld a,(SCAN$FLAG)
+ inc A
+ jr z,SD$2
+
+ call TMPSELECT
+ or 1
+ call COPY$ALV
+ call SET$DIR$BLKS
+ jr SD$3
+
+SD$2:
+
+ ld C,E
+ call ?discd
+
+SD$3:
+
+ pop hl
+ pop af
+
+SD$4:
+ or A
+ jr nz,SD$1
+
+ ret
+
+SET$DLOG:
+
+ ld de,DLOG
+
+set$cdisk:
+
+ ld a,(CURDSK)
+
+SET$CDISK1:
+
+ ld C,A ;ready parameter for shift
+ ld hl,1 ;number to shift
+ call hlrotl ;HL = mask to integrate
+ ld a,(de)
+ or L
+ ld (de),a
+ inc de
+ ld a,(de)
+ or H
+ ld (de),a
+ ret
+
+nowrite:
+;return true if dir checksum difference occurred
+
+ ld hl,(rodsk)
+
+TEST$VECTOR:
+
+ ld a,(curdsk)
+ ld C,A
+ call hlrotr
+ ld A,L
+ and 1b
+ ret ;non zero if nowrite
+
+TST$LOG$FXS:
+
+ ld hl,LOG$FXS
+
+TST$LOG0:
+
+ ld a,(FX)
+ ld B,A
+
+TST$LOG1:
+
+ ld A,(hl)
+ cp B
+ ret z
+
+ inc hl
+ or A
+ jr nz,TST$LOG1
+
+ inc A
+ ret
+
+TST$RELOG:
+
+ ld hl,RELOG
+ ld A,(hl)
+ or A
+ ret z
+
+ ld (hl),0
+ call CURSELECT
+ ld hl,0
+ ld (DCNT),hl
+ xor A
+ ld (DPTR),a
+ ret
+
+CHK$EXIT$FXS:
+
+ ld hl,GOBACK
+ push hl
+ ld hl,RW$FXS
+ call TST$LOG0
+ jr z,CHK$MEDIA2
+
+ ld hl,SC$FXS
+ call TST$LOG0
+ jp z,LRET$EQ$FF
+
+ pop hl
+ ret
+
+SET$LSN:
+
+ ld hl,(LSN$ADD)
+ ld C,(hl)
+ call GETEXTA
+ inc hl
+ ld (hl),C
+ ret
+
+SET$RLOG:
+
+ ld hl,(OLOG)
+ call TEST$VECTOR
+ ret z
+
+ ld de,RLOG
+ jr SET$CDISK
+
+CHECK$FCB:
+
+ call GETEXTA
+ inc hl
+ ld A,(hl)
+ ld hl,(LSN$ADD)
+ cp (hl)
+ call nz,CHK$MEDIA1
+ call GETMODNUM
+ and 40H
+ ret z
+
+ ld hl,(INFO)
+ ld (hl),0
+ ret
+
+CHK$MEDIA1:
+
+ ld hl,(RLOG)
+ call TEST$VECTOR
+ ret z
+
+ pop hl
+ pop hl
+
+CHK$MEDIA2:
+
+ ld A,10
+ jp STA$RET
+
+set$ro:
+;set current disk to read only
+
+ ld de,RODSK
+ ld a,(SELDSK)
+ call SET$CDISK1
+
+;high water mark in directory goes to max
+
+ ld hl,(dirmax)
+ inc hl
+ ex de,hl ;DE = directory max
+ ld hl,(cdrmaxa) ;HL = .cdrmax
+ ld (hl),E
+ inc hl
+ ld (hl),D ;cdrmax = dirmax
+ ret
+
+check$rodir:
+;check current directory element for read/only status
+
+ call getdptra ;address of element
+
+check$rofile:
+;check current buff(dptr) or fcb(0) for r/o status
+
+ ld de,rofile
+ add hl,de ;offset to ro bit
+ ld A,(hl)
+ rla
+ ret nc ;return if not set
+ jp rof$error
+
+check$write:
+;check for write protected disk
+
+ call nowrite
+ ret z ;ok to write if not rodsk
+
+ jp rod$error ;read only disk error
+
+getdptra:
+;compute the address of a directory element at
+;positon dptr in the buffer
+
+ ld hl,(buffa)
+ ld a,(dptr)
+
+addh:
+;HL = HL + A
+
+ add a,L
+ ld L,A
+ ret nc
+
+;overflow to H
+
+ inc H
+ ret
+
+getmodnum:
+;compute the address of the module number
+;bring module number to accumulator
+;(high order bit is fwf (file write flag)
+
+ ld hl,(info)
+ ld de,modnum
+ add hl,de ;HL=.fcb(modnum)
+ ld A,(hl)
+ ret ;A=fcb(modnum)
+
+clrmodnum:
+;clear the module number field for user open/make
+
+ call getmodnum
+ ld (hl),0 ;fcb(modnum)=0
+ ret
+
+setfwf:
+
+ call getmodnum ;HL=.fcb(modnum), A=fcb(modnum)
+
+;set fwf (file write flag) to "1"
+
+ or fwfmsk
+ ld (hl),A ;fcb(modnum)=fcb(modnum) or 80h
+
+;also returns non zero in accumulator
+
+ ret
+
+compcdr:
+;return cy if cdrmax > dcnt
+
+ ld de,(dcnt) ;DE = directory counter
+ ld hl,(cdrmaxa) ;HL=.cdrmax
+ ld A,E
+ sub (hl) ;low(dcnt) - low(cdrmax)
+ inc hl ;HL = .cdrmax+1
+ ld A,D
+ sbc a,(hl) ;hig(dcnt) - hig(cdrmax)
+
+;condition dcnt - cdrmax produces cy if cdrmax>dcnt
+
+ ret
+
+setcdr:
+;if not (cdrmax > dcnt) then cdrmax = dcnt+1
+
+ call compcdr
+ ret c ;return if cdrmax > dcnt
+
+;otherwise, HL = .cdrmax+1, DE = dcnt
+
+ inc de
+ ld (hl),D
+ dec hl
+ ld (hl),E
+ ret
+
+subdh:
+;compute HL = DE - HL
+
+ ld A,E
+ sub L
+ ld L,A
+ ld A,D
+ sbc a,H
+ ld H,A
+ ret
+
+newchecksum:
+
+ ld C,0FEH ;drop through to compute new checksum
+
+checksum:
+;compute current checksum record and update the
+;directory element if C=true, or check for = if not
+;ARECORD < chksiz?
+
+ ld de,(ARECORD)
+ ld hl,(chksiz)
+ call subdh ;DE-HL
+ ret nc ;skip checksum if past checksum vector size
+
+;ARECORD < chksiz, so continue
+
+ push bc ;save init flag
+
+;COMPUTE CHECKSUM FOR CURRENT DIRECTORY BUFFER
+
+ ld C,RECSIZ ;SIZE OF DIRECTORY BUFFER
+ ld hl,(BUFFA) ;CURRENT DIRECTORY BUFFER
+ xor A ;CLEAR CHECKSUM VALUE
+
+COMPUTECS0:
+
+ add a,(hl)
+ inc hl
+ dec C ;CS=CS+BUFF(RECSIZ-C)
+ jr nz,COMPUTECS0
+
+ ld de,(checka) ;address of check sum vector
+ ld hl,(ARECORD)
+ add hl,de ;HL = .check(ARECORD)
+ pop bc ;recall true=0ffh or false=00 to C
+ inc C ;0ffh produces zero flag
+ jr z,initial$cs
+ inc C
+ jr z,UPDATE$CS
+
+;not initializing, compare
+
+ cp (hl) ;compute$cs=check(ARECORD)?
+ ret z ;no message if ok
+ call NOWRITE
+ ret nz
+ ld A,0FFH
+ ld (RELOG),a
+ call set$rlog
+
+RESET$DRIVE:
+
+ call set$dlog
+ jp RESET37X
+
+initial$cs:
+
+ cp (hl)
+ ld (hl),A
+ ret z
+ ld hl,(LSN$ADD)
+ ld A,1
+ or (hl)
+
+UPDATE$CS:
+;initializing the checksum
+
+ ld (hl),A
+ ret
+
+wrdir:
+;write the current directory entry, set checksum
+
+ call newchecksum ;initialize entry
+ call setdir ;directory dma
+ ld C,1 ;indicates a write directory operation
+ call wrbuff ;write the buffer
+ jr setdata ;to data dma address
+ ;ret
+
+rd$dir:
+;read a directory entry into the directory buffer
+
+ call seek$dir
+ call setdir ;directory dma
+ call rdbuff ;directory record loaded
+ ; jmp setdata to data dma address
+ ;ret
+
+setdata:
+;set data dma address
+
+ ld hl,dmaad
+ jr setdma ;to complete the call
+
+setdir:
+;set directory dma address
+
+ ld hl,buffa ;jmp setdma to complete call
+
+setdma:
+;HL=.dma address to set (i.e., buffa or dmaad)
+
+ ld C,(hl)
+ inc hl
+ ld B,(hl) ;parameter ready
+ jp setdmaf
+
+dir$to$user:
+;copy the directory entry to the user buffer
+;after call to search or searchn by user code
+
+ ld de,(buffa) ;source is directory buffer
+ ld hl,(dmaad) ;destination is user dma address
+ ld C,recsiz ;copy entire record
+ call MOVE
+ ld hl,LRET
+ ld A,(hl)
+ inc A
+ ret z
+ ld a,(DCNT)
+ and DSKMSK
+ ld (hl),A
+ ret
+
+end$of$dir:
+;return zero flag if at end of directory, non zero
+;if not at end (end of dir if dcnt = 0ffffh)
+
+ ld hl,(DCNT)
+ ld A,L
+ and H
+ inc A
+ ret
+
+set$end$dir:
+;set dcnt to the end of the directory
+
+ ld hl,enddir
+ ld (dcnt),hl
+ ret
+
+read$dir:
+;read next directory entry, with C=true if initializing
+
+ ld de,(dirmax) ;in preparation for subtract
+ ld hl,(dcnt)
+ inc hl
+ ld (dcnt),hl ;dcnt=dcnt+1
+
+;continue while dirmax >= dcnt (dirmax-dcnt no cy)
+
+ call subdh ;DE-HL
+ jr nc,read$dir0
+
+;yes, set dcnt to end of directory
+
+ jr set$end$dir
+ ;ret
+
+read$dir0:
+;not at end of directory, seek next element
+;initialization flag is in C
+
+ ld a,(dcnt)
+ and dskmsk ;low(dcnt) and dskmsk
+ ld B,fcbshf ;to multiply by fcb size
+
+read$dir1:
+
+ add a,A
+ dec B
+ jr nz,read$dir1
+
+;A = (low(dcnt) and dskmsk) shl fcbshf
+
+ ld (dptr),a ;ready for next dir operation
+ or A
+ ret nz ;return if not a new record
+ push bc ;save initialization flag C
+ call rd$dir ;read the directory record
+ pop bc ;recall initialization flag
+ call CHECKSUM
+ ld a,(RELOG)
+ or A
+ ret z
+ call CHK$EXIT$FXS
+ call TST$RELOG
+ jr RD$DIR
+ ;ret
+
+getallocbit:
+;given allocation vector position BC, return with byte
+;containing BC shifted so that the least significant
+;bit is in the low order accumulator position. HL is
+;the address of the byte for possible replacement in
+;memory upon return, and D contains the number of shifts
+;required to place the returned value back into position
+
+ ld A,C
+ and 111b
+ inc A
+ ld E,A
+ ld D,A
+
+;d and e both contain the number of bit positions to shift
+
+ ld H,B
+ ld L,C
+ ld C,3
+ call HLROTR
+ ld B,H
+ ld C,L
+
+ ld hl,(alloca) ;base address of allocation vector
+ add hl,bc
+ ld A,(hl) ;byte to A, hl = .alloc(BC shr 3)
+
+;now move the bit to the low order position of A
+
+rotl: rlca
+ dec E
+ jr nz,rotl
+ ret
+
+set$alloc$bit:
+;BC is the bit position of ALLOC to set or reset. The
+;value of the bit is in register E.
+
+ push de
+ call getallocbit ;shifted val A, count in D
+ and 11111110b ;mask low bit to zero (may be set)
+ pop bc
+ or C ;low bit of C is masked into A
+ ;jmp rotr ;to rotate back into proper position
+ ;ret
+
+rotr:
+;byte value from ALLOC is in register A, with shift count
+;in register C (to place bit back into position), and
+;target ALLOC position in registers HL, rotate and replace
+
+ rrca
+ dec D
+ jr nz,rotr ;back into position
+ ld (hl),A ;back to ALLOC
+ ret
+
+COPY$ALV:
+;IF Z FLAG SET, COPY 1ST ALV TO 2ND ALV
+;OTHERWISE, COPY 2ND ALV TO 1ST ALV
+
+ push af
+ call GET$NALBS
+ ld B,H
+ ld C,L
+ ld hl,(ALLOCA)
+ ld D,H
+ ld E,L
+ add hl,bc
+ pop af
+ jp z,MOVEX
+ ex de,hl
+ jp MOVEX
+
+SCANDM$AB:
+
+ push bc
+ call SCANDM$A
+ pop bc
+ ;JMP SCANDM$B
+
+SCANDM$B:
+;SET/RESET 2ND ALV
+
+ push bc
+ call GET$NALBS
+ ex de,hl
+ ld hl,(ALLOCA)
+ pop bc
+ push hl
+ add hl,de
+ ld (ALLOCA),hl
+ call SCANDM$A
+ pop hl
+ ld (ALLOCA),hl
+ ret
+
+SCANDM$A:
+;SET/RESET 1ST ALLOCATION VECTOR
+;scan the disk map addressed by dptr for non-zero
+;entries, the allocation vector entry corresponding
+;to a non-zero entry is set to the value of C (0,1)
+
+ call getdptra ;HL = buffa + dptr
+
+;HL addresses the beginning of the directory entry
+
+ ld de,dskmap
+ add hl,de ;hl now addresses the disk map
+ push bc ;save the 0/1 bit to set
+ ld C,fcblen-dskmap+1 ;size of single byte disk map + 1
+
+scandm0:
+;loop once for each disk map entry
+
+ pop de ;recall bit parity
+ dec C
+ ret z ;all done scanning?
+
+ ;no, get next entry for scan
+ push de ;replace bit parity
+ ld a,(single)
+ or A
+ jr z,scandm1
+
+;single byte scan operation
+
+ push bc ;save counter
+ push hl ;save map address
+ ld C,(hl)
+ ld B,0 ;BC=block#
+ jr scandm2
+
+scandm1:
+;double byte scan operation
+
+ dec C ;count for double byte
+ push bc ;save counter
+ ld C,(hl)
+ inc hl
+ ld B,(hl) ;BC=block#
+ push hl ;save map address
+
+scandm2:
+;arrive here with BC=block#, E=0/1
+
+ ld A,C
+ or B ;skip if = 0000
+ jr z,scanm3
+ ld hl,(maxall) ;check invalid index
+ ld A,L
+ sub C
+ ld A,H
+ sbc a,B ;maxall - block#
+ call nc,set$alloc$bit
+
+;bit set to 0/1
+scanm3:
+
+ pop hl
+ inc hl ;to next bit position
+ pop bc ;recall counter
+ jr scandm0 ;for another item
+
+GET$NALBS: ;GET # OF ALLOCATION VECTOR BYTES
+
+ ld hl,(MAXALL)
+ ld C,3
+ call HLROTR
+ inc hl
+ ret
+
+SET$DIR$BLKS:
+
+ ld de,(DIRBLK)
+ ld hl,(ALLOCA)
+ ld A,(hl)
+ or E
+ ld (hl),A
+ inc hl
+ ld A,(hl)
+ or D
+ ld (hl),A
+ ret
+
+initialize:
+;initialize the current disk
+;lret = false ;set to true if $ file exists
+;compute the length of the allocation vector
+;number of bytes in alloc vector is (maxall/8)+1
+
+ call GET$NALBS
+ ld B,H
+ ld C,L ;count down BC til zero
+ ld hl,(alloca) ;base of allocation vector
+
+;fill the allocation vector with zeros
+initial0:
+
+ ld (hl),0
+ inc hl ;alloc(i)=0
+ dec bc ;count length down
+ ld A,B
+ or C
+ jr nz,initial0
+
+;set the reserved space for the directory
+
+ call SET$DIR$BLKS
+
+;allocation vector initialized, home disk
+
+ call home
+
+;cdrmax = 3 (scans at least one directory record)
+
+ ld hl,(cdrmaxa)
+ ld (hl),3
+ inc hl
+ ld (hl),0
+
+;cdrmax = 0000
+
+ call set$end$dir ;dcnt = enddir
+
+;read directory entries and check for allocated storage
+initial2:
+
+ ld C,true
+ call read$dir
+ call end$of$dir
+ jp z,COPY$ALV ;return if end of directory
+
+;not end of directory, valid entry?
+
+ call getdptra ;HL = buffa + dptr
+ ld A,0F0H
+ and (hl)
+ jr nz,INITIAL2
+
+;now scan the disk map for allocated blocks
+
+ ld C,1 ;set to allocated
+ call SCANDM$A
+ call setcdr ;set cdrmax to dcnt
+ jr initial2 ;for another entry
+
+copy$dirloc:
+;copy directory location to lret following
+;delete, rename, ... ops
+
+ ld a,(dirloc)
+ jp sta$ret
+ ;ret
+
+compext:
+;compare extent# in A with that in C, return nonzero
+;if they do not match
+
+ push bc ;save C's original value
+ push af
+ ld a,(extmsk)
+ cpl
+ ld B,A
+
+;B has negated form of extent mask
+
+ ld A,C
+ and B
+ ld C,A ;low bits removed from C
+ pop af
+ and B ;low bits removed from A
+ sub C
+ and maxext ;set flags
+ pop bc ;restore original values
+ ret
+
+SEARCH$EXTNUM:
+
+ ld C,EXTNUM
+ jr SEARCH
+
+SEARCH$NAMLEN:
+
+ ld C,NAMLEN
+
+search:
+;search for directory element of length C at info
+
+ ld A,0ffh
+ ld (dirloc),a ;changed if actually found
+ ld hl,searchl
+ ld (hl),C ;searchl = C
+ ld hl,(info)
+ ld (searcha),hl ;searcha = info
+ call set$end$dir ;dcnt = enddir
+ call home ;to start at the beginning
+;(drop through to searchn)
+
+searchn:
+;search for the next directory element, assuming
+;a previous call on search which sets searcha and
+;searchl
+
+ ld C,false
+ call read$dir ;read next dir element
+ call end$of$dir
+ jr z,search$fin ;skip to end if so
+
+
+;not end of directory, scan for match
+
+ ld hl,(searcha)
+ ex de,hl ;DE=beginning of user fcb
+ ld a,(de) ;first character
+ cp empty ;keep scanning if empty
+ jr z,searchnext
+
+;not empty, may be end of logical directory
+
+ push de ;save search address
+ call compcdr ;past logical end?
+ pop de ;recall address
+ jr nc,search$fin ;artificial stop
+
+searchnext:
+
+ xor A
+ ld (USER0$SEARCH),a
+ call getdptra ;HL = buffa+dptr
+ ld a,(searchl)
+ ld C,A ;length of search to c
+ ld B,0 ;b counts up, c counts down
+
+searchloop:
+
+ ld A,C
+ or A
+ jr z,endsearch
+
+ ld a,(de)
+ cp '?'
+ jr z,searchok ;? matches all
+
+;scan next character if not ubytes
+
+ ld A,B
+ cp ubytes
+ jr z,searchok
+
+;not the ubytes field, extent field?
+
+ cp extnum ;may be extent field
+ ld a,(de) ;fcb character
+ jr z,searchext ;skip to search extent
+
+ jr c,skipsys ;skip test for sys flag SCC 23 Apr 84
+
+ sub (hl) ; SCC 23 Apr 84
+ and 3Fh ; SCC 23 Apr 84
+ jr z,searchok ; SCC 23 Apr 84
+
+ ld a,(de) ;get FCB char again SCC 23 Apr 84
+skipsys: ; SCC 23 Apr 84
+
+ sub (hl)
+ and 7Fh ;mask-out flags/extent modulus
+ jr z,SEARCHOK
+
+ ld A,(hl)
+ or b
+ jr nz,SEARCHN
+
+ ld a,(FX)
+ cp 15
+ jr nz,SEARCHN
+
+ ld a,(USRCODE)
+ or A
+ jr z,SEARCHN
+
+ ld A,0FFH
+ ld (USER0$SEARCH),a
+ jr SEARCHOK
+
+searchext:
+;A has fcb character
+;attempt an extent # match
+
+ push bc ;save counters
+ ld C,(hl) ;directory character to c
+ call compext ;compare user/dir char
+ pop bc ;recall counters
+ jr nz,searchn ;skip if no match
+
+searchok:
+;current character matches
+
+ inc de
+ inc hl
+ inc B
+ dec C
+ jr searchloop
+
+endsearch:
+
+ xor A
+ ld (DIRLOC),a
+ ld (LRET),a
+ ld hl,USER0$SEARCH
+ inc (hl)
+ ret nz
+ ld hl,(DCNT)
+ ld (SDCNT),hl
+ jp SEARCHN
+
+search$fin:
+;end of directory, or empty name
+
+ call set$end$dir ;may be artifical end
+
+LRET$EQ$FF:
+
+ ld A,255
+ ld B,A
+ inc B
+ jp sta$ret
+
+delete:
+;delete the currently addressed file
+
+ call RESELECT
+ call check$write ;write protected?
+ call SEARCH$EXTNUM ;search through file type
+ ret z
+
+DELETE00:
+
+ jr z,DELETE1
+ call CHECK$RODIR
+ ld hl,(INFO)
+ call CHK$WILD
+ jr nz,DELETE11
+ call SEARCHN
+ jr DELETE00
+
+DELETE1:
+
+ call SEARCH$EXTNUM
+
+DELETE10:
+
+ jp z,COPY$DIRLOC
+
+DELETE11:
+
+ call GETDPTRA
+ ld (hl),EMPTY
+ ld C,0
+ call SCANDM$AB
+ call SET$DIR$BLKS
+ call DELETE$SUB
+ call WRDIR
+ call SEARCHN
+ jr DELETE10
+
+CHK$WILD:
+
+ ld C,11
+
+CHK$WILD1:
+
+ inc hl
+ ld A,3FH
+ sub (hl)
+ and 7FH
+ ret z
+ dec C
+ jr nz,CHK$WILD1
+ or A
+ ret
+
+get$block:
+;given allocation vector position BC, find the zero bit
+;closest to this position by searching left and right.
+;if found, set the bit to one and return the bit position
+;in hl. if not found (i.e., we pass 0 on the left, or
+;maxall on the right), return 0000 in hl
+
+ ld D,B
+ ld E,C ;copy of starting position to de
+
+lefttst:
+
+ ld A,C
+ or B
+ jr z,righttst ;skip if left=0000
+
+;left not at position zero, bit zero?
+
+ dec bc
+ push de
+ push bc ;left,right pushed
+ call getallocbit
+ rra
+ jr nc,retblock ;return block number if zero
+
+;bit is one, so try the right
+
+ pop bc
+ pop de ;left, right restored
+
+righttst:
+
+ ld hl,(maxall) ;value of maximum allocation#
+ ld A,E
+ sub L
+ ld A,D
+ sbc a,H ;right=maxall?
+ jr nc,retblock0 ;return block 0000 if so
+ inc de
+ push bc
+ push de ;left, right pushed
+ ld B,D
+ ld C,E ;ready right for call
+ call getallocbit
+ rra
+ jr nc,retblock ;return block number if zero
+ pop de
+ pop bc ;restore left and right pointers
+ jr lefttst ;for another attempt
+
+retblock:
+
+ rla
+ inc A ;bit back into position and set to 1
+
+;d contains the number of shifts required to reposition
+
+ call rotr ;move bit back to position and store
+ pop hl
+ pop de ;HL returned value, DE discarded
+ ret
+
+retblock0:
+;cannot find an available bit, return 0000
+
+ ld A,C
+ or B
+ jr nz,lefttst ;also at beginning
+ ld hl,0000h
+ ret
+
+copy$fcb:
+;copy the entire file control block
+
+ ld C,0
+ ld E,fcblen ;start at 0, to fcblen-1
+ ;jmp copy$dir
+
+copy$dir:
+;copy fcb information starting at C for E bytes
+;into the currently addressed directory entry
+
+ push de ;save length for later
+ ld B,0 ;double index to BC
+ ld hl,(info) ;HL = source for data
+ add hl,bc
+ push hl
+ call TEST$SUB
+ ld C,0FFH
+ call z,SET$SUB$FLAG
+ pop de ;DE=.fcb(C), source for copy
+ call getdptra ;HL=.buff(dptr), destination
+ pop bc ;DE=source, HL=dest, C=length
+ call move ;data moved
+
+seek$copy:
+;enter from close to seek and copy current element
+
+ call seek$dir ;to the directory element
+ jp wrdir ;write the directory element
+ ;ret
+
+TEST$SUB:
+
+ inc hl
+ ld de,SUB$FCB
+ ld C,11
+
+TEST$SUB1:
+
+ ld a,(de)
+ cp (hl)
+ ret nz
+ inc de
+ inc hl
+ dec C
+ jr nz,TEST$SUB1
+ xor A
+ ret
+
+
+SUB$FCB: defb '$$$ SUB'
+
+
+DELETE$SUB:
+
+ call GETDPTRA
+ call TEST$SUB
+ ld C,0
+ ret nz
+ ;JMP SET$SUB$FLAG
+
+SET$SUB$FLAG:
+
+ ld a,(CURDSK)
+ or A
+ ret nz
+ ld hl,SUB$FLAG
+ ld (hl),C
+ ret
+
+rename:
+;rename the file described by the first half of
+;the currently addressed file control block. the
+;new name is contained in the last half of the
+;currently addressed file conrol block. the file
+;name and type are changed, but the reel number
+;is ignored. the user number is identical
+
+ call check$write ;may be write protected
+
+;search up to the extent field
+
+ call RESELECT
+ call SEARCH$EXTNUM
+
+;copy position 0
+
+ ld hl,(info)
+ ld A,(hl) ;HL=.fcb(0), A=fcb(0)
+ ld de,dskmap
+ add hl,de ;HL=.fcb(dskmap)
+ ld (hl),A ;fcb(dskmap)=fcb(0)
+
+;assume the same disk drive for new named file
+rename0:
+
+ jð z,COPY$DIRLOÃ ;stoð aô enä oæ dir
+ call DELETE$SUB
+
+;not end of directory, rename next element
+
+ call check$rodir ;may be read-only file
+ ld C,dskmap
+ ld E,extnum
+ call copy$dir
+
+;element renamed, move to next
+
+ call searchn
+ jr rename0
+
+indicators:
+;set file indicators for current fcb
+
+ call RESELECT
+ call SEARCH$EXTNUM ;through file type
+
+indic0:
+
+ jp z,COPY$DIRLOC ;stop at end of dir
+
+;not end of directory, continue to change
+
+ ld C,0
+ ld E,extnum ;copy name
+ call copy$dir
+ call searchn
+ jr indic0
+
+open:
+;search for the directory entry, copy to fcb
+
+ call SEARCH$NAMLEN
+
+OPEN1:
+
+ ret z ;return with lret=255 if end
+
+;not end of directory, copy fcb information
+open$copy:
+;(referenced below to copy fcb info)
+
+ call getexta
+ ld A,(hl)
+ push af
+ push hl ;save extent#
+ call getdptra
+ ex de,hl ;DE = .buff(dptr)
+ ld hl,(info) ;HL=.fcb(0)
+ ld C,nxtrec ;length of move operation
+ push de ;save .buff(dptr)
+ call move ;from .buff(dptr) to .fcb(0)
+
+;note that entire fcb is copied, including indicators
+
+ call setfwf ;sets file write flag
+ pop de
+ ld hl,extnum
+ add hl,de ;HL=.buff(dptr+extnum)
+ ld C,(hl) ;C = directory extent number
+ ld hl,reccnt
+ add hl,de ;HL=.buff(dptr+reccnt)
+ ld B,(hl) ;B holds directory record count
+ pop hl
+ pop af
+ ld (hl),A ;restore extent number
+
+;HL = .user extent#, B = dir rec cnt, C = dir extent#
+;if user ext < dir ext then user := 128 records
+;if user ext = dir ext then user := dir records
+;if user ext > dir ext then user := 0 records
+
+ ld A,C
+ cp (hl)
+ ld A,B ;ready dir reccnt
+ jr z,open$rcnt ;if same, user gets dir reccnt
+ ld A,0
+ jr c,open$rcnt ;user is larger
+ ld A,128 ;directory is larger
+
+open$rcnt: ;A has record count to fill
+
+ ld hl,(info)
+ ld de,reccnt
+ add hl,de
+ ld (hl),A
+ ret
+
+mergezero:
+;HL = .fcb1(i), DE = .fcb2(i),
+;if fcb1(i) = 0 then fcb1(i) := fcb2(i)
+
+ ld A,(hl)
+ inc hl
+ or (hl)
+ dec hl
+ ret nz ;return if = 0000
+ ld a,(de)
+ ld (hl),A
+ inc de
+ inc hl ;low byte copied
+ ld a,(de)
+ ld (hl),A
+ dec de
+ dec hl ;back to input form
+ ret
+
+close:
+;locate the directory element and re-write it
+
+ xor A
+ ld (lret),a
+ ld (dcnt),a
+ ld (dcnt+1),a
+ call nowrite
+ ret nz ;skip close if r/o disk
+
+;check file write flag - 0 indicates written
+ call getmodnum ;fcb(modnum) in A
+ and fwfmsk
+ ret nz ;return if bit remains set
+
+ call SEARCH$NAMLEN
+ ret z ;return if not found
+
+;merge the disk map at info with that at buff(dptr)
+
+ ld bc,dskmap
+ call getdptra
+ add hl,bc
+ ex de,hl ;DE is .buff(dptr+16)
+ ld hl,(info)
+ add hl,bc ;DE=.buff(dptr+16), HL=.fcb(16)
+ ld C,fcblen-dskmap ;length of single byte dm
+
+merge0:
+
+ ld a,(single)
+ or A
+ jr z,merged ;skip to double
+
+;this is a single byte map
+;if fcb(i) = 0 then fcb(i) = buff(i)
+;if buff(i) = 0 then buff(i) = fcb(i)
+;if fcb(i) <> buff(i) then error
+
+ ld A,(hl)
+ or A
+ ld a,(de)
+ jr nz,fcbnzero
+
+;fcb(i) = 0
+
+ ld (hl),A ;fcb(i) = buff(i)
+
+fcbnzero:
+
+ or A
+ jr nz,buffnzero
+
+;buff(i) = 0
+
+ ld A,(hl)
+ ld (de),a ;buff(i)=fcb(i)
+
+buffnzero:
+
+ cp (hl)
+ jr nz,mergerr ;fcb(i) = buff(i)?
+ jr dmset ;if merge ok
+
+merged:
+;this is a double byte merge operation
+
+ call mergezero ;buff = fcb if buff 0000
+ ex de,hl
+ call mergezero
+ ex de,hl ;fcb = buff if fcb 0000
+
+;they should be identical at this point
+
+ ld a,(de)
+ cp (hl)
+ jr nz,mergerr ;low same?
+ inc de
+ inc hl ;to high byte
+ ld a,(de)
+ cp (hl)
+ jr nz,mergerr ;high same?
+
+;merge operation ok for this pair
+
+ dec C ;extra count for double byte
+
+dmset:
+
+ inc de
+ inc hl ;to next byte position
+ dec C
+ jr nz,merge0 ;for more
+
+;end of disk map merge, check record count
+;DE = .buff(dptr)+32, HL = .fcb(32)
+
+ ld bc,-(fcblen-extnum)
+ add hl,bc
+ ex de,hl
+ add hl,bc
+
+;DE = .fcb(extnum), HL = .buff(dptr+extnum)
+
+ ld a,(de) ;current user extent number
+
+;if fcb(ext) >= buff(fcb) then
+;buff(ext) := fcb(ext), buff(rec) := fcb(rec)
+
+ cp (hl)
+ jr c,endmerge
+
+;fcb extent number >= dir extent number
+
+ ld (hl),A ;buff(ext) = fcb(ext)
+
+;update directory record count field
+
+ ld bc,reccnt-extnum
+ add hl,bc
+ ex de,hl
+ add hl,bc
+
+;DE=.buff(reccnt), HL=.fcb(reccnt)
+
+ ld A,(hl)
+ ld (de),a ;buff(reccnt)=fcb(reccnt)
+
+endmerge:
+
+ ld A,true
+ ld (fcb$copied),a ;mark as copied
+ ld C,1
+ call SCANDM$B
+ call SETFWF
+ jp seek$copy ;ok to "wrdir" here - 1.4 compat
+ ;ret
+
+mergerr:
+;elements did not merge correctly
+
+ ld hl,lret
+ dec (hl) ;=255 non zero flag set
+ ret
+
+make:
+;create a new file by creating a directory entry
+;then opening the file
+
+ call check$write ;may be write protected
+ ld hl,(info)
+ push hl ;save fcb address, look for e5
+ ld hl,efcb
+ ld (info),hl ;info = .empty
+ ld C,1
+ call search ;length 1 match on empty entry
+ pop hl ;recall info address
+ ld (info),hl ;in case we return here
+ ret z ;return with error condition 255 if not found
+ ex de,hl ;DE = info address
+
+;clear the remainder of the fcb
+
+ ld hl,namlen
+ add hl,de ;HL=.fcb(namlen)
+ ld C,fcblen-namlen ;number of bytes to fill
+ xor A ;clear accumulator to 00 for fill
+
+make0:
+
+ ld (hl),A
+ inc hl
+ dec C
+ jr nz,make0
+ ld hl,ubytes
+ add hl,de ;HL = .fcb(ubytes)
+ ld (hl),A ;fcb(ubytes) = 0
+ call setcdr ;may have extended the directory
+
+;now copy entry to the directory
+
+ call copy$fcb
+
+;and set the file write flag to "1"
+
+ jp setfwf
+ ;ret
+
+open$reel:
+;close the current extent, and open the next one
+;if possible. RMF is true if in read mode
+
+ xor A
+ ld (fcb$copied),a ;set true if actually copied
+ call close ;close current extent
+
+;lret remains at enddir if we cannot open the next ext
+
+ ld a,(LRET)
+ inc A
+ ret z ;return if end
+
+;increment extent number
+
+ ld hl,(info)
+ ld bc,extnum
+ add hl,bc ;HL=.fcb(extnum)
+ ld A,(hl)
+ inc A
+ and maxext
+ ld (hl),A ;fcb(extnum)=++1
+ jr z,open$mod ;move to next module if zero
+
+;may be in the same extent group
+
+ ld B,A
+ ld a,(extmsk)
+ and B
+
+;if result is zero, then not in the same group
+
+ ld hl,fcb$copied ;true if the fcb was copied to directory
+ and (hl) ;produces a 00 in accumulator if not written
+ jr z,open$reel0 ;go to next physical extent
+
+;result is non zero, so we must be in same logical ext
+
+ jr open$reel1 ;to copy fcb information
+
+open$mod:
+;extent number overflow, go to next module
+
+ ld bc,modnum-extnum
+ add hl,bc ;HL=.fcb(modnum)
+ inc (hl) ;fcb(modnum)=++1
+
+;module number incremented, check for overflow
+
+ ld A,(hl)
+ and maxmod ;mask high order bits
+ jr z,open$r$err ;cannot overflow to zero
+
+;otherwise, ok to continue with new module
+open$reel0:
+
+ call SEARCH$NAMLEN ;next extent found?
+ jr nz,OPEN$REEL1
+
+;end of file encountered
+
+ ld a,(rmf)
+ inc A ;0ffh becomes 00 if read
+ jr z,open$r$err ;sets lret = 1
+
+;try to extend the current file
+
+ call make
+
+;cannot be end of directory
+
+ call end$of$dir
+ jr z,open$r$err ;with lret = 1
+
+ jr open$reel2
+
+open$reel1:
+;not end of file, open
+
+ call open$copy
+
+open$reel2:
+
+ call getfcb ;set parameters
+ xor A
+ jp sta$ret ;ret with lret = 0
+
+open$r$err:
+;cannot move to next extent of this file
+
+ call setlret1 ;lret = 1
+ jp setfwf ;ensure that it will not be closed
+ ;ret
+
+seqdiskread:
+
+ call RESELECTX
+
+diskread: ;(may enter from seqdiskread)
+
+ ld A,true
+ ld (rmf),a ;read mode flag = true (open$reel)
+
+;read the next record from the current fcb
+
+ call getfcb ;sets parameters for the read
+ ld a,(vrecord)
+ ld hl,rcount
+ cp (hl) ;vrecord-rcount
+
+;skip if rcount > vrecord
+
+ jr c,recordok
+
+;not enough records in the extent
+;record count must be 128 to continue
+
+ cp 128 ;vrecord = 128?
+ jr nz,diskeof ;skip if vrecord<>128
+
+ call open$reel ;go to next extent if so
+ xor A
+ ld (vrecord),a ;vrecord=00
+
+
+;now check for open ok
+
+ ld a,(lret)
+ or A
+ jr nz,diskeof ;stop at eof
+
+recordok:
+;arrive with fcb addressing a record to read
+
+ call index
+
+;error 2 if reading unwritten data
+;(returns 1 to be compatible with 1.4)
+
+ jr z,diskeof
+
+;record has been allocated, read it
+
+ call atran ;arecord now a disk address
+ call seek ;to proper track,sector
+ call rdbuff ;to dma address
+ jp setfcb ;replace parameter
+ ;ret
+
+diskeof:
+
+ jp setlret1 ;lret = 1
+ ;ret
+
+seqdiskwrite:
+
+ call RESELECTX
+
+diskwrite: ;(may enter here from seqdiskwrite above)
+
+ ld A,false
+ ld (rmf),a ;read mode flag
+
+;write record to currently selected file
+
+ call check$write ;in case write protected
+ ld hl,(info) ;HL = .fcb(0)
+ call check$rofile ;may be a read-only file
+ call GETMODNUM
+ and 40H
+ jp nz,ROF$ERROR
+ call getfcb ;to set local parameters
+ ld a,(vrecord)
+ cp lstrec+1 ;vrecord-128
+
+;skip if vrecord > lstrec
+;vrecord = 128, cannot open next extent
+ jp nc,setlret1 ;lret=1
+
+diskwr0:
+;can write the next record, so continue
+
+ call index
+ ld C,0 ;marked as normal write operation for wrbuff
+ jr nz,diskwr1
+
+;not allocated
+;the argument to getblock is the starting
+;position for the disk search, and should be
+;the last allocated block for this file, or
+;the value 0 if no space has been allocated
+
+ call dm$position
+ ld (dminx),a ;save for later
+ ld bc,0000h ;may use block zero
+ or A
+ jr z,nopblock ;skip if no previous block
+
+;previous block exists at A
+
+ ld C,A
+ dec bc ;previous block # in BC
+ call getdm ;previous block # to HL
+ ld B,H
+ ld C,L ;BC=prev block#
+
+nopblock:
+;BC = 0000, or previous block #
+
+ call get$block ;block # to HL
+
+;arrive here with block# or zero
+
+ ld A,L
+ or H
+ jr nz,blockok
+
+;cannot find a block to allocate
+
+ ld A,2
+ jp sta$ret ;lret=2
+
+blockok:
+;allocated block number is in HL
+
+ ld (arecord),hl
+ ex de,hl ;block number to DE
+ ld hl,(info)
+ ld bc,dskmap
+ add hl,bc ;HL=.fcb(dskmap)
+ ld a,(single)
+ or A ;set flags for single byte dm
+ ld a,(dminx) ;recall dm index
+ jr z,allocwd ;skip if allocating word
+
+;allocating a byte value
+
+ call addh
+ ld (hl),E ;single byte alloc
+ jr diskwru ;to continue
+
+allocwd:
+;allocate a word value
+
+ ld C,A
+ ld B,0 ;double(dminx)
+ add hl,bc
+ add hl,bc ;HL=.fcb(dminx*2)
+ ld (hl),E
+ inc hl
+ ld (hl),D ;double wd
+
+diskwru:
+;disk write to previously unallocated block
+
+ ld C,2 ;marked as unallocated write
+
+diskwr1:
+;continue the write operation if no allocation error
+;C = 0 if normal write, 2 if to prev unalloc block
+
+ ld a,(lret)
+ or A
+ ret nz ;stop if non zero returned value
+ push bc ;save write flag
+ call atran ;arecord set
+ ld a,(FX)
+ cp 40
+ jr nz,diskwr11
+ pop bc
+ push bc
+ ld A,C
+ dec A
+ dec A
+ jr nz,diskwr11 ;old allocation
+ push hl ;arecord in hl ret from atran
+ ld hl,(buffa)
+ ld D,A ;zero buffa & fill
+
+fill0:
+
+ ld (hl),A
+ inc hl
+ inc D
+ jp p,fill0
+ call setdir
+ ld hl,(arecord1)
+ ld C,2
+
+fill1:
+
+ ld (arecord),hl
+ push bc
+ call seek
+ pop bc
+ call wrbuff ;write fill record
+ ld hl,(arecord)
+
+;restore last record
+
+ ld C,0 ;change allocate flag
+ ld a,(blkmsk)
+ ld B,A
+ and L
+ cp B
+ inc hl
+ jr nz,fill1 ;cont until cluster is zeroed
+ pop hl
+ ld (arecord),hl
+ call setdata
+ call SEEK
+ jr DISKWR12
+
+diskwr11:
+
+ call seek ;to proper file position
+ pop bc
+ push bc ;restore/save write flag (C=2 if new block)
+ ld a,(ARECORD)
+ ld hl,BLKMSK
+ and (hl)
+ jr z,DISKWR13
+
+DISKWR12:
+
+ ld C,0
+
+DISKWR13:
+
+ call wrbuff ;written to disk
+ pop bc ;C = 2 if a new block was allocated, 0 if not
+
+;increment record count if rcount<=vrecord
+
+ ld a,(vrecord)
+ ld hl,rcount
+ cp (hl) ;vrecord-rcount
+ jr c,diskwr2
+
+;rcount <= vrecord
+
+ ld (hl),A
+ inc (hl) ;rcount = vrecord+1
+ ld C,2 ;mark as record count incremented
+
+diskwr2:
+;A has vrecord, C=2 if new block or new record#
+
+ dec C
+ dec C
+ jr nz,noupdate
+ push af ;save vrecord value
+ call getmodnum ;HL=.fcb(modnum), A=fcb(modnum)
+
+;reset the file write flag to mark as written fcb
+
+ and (not fwfmsk) and 0ffh ;bit reset
+ ld (hl),A ;fcb(modnum) = fcb(modnum) and 7fh
+ pop af ;restore vrecord
+
+noupdate:
+;check for end of extent, if found attempt to open
+;next extent in preparation for next write
+
+ cp lstrec ;vrecord=lstrec?
+ jr nz,diskwr3 ;skip if not
+
+;may be random access write, if so we are done
+;change next
+
+ ld a,(FX)
+ cp 22
+ jr nc,DISKWR3 ;skip next extent open op
+
+;update current fcb before going to next extent
+
+ call setfcb
+ call open$reel ;rmf=false
+
+;vrecord remains at lstrec causing eof if
+;no more directory space is available
+
+ ld hl,lret
+ ld A,(hl)
+ or A
+ jr nz,nospace
+
+;space available, set vrecord=255
+ dec A
+ ld (vrecord),a ;goes to 00 next time
+
+nospace:
+
+ ld (hl),0 ;lret = 00 for returned value
+
+diskwr3:
+
+ jp setfcb ;replace parameters
+ ;ret
+
+rseek:
+;random access seek operation, C=0ffh if read mode
+;fcb is assumed to address an active file control block
+;(MODNUM HAS BEEN SET TO 1010$0000b IF PREVIOUS BAD SEEK)
+
+ push bc ;save r/w flag
+ ld de,(info) ;DE will hold base of fcb
+ ld hl,ranrec
+ add hl,de ;HL=.fcb(ranrec)
+ ld A,(hl)
+ and 7fh
+ push af ;record number
+ ld A,(hl)
+ rla ;cy=lsb of extent#
+ inc hl
+ ld A,(hl)
+ rla
+ and 11111b ;A=ext#
+ ld C,A ;C holds extent number, record stacked
+ ld A,(hl)
+ rra
+ rra
+ rra
+ rra
+ and 1111b ;mod#
+ ld B,A ;B holds module#, C holds ext#
+ pop af ;recall sought record #
+
+;check to insure that high byte of ran rec = 00
+
+ inc hl
+ ld L,(hl) ;l=high byte (must be 00)
+ inc L
+ dec L
+ ld L,6 ;zero flag, l=6
+
+;produce error 6, seek past physical eod
+
+ jr nz,seekerr
+
+;otherwise, high byte = 0, A = sought record
+
+ ld hl,nxtrec
+ add hl,de ;HL = .fcb(nxtrec)
+ ld (hl),A ;sought rec# stored away
+
+;arrive here with B=mod#, C=ext#, DE=.fcb, rec stored
+;the r/w flag is still stacked. compare fcb values
+
+ ld hl,extnum
+ add hl,de
+ ld A,C ;A=seek ext#
+ sub (hl)
+ jr nz,ranclose ;tests for = extents
+
+;extents match, check mod#
+
+ ld hl,modnum
+ add hl,de
+ ld A,B ;B=seek mod#
+
+;could be overflow at eof, producing module#
+;of 90H or 10H, so compare all but fwf
+
+ sub (hl)
+ and 3FH
+ jr z,seekok ;same?
+
+ranclose:
+
+ push bc
+ push de ;save seek mod#,ext#, .fcb
+ call close ;current extent closed
+ pop de
+ pop bc ;recall parameters and fill
+ ld L,3 ;cannot close error #3
+ ld a,(lret)
+ inc A
+ jr z,badseek
+ ld hl,extnum
+ add hl,de
+ ld (hl),C ;fcb(extnum)=ext#
+ ld hl,modnum
+ add hl,de
+ ld (hl),B ;fcb(modnum)=mod#
+ call open ;is the file present?
+ ld a,(lret)
+ inc A
+ jr nz,seekok ;open successful?
+
+;cannot open the file, read mode?
+
+ pop bc ;r/w flag to c (=0ffh if read)
+ push bc ;everyone expects this item stacked
+ ld L,4 ;seek to unwritten extent #4
+ inc C ;becomes 00 if read operation
+ jr z,badseek ;skip to error if read operation
+
+;write operation, make new extent
+
+ call make
+ ld L,5 ;cannot create new extent #5
+ ld a,(lret)
+ inc A
+ jr z,badseek ;no dir space
+
+;file make operation successful
+seekok:
+
+ pop bc ;discard r/w flag
+ xor A
+ jp sta$ret ;with zero set
+
+badseek:
+;fcb no longer contains a valid fcb, mark
+;with 1010$00000B IN MODNUM FIELD so that it
+;appears as overflow with file write flag set
+
+ push hl ;save error flag
+ call getmodnum ;HL = .modnum
+ ld (hl),10100000B
+ pop hl ;and drop through
+
+seekerr:
+
+ pop bc ;discard r/w flag
+ ld A,L
+ ld (lret),a ;lret=#, nonzero
+
+;setfwf returns non-zero accumulator for err
+
+ jp setfwf ;flag set, so subsequent close ok
+ ;ret
+
+randiskread:
+;random disk read operation
+
+ call RESELECTX
+ ld C,true ;marked as read operation
+ call rseek
+ call z,diskread ;if seek successful
+ ret
+
+randiskwrite:
+;random disk write operation
+
+ call RESELECTX
+ ld C,false ;marked as write operation
+ call rseek
+ call z,diskwrite ;if seek successful
+ ret
+
+compute$rr:
+;compute random record position for getfilesize/setrandom
+
+ ex de,hl
+ add hl,de
+
+;DE=.buf(dptr) or .fcb(0), HL = .f(nxtrec/reccnt)
+
+ ld C,(hl)
+ ld B,0 ;BC = 0000 0000 ?rrr rrrr
+ ld hl,extnum
+ add hl,de
+ ld A,(hl)
+ rrca
+ and 80h ;A=e000 0000
+ add a,C
+ ld C,A
+ ld A,0
+ adc a,B
+ ld B,A
+
+;BC = 0000 000? errrr rrrr
+
+ ld A,(hl)
+ rrca
+ and 0fh
+ add a,B
+ ld B,A
+
+;BC = 000? eeee errrr rrrr
+
+ ld hl,modnum
+ add hl,de
+ ld A,(hl) ;A=XXX? mmmm
+ add a,A
+ add a,A
+ add a,A
+ add a,A ;cy=? A=mmmm 0000
+ push af
+ add a,B
+ ld B,A
+
+;cy=?, BC = mmmm eeee errr rrrr
+
+ push af ;possible second carry
+ pop hl ;cy = lsb of L
+ ld A,L ;cy = lsb of A
+ pop hl ;cy = lsb of L
+ or L ;cy/cy = lsb of A
+ and 1 ;A = 0000 000? possible carry-out
+ ret
+
+getfilesize:
+;compute logical file size for current fcb
+;zero the receiving ranrec field
+
+ call RESELECT
+ ld hl,(info)
+ ld de,ranrec
+ add hl,de
+ push hl ;save position
+ ld (hl),D
+ inc hl
+ ld (hl),D
+ inc hl
+ ld (hl),D ;=00 00 00
+ call SEARCH$EXTNUM
+
+getsize:
+
+ jr z,SETSIZE
+
+;current fcb addressed by dptr
+
+ call getdptra
+ ld de,reccnt ;ready for compute size
+ call compute$rr
+
+;A=0000 000? BC = mmmm eeee errr rrrr
+;compare with memory, larger?
+
+ pop hl
+ push hl ;recall, replace .fcb(ranrec)
+ ld E,A ;save cy
+ ld A,C
+ sub (hl)
+ inc hl ;ls byte
+ ld A,B
+ sbc a,(hl)
+ inc hl ;middle byte
+ ld A,E
+ sbc a,(hl) ;carry if .fcb(ranrec) > directory
+ jr c,getnextsize ;for another try
+
+;fcb is less or equal, fill from directory
+
+ ld (hl),E
+ dec hl
+ ld (hl),B
+ dec hl
+ ld (hl),C
+
+getnextsize:
+
+ call searchn
+ jr getsize
+
+setsize:
+
+ pop hl ;discard .fcb(ranrec)
+ ret
+
+setrandom:
+;set random record from the current file control block
+
+ ld hl,(info)
+ ld de,nxtrec ;ready params for computesize
+ call compute$rr ;DE=info, A=cy, BC=mmmm eeee errr rrrr
+ ld hl,ranrec
+ add hl,de ;HL = .fcb(ranrec)
+ ld (hl),C
+ inc hl
+ ld (hl),B
+ inc hl
+ ld (hl),A ;to ranrec
+ ret
+
+TMPSELECT:
+
+ ld hl,SELDSK
+ ld (hl),E
+
+CURSELECT:
+
+ ld a,(SELDSK)
+ ld hl,CURDSK
+ cp (hl)
+ jr nz,SELECT
+ cp 0FFH
+ ret nz
+
+select:
+;select disk info for subsequent input or output ops
+
+ ld (hl),A
+ ld D,A
+ ld hl,(DLOG)
+ call TEST$VECTOR
+ ld E,A
+ push de
+ call selectdisk
+ pop hl ;recall dlog vector
+ jp nc,SEL$ERROR ;returns with CARRY SET if select ok
+
+;is the disk logged in?
+
+ dec L
+ ret z ;return if bit is set
+
+;disk not logged in, set bit and initialize
+
+ call INITIALIZE
+ ld hl,(LSN$ADD)
+ ld A,(hl)
+ and 1
+ push af
+ add a,(hl)
+ ld (hl),A
+ pop af
+ call nz,SET$RLOG
+ jp SET$DLOG
+ ;ret
+
+RESELECTX:
+
+ ld hl,CHECK$FCB
+ push hl
+
+reselect:
+;check current fcb to see if reselection necessary
+
+ ld A,true
+ ld (resel),a ;mark possible reselect
+ ld hl,(info)
+ ld A,(hl) ;drive select code
+ ld (FCBDSK),a
+ and 11111b ;non zero is auto drive select
+ dec A ;drive code normalized to 0..30, or 255
+ jp m,noselect ; SCC 22 Apr 84
+
+ ld (SELDSK),a
+
+noselect:
+
+ call CURSELECT
+
+;set user code
+
+ ld a,(usrcode) ;0...15
+ ld hl,(info)
+ ld (hl),A
+
+NOSELECT0:
+
+ call TST$LOG$FXS
+ ret nz
+ call FUNC48
+
+NOSELECT1:
+
+ ld C,0FFH
+ jp ?discd
+
+subttl Individual Function Handlers
+func12:
+;return version number
+
+ ld A,dvers
+ jp sta$ret ;lret = dvers (high = 00)
+ ;ret ;jmp goback
+page
+func13:
+;reset disk system - initialize to disk 0
+
+ ld hl,0
+ ld (rodsk),hl
+ ld (dlog),hl
+ xor A
+ ld (ACTDSK),a
+ dec A
+ ld (CURDSK),a
+
+;note that usrcode remains unchanged
+
+ ld hl,tbuff
+ ld (dmaad),hl ;dmaad = tbuff
+ call SETDATA ;to data dma address
+ jr NOSELECT1
+ ;ret ;jmp goback
+page
+FUNC14:
+
+ call TMPSELECT
+ ld a,(SELDSK)
+ ld (ACTDSK),a
+ ret
+
+page
+func15:
+;open file
+
+ call clrmodnum ;clear the module number
+ call reselect
+ call OPEN
+ call OPENX
+ ld a,(DIRLOC)
+ inc A
+ ret z
+ ld hl,(SDCNT)
+ ld A,L
+ and 0FCH
+ ld L,A
+ dec hl
+ ld (DCNT),hl
+ ld hl,(INFO)
+ ld (hl),0
+ call SEARCHN
+ call OPEN1
+ call OPENX
+ ret
+
+OPENX:
+
+ call END$OF$DIR
+ ret z
+ pop hl
+ ld a,(USRCODE)
+ ld hl,(INFO)
+ cp (hl)
+ jr z,OPENX1
+
+ ld de,10 ;test file attribute t2'
+ add hl,de ;for sys | dir status
+ ld A,(hl)
+ and 80H
+ jr nz,openx2 ;system, allow open SCC 22 Apr 84
+
+ inc hl ;bump ptr to ext field SCC 22 Apr 84
+ inc hl ; SCC 22 Apr 84
+ ld (hl),a ;zero remainder of FCB SCC 22 Apr 84
+ ld d,h ; SCC 22 Apr 84
+ ld e,l ; SCC 22 Apr 84
+ inc de ; SCC 22 Apr 84
+ ld bc,19 ; SCC 22 Apr 84
+ ldir ; SCC 22 Apr 84
+ jp lret$eq$FF ;flag open failure SCC 22 Apr 84
+
+openx2: ; SCC 22 Apr 84
+ ld de,4
+ add hl,de
+ ld A,(hl)
+ or 40H
+ ld (hl),A
+
+OPENX1:
+
+ ld de,OLOG
+ call SET$CDISK
+ jp SET$LSN
+ ;ret ;jmp goback
+page
+func16:
+;close file
+
+ call reselect
+ call CLOSE
+ jp SET$LSN
+ ;ret ;jmp goback
+page
+func17:
+;search for first occurence of a file
+
+ ex de,hl
+ xor A
+
+CSEARCH:
+
+ push af
+ ld A,(hl)
+ cp '?'
+ jr nz,CSEARCH1
+ call CURSELECT
+ call NOSELECT0
+ ld C,0
+ jr CSEARCH2
+
+CSEARCH1:
+
+ call GETEXTA
+ ld A,(hl)
+ cp '?'
+ call nz,CLRMODNUM
+ call RESELECT
+ ld C,NAMLEN
+
+CSEARCH2:
+
+ pop af
+ ld hl,DIR$TO$USER
+ push hl
+ jp z,SEARCH
+ jp SEARCHN
+page
+
+func18:
+;search for next occurence of a file
+
+ ld hl,(SEARCHA)
+ ld (INFO),hl
+ or 1
+ jr CSEARCH
+page
+FUNC19 equ DELETE
+;delete a file
+
+FUNC20 equ SEQDISKREAD
+;read a file
+
+FUNC21 equ SEQDISKWRITE
+;write a file
+page
+
+func22:
+;make a file
+
+ call clrmodnum
+ call reselect
+ call MAKE
+ jr OPENX1
+ ;ret ;jmp goback
+
+FUNC23 equ RENAME
+;rename a file
+
+func24:
+;return the login vector
+
+ ld hl,(dlog)
+ jr sthl$ret
+ ;ret ;jmp goback
+
+func25:
+;return selected disk number
+
+ ld a,(SELDSK)
+ jp sta$ret
+ ;ret ;jmp goback
+
+func26:
+;set the subsequent dma address to info
+
+ ex de,hl ;was lhld info
+ ld (dmaad),hl ;dmaad = info
+ jp setdata ;to data dma address
+ ;ret ;jmp goback
+
+func27:
+;return the login vector address
+
+ call CURSELECT
+ ld hl,(alloca)
+ jr sthl$ret
+ ;ret ;jmp goback
+
+func28 equ set$ro
+;write protect current disk
+
+ ;ret ;jmp goback
+
+func29:
+;return r/o bit vector
+
+ ld hl,(rodsk)
+ jr sthl$ret
+ ;ret ;jmp goback
+
+FUNC30 equ INDICATORS
+;set file indicators
+
+func31:
+;return address of disk parameter block
+
+ call CURSELECT
+ ld hl,(dpbaddr)
+
+sthl$ret:
+
+ ld (aret),hl
+ ret ;jmp goback
+
+func32:
+;GET/SET USER CODE
+
+ ld hl,USRCODE
+
+;DOES REG E = FFH?
+
+ ld A,E
+ inc A
+ ld A,(hl)
+ jp z,STA$RET ; YES - RETURN USER
+
+;SET USER NUMBER
+
+ ld A,E
+ and 0FH
+ ld (hl),A
+ ret
+
+FUNC33 equ RANDISKREAD
+;random disk read operation
+
+FUNC34 equ RANDISKWRITE
+;random disk write operation
+
+FUNC35 equ GETFILESIZE
+;return file size (0-65536)
+
+func36 equ setrandom
+;set random record
+ ;ret ;jmp goback
+
+func37:
+;drive reset
+
+ ex de,hl
+
+RESET37X:
+
+ push hl
+ ld A,L
+ cpl
+ ld E,A
+ ld A,H
+ cpl
+ ld hl,(dlog)
+ and H
+ ld D,A
+ ld A,L
+ and E
+ ld E,A
+ ld hl,(rodsk)
+ ex de,hl
+ ld (dlog),hl
+ ld A,L
+ and E
+ ld L,A
+ ld A,H
+ and D
+ ld H,A
+ ld (rodsk),hl
+ ld A,0FFH
+ ld (CURDSK),a
+ ld (SCAN$FLAG),a
+ pop hl
+ jp SD$0
+
+func38 equ func$ret
+
+func39 equ func$ret
+
+FUNC40 equ RANDISKWRITE
+
+FUNC45:
+;SET BDOS ERROR MODE
+
+ ld A,E
+ ld (ERRMODE),a
+ ret
+
+FUNC48:
+;FLUSH BUFFERS
+
+ call ?flush
+ jp DIOCOMP
+subttl BDOS call termination
+
+GOBACK0:
+
+ ld hl,0FFFFH
+ ld (ARET),hl
+
+goback:
+;arrive here at end of processing to return to user
+
+ ld a,(resel)
+ or A
+ jr z,retmon
+
+;reselection may have taken place
+
+ ld hl,(INFO)
+ ld a,(FCBDSK)
+ ld (hl),A
+
+;return from the disk monitor
+retmon:
+
+ ld sp,(entsp) ;user stack restored
+ ld hl,(aret)
+ ld A,L
+ ld B,H ;BA = HL = aret
+ ret
+subttl Initialized Data Areas
+
+efcb:
+
+ defb empty ;0e5=available dir entry
+
+LOG$FXS:
+
+ defb 15,16,17,19,22,23,30,35,0
+
+RW$FXS:
+
+ defb 20,21,33,34,40,0
+
+SC$FXS:
+
+ defb 16,18
+subttl CPMERR - console error message routine
+;*****************************************************************
+;*****************************************************************
+;** **
+;** S I M P L E C P / M **
+;** **
+;** S t a n d a r d E r r o r R o u t i n e **
+;** **
+;*****************************************************************
+;*****************************************************************
+
+cpmerr: ; c = error #
+
+ ld B,0
+ dec C
+ ld hl,errtbl
+ add hl,bc
+ add hl,bc
+ ld E,(hl)
+ inc hl
+ ld D,(hl)
+
+;stack message address, advance to new line
+ push de
+ call crlf
+
+;print error prefix
+ ld bc,dskmsg
+ call print
+
+;identify drive
+ ld a,(seldsk)
+ add a,'A'
+ ld C,A
+ call conout
+
+;print colon and space
+ ld bc,colon
+ call print
+
+;print error message tail
+ pop bc
+ jp print
+
+errtbl: defw permsg,rodmsg,rofmsg,selmsg
+
+dskmsg: defb 'CP/M Error On $'
+colon: defb ': $'
+permsg: defb 'Disk I/O$'
+selmsg: defb 'Invalid Drive$'
+rofmsg: defb 'Read/Only File$'
+rodmsg: defb 'Read/Only Disk$'
+
+;------------------------------------------------------------------------------
+
+subttl Data Segment
+
+ if standard
+ dseg
+ endif
+
+ public DLOG
+ public RODSK
+ public FX
+ public ERRMODE
+ public LISTCP
+ public KBCHAR
+ public SUB$FLAG
+ public INFO
+ public ARET
+ public ARECORD
+ public SELDSK
+ public CONMODE
+ public out$delim
+
+BDOS$DT equ $
+
+ if data_low
+?bdos equ $+6
+ defs front_size
+ endif
+
+dlog: defs WORD ;logged-in disks
+rodsk: defs WORD ;read only disk vector
+dmaad: defs WORD ;initial dma address
+
+;
+; curtrka - alloca are set upon disk select
+; (data must be adjacent, do not insert variables)
+; (address of translate vector, not used)
+;
+
+cdrmaxa: defs word ;pointer to cur dir max value
+curtrka: defs word ;current track address
+curreca: defs word ;current record address
+buffa: defs word ;pointer to directory dma address
+dpbaddr: defs word ;current disk parameter block address
+checka: defs word ;current checksum vector address
+alloca: defs word ;current allocation vector address
+
+addlist equ $-buffa ;address list size
+
+;
+; sectpt - offset obtained from disk parm block at dpbaddr
+; (data must be adjacent, do not insert variables)
+;
+
+sectpt: defs word ;sectors per track
+blkshf: defs byte ;block shift factor
+blkmsk: defs byte ;block mask
+extmsk: defs byte ;extent mask
+maxall: defs word ;maximum allocation number
+dirmax: defs word ;largest directory number
+dirblk: defs word ;reserved allocation bits for directory
+chksiz: defs word ;size of checksum vector
+offset: defs word ;offset tracks at beginning
+
+dpblist equ $-sectpt ;size of area
+
+;
+; local variables
+;
+
+tranv: defs word ;address of translate vector
+fcb$copied: defs byte ;set true if copy$fcb called
+rmf: defs byte ;read mode flag for open$reel
+dirloc: defs byte ;directory flag in rename, etc.
+dminx: defs byte ;local for diskwrite
+searchl: defs byte ;search length
+searcha: defs word ;search address
+single: defs byte ;set true if single byte allocation map
+fcbdsk: defs byte ;disk named in fcb
+rcount: defs byte ;record count in current fcb
+extval: defs byte ;extent number and extmsk
+vrecord: defs BYTE ;current virtual record
+arecord: defs word ;current actual record
+arecord1: defs word ;current actual block# * blkmsk
+
+;
+; local variables for directory access
+;
+
+dptr: defs byte ;directory pointer 0,1,2,3
+dcnt: defs word ;directory counter 0,1,...,dirmax
+
+entsp: defs word ;entry stack pointer
+ defs ssize*2 ;stack size
+
+lstack:
+
+info: defs word ;information address
+aret: defs word ;address value to return
+lret equ aret ;low(aret)
+
+; RESEL & RELOG ARE INITIALIZED AS A PAIR AT BDOS ENTRY
+
+resel: defs byte ;reselection flag
+RELOG: defs BYTE ;RELOG DRIVE SWITCH
+save$pos: defs BYTE ;SAVE BEGINNING FUNCTION 10 BUFF POS
+LSN$ADD: defs WORD ;LOGIN SEQ # ADDRESS
+LSN$NS: defs 16 ;LOGIN SEQUENCE #S (1 PER DRIVE)
+SDCNT: defs WORD ;SAVE USER 0 DCNT FOR OPEN FX
+
+USER0$SEARCH: defs WORD ;USER 0 SEARCH FLAG FOR OPEN FX
+CURDSK: defs BYTE ;CURRENT DISK NUMBER
+ACTDSK: defs BYTE ;ACTUAL SELECTED DISK NUMBER
+SELDSK: defs BYTE ;CURRENTLY SELECTED DISK NUMBER
+
+OUT$DELIM: defs BYTE ;FUNCTION 9 (PRINT) DELIMITER
+
+; The following two variables are set to zero by the
+; CCP prior to passing control to a loaded transient program.
+
+OLOG: defs WORD ;FILE OPEN DRIVE VECTOR
+RLOG: defs WORD ;MEDIA CHANGE DRIVE VECTOR
+subttl Reinitialized data
+
+; The following variables are initialized to zero by the BDOS
+; warm start initialization routine (WS$INIT) and the
+; cold start initialization routine (CS$INIT)
+
+column: defs byte ;column position
+usrcode: defs byte ;current user number
+kbchar: defs byte ;initial key char = 00
+compcol: defs byte ;true if computing column position
+strtcol: defs byte ;starting column position after read
+
+FX: defs BYTE ;CURRENT BDOS FUNCTION NUMBER
+ERRMODE: defs BYTE ;BDOS ERROR MODE (NORMAL,RETURN,RET & DISPLAY)
+SCAN$FLAG: defs BYTE ;SCAN$DRIVE FLAG (FF=DRIVE RESET,0=WS$INIT)
+CONMODE: defs BYTE ;CONSOLE MODE (BIT 2 = RAW OUTPUT, BIT 4 = ESD)
+
+WS$INIT$SIZE equ $-COLUMN
+
+
+
+
+
+;
+; The following variables are initialized to zero by the BDOS
+; cold start initialization routine (CS$INIT)
+;
+
+listcp: defs byte ;listing toggle
+FX10FLG: defs BYTE ;CCP FUNCTION 10 (^C) FLAG
+SUB$FLAG: defs BYTE ;SUBMIT FLAG ($$$.SUB FILE ON A)
+SUBWORK: defs 20 ;CCP SUBMIT WORK AREA
+
+CS$INIT$SIZE equ $-COLUMN
+
+ cseg ;this code makes the code segment begin on a
+ ; page boundry
+LAST:
+ defb 0
+
+ org (((LAST-BASE)+255) AND 0FF00H) - 1
+ defb 0
+subttl BIOS access constants
+
+BIOS equ $
+
+bootf equ bios+3*0 ;cold boot function
+wbootf equ bios+3*1 ;warm boot function
+constf equ bios+3*2 ;console status function
+coninf equ bios+3*3 ;console input function
+conoutf equ bios+3*4 ;console output function
+listf equ bios+3*5 ;list output function
+punchf equ bios+3*6 ;punch output function
+readerf equ bios+3*7 ;reader input function
+homef equ bios+3*8 ;disk home function
+seldskf equ bios+3*9 ;select disk function
+settrkf equ bios+3*10 ;set track function
+setsecf equ bios+3*11 ;set sector function
+setdmaf equ bios+3*12 ;set dma function
+readf equ bios+3*13 ;read disk function
+writef equ bios+3*14 ;write disk function
+liststf equ bios+3*15 ;list status function
+sectran equ bios+3*16 ;sector translate
+
+ end
+
\ No newline at end of file
diff --git a/cpm/pcpm/CCP.MAC b/cpm/pcpm/CCP.MAC
new file mode 100644
index 0000000..0fb47a0
--- /dev/null
+++ b/cpm/pcpm/CCP.MAC
@@ -0,0 +1,1660 @@
+ title Console Command Processor (ccp), ver 2.0
+; assembly language version of the cp/m console command processor
+;
+; Personal CP/M version 1.0 May 1984
+;
+; COPYRIGHT (C) 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984
+; Digital Research
+; Box 579, Pacific Grove,
+; California, 93950
+;
+false equ 0000h
+true equ not false
+;
+;
+
+ cseg
+
+BASE equ $
+BDOSL equ BASE+800H
+SUBADDR equ BDOSL+09H
+ZEROADD equ BDOSL+0BH
+tran equ 100h
+tranm equ $
+ccploc equ $
+
+
+; ********************************************************
+; * base of ccp contains the following code/data *
+; * ccp: jmp ccpstart (start with command) *
+; * jmp ccpclear (start, clear command) *
+; * ccp+6 127 (max command length) *
+; * ccp+7 comlen (command length = 00) *
+; * ccp+8 ' ... ' (16 blanks) *
+; ********************************************************
+; * normal entry is at ccp, where the command line given *
+; * at ccp+8 is executed automatically (normally a null *
+; * command with comlen = 00). an initializing program *
+; * can be automatically loaded by storing the command *
+; * at ccp+8, with the command length at ccp+7. in this *
+; * case, the ccp executes the command before prompting *
+; * the console for input. note that the command is exe-*
+; * cuted on both warm and cold starts. when the command*
+; * line is initialized, a jump to "jmp ccpclear" dis- *
+; * ables the automatic command execution. *
+; ********************************************************
+
+ jp ccpstart ;start ccp with possible initial command
+
+ jp ccpclear ;clear the command buffer
+
+maxlen: defb 127 ;max buffer length
+comlen: defb 6 ;command length
+
+combuf:
+
+ defb 'VCCPLD ' ;8 character fill
+ defb ' ' ;8 character fill
+ defb 'COPYRIGHT (C) 1984, DIGITAL RESEARCH ' ; 38
+ defs 128-($-combuf)
+ ;total buffer length is 128 characters
+
+comaddr: defw combuf ;address of next to char to scan
+staddr: defs 2 ;starting address of current fillfcb request
+
+diska equ 0004h ;disk address for current disk
+bdos equ 0005h ;primary bdos entry point
+buff equ 0080h ;default buffer
+fcb equ 005ch ;default file control block
+
+rcharf equ 1 ;read character function
+pcharf equ 2 ;print character function
+pbuff equ 9 ;print buffer function
+rbuff equ 10 ;read buffer function
+breakf equ 11 ;break key function
+liftf equ 12 ;lift head function (no operation)
+initf equ 13 ;initialize bdos function
+self equ 14 ;select disk function
+openf equ 15 ;open file function
+closef equ 16 ;close file function
+searf equ 17 ;search for file function
+searnf equ 18 ;search for next file function
+delf equ 19 ;delete file function
+dreadf equ 20 ;disk read function
+dwritf equ 21 ;disk write function
+makef equ 22 ;file make function
+renf equ 23 ;rename file function
+logf equ 24 ;return login vector
+cself equ 25 ;return currently selected drive number
+dmaf equ 26 ;set dma address
+userf equ 32 ;set user number
+
+;
+; special fcb flags
+;
+
+rofile equ 9 ;read only file
+sysfile equ 10 ;system file flag
+
+;
+; special characters
+;
+
+cr equ 13 ;carriage return
+lf equ 10 ;line feed
+la equ 5fh ;left arrow
+eofile equ 1ah ;end of file
+
+;
+; utility procedures
+;
+
+printchar:
+
+ ld E,A
+ ld C,pcharf
+ jp bdos
+
+printbc:
+;print character, but save b,c registers
+
+ push bc
+ call printchar
+ pop bc
+ ret
+
+crlf:
+
+ ld A,cr
+ call printbc
+ ld A,lf
+ jr printbc
+
+blank:
+
+ ld A,' '
+ jr printbc
+Šprint:
+;print string starting at b,c until next 00 entry
+
+ push bc
+ call crlf
+ pop hl ;now print the string
+
+prin0:
+
+ ld A,(hl)
+ or A
+ ret z ;stop on 00
+ inc hl
+ push hl ;ready for next
+ call printchar
+ pop hl ;character printed
+ jr prin0 ;for another character
+
+initialize:
+
+ ld C,initf
+ jp bdos
+
+select:
+
+ ld E,A
+ ld C,self
+ jp bdos
+
+openc:
+;open comfcb
+
+ xor A
+ ld (comrec),a ;clear next record to read
+ ld de,comfcb
+
+open:
+;open the file given by d,e
+
+ ld C,openf
+
+bdos$inr:
+
+ call bdos
+ ld (dcnt),a
+ inc A
+ ret
+
+close:
+;close the file given by d,e
+
+ ld C,closef
+ jr bdos$inr
+
+search:
+;search for the file given by d,e
+
+ ld C,searf
+ jr bdos$inr
+
+searchn:
+;search for the next occurrence of the file given by d,e
+
+ ld C,searnf
+ jr bdos$inr
+
+searchcom:
+;search for comfcb file
+
+ ld de,comfcb
+ jr search
+
+delete:
+;delete the file given by d,e
+
+ ld C,delf
+ jp bdos
+
+bdos$cond:
+
+ call bdos
+ or A
+ ret
+
+diskread:
+;read the next record from the file given by d,e
+
+ ld C,dreadf
+ jr bdos$cond
+
+diskreadc:
+;read the comfcb file
+
+ ld de,comfcb
+ jr diskread
+
+diskwrite:
+;write the next record to the file given by d,e
+
+ ld C,dwritf
+ jr bdos$cond
+Šmake:
+;create the file given by d,e
+
+ ld C,makef
+ jr bdos$inr
+
+renam:
+;rename the file given by d,e
+
+ ld C,renf
+ jp bdos
+
+getuser:
+;return current user code in a
+
+ ld E,0ffh ;drop through to setuser
+
+setuser:
+
+ ld (USERNO),a
+ ld C,userf
+ jp bdos ;sets user number
+
+saveuser:
+;save user#/disk# before possible ^c or transient
+
+ call GETUSER
+ ld (USERNO),a
+ add a,A
+ add a,A
+ add a,A
+ add a,A ;rot left
+ ld hl,cdisk
+ or (hl) ;4b=user, 4b=disk
+ ld (diska),a ;stored away in memory for later
+ ret
+
+translate:
+;translate character in register a to upper case
+
+ cp 61h
+ ret c ;return if below lower case a
+ cp 7bh
+ ret nc ;return if above lower case z
+ and 5fh
+ ret ;translated to upper case
+
+COPY$SUBFCB:
+
+ ld hl,(SUBADDR)
+ inc hl
+ ld de,SUB$S1
+ ld B,21
+ or A
+ jr nz,COPY$SF1
+ ex de,hl
+
+COPY$SF1:
+
+ dec B
+ ret z
+ ld A,(hl)
+ ld (de),a
+ inc hl
+ inc de
+ jr COPY$SF1
+
+readcom:
+;read the next command into the command buffer
+;check for submit file
+
+ ld hl,(SUBADDR)
+ ld A,(hl)
+ or A
+ jr z,NOSUB
+ inc A
+ jr z,OPEN$SUB
+ call COPY$SUBFCB
+ jr READ$SUB
+
+OPEN$SUB:
+
+ push hl
+ ld de,SUBFCB
+ call OPEN
+ pop hl
+ ld (hl),0
+ jr z,NOSUB
+ inc (hl)
+
+READ$SUB:
+
+ call SETDMABUFF
+
+;change drives to open and read the file
+
+ ld a,(subrc)
+ dec A ;read last record(s) first
+ ld (subcr),a ;current record to read
+ ld de,subfcb
+ call diskread ;end of file if last record
+ jr nz,nosub
+Š;disk read is ok, transfer to combuf
+
+ ld de,comlen
+ ld hl,buff
+ ld B,128
+ call move0
+
+;line is transferred, close the file with a
+;deleted record
+
+ ld hl,SUBRC
+ dec (hl) ; ONE LESS RECORD
+ xor A
+ call COPY$SUBFCB
+
+;print to the 00
+
+ ld hl,combuf
+ call prin0
+ call break$key
+ jr z,noread
+ call del$sub
+ jp ccp ;break key depressed
+
+nosub:
+;no submit file
+
+ call del$sub
+
+;translate to upper case, store zero at end
+
+ call saveuser ;user # save in case control c
+ ld hl,(SUBADDR)
+ dec hl
+ ld (hl),0FFH
+ push hl
+ ld C,rbuff
+ ld de,maxlen
+ call bdos
+ pop hl
+ ld (hl),0
+
+noread:
+;enter here from submit file
+;set the last character to zero for later scans
+
+ ld hl,comlen
+ ld B,(hl) ;length is in b
+
+readcom0:
+
+ inc hl
+ ld A,B
+ or A ;end of scan?
+ jr z,readcom1
+ ld A,(hl) ;get character and translate
+ call translate
+ ld (hl),A
+ dec B
+ jr readcom0
+
+readcom1:
+;end of scan, h,l address end of command
+
+ ld (hl),A ;store a zero
+ ld hl,combuf
+ ld (comaddr),hl ;ready to scan to zero
+ ret
+
+break$key:
+;check for a character ready at the console
+
+ ld C,breakf
+ call bdos
+ or A
+ ret z
+ ld C,rcharf
+ call bdos ;character cleared
+ or A
+ ret
+
+cselect:
+;get the currently selected drive number to reg-a
+
+ ld C,cself
+ jp bdos
+
+setdmabuff:
+;set default buffer dma address
+
+ ld de,buff ;(drop through)
+
+setdma:
+;set dma address to d,e
+
+ ld C,dmaf
+ jp bdos
+
+del$sub:
+;delete the submit file, and set submit flag to false
+
+ ld hl,(SUBADDR)
+ ld A,(hl)
+ or A
+ ret z ;return if no sub file
+ ld (hl),0 ;submit flag is set to false
+ ld de,subfcb
+ jp delete
+
+comerr:
+;error in command string starting at position
+;'staddr' and ending with first delimiter
+
+ call crlf ;space to next line
+ ld hl,(staddr) ;h,l address first to print
+comerr0:
+;print characters until blank or zero
+
+ ld A,(hl)
+ cp ' '
+ jr z,comerr1 ; not blank
+ or A
+ jr z,comerr1 ; not zero, so print it
+ push hl
+ call printchar
+ pop hl
+ inc hl
+ jr comerr0 ; for another character
+
+comerr1:
+;print question mark,and delete sub file
+
+ ld A,'?'
+ call printchar
+ call crlf
+ call del$sub
+ jp ccp ;restart with next command
+
+;
+; fcb scan and fill subroutine (entry is at fillfcb below)
+;fill the comfcb, indexed by a (0 or 16)
+;subroutines
+;
+
+delim:
+;look for a delimiter
+
+ ld a,(de)
+ or A
+ ret z ;not the last element
+ cp ' '
+ jr c,comerr ;non graphic
+ ret z ;treat blank as delimiter
+ cp '='
+ ret z
+ cp la
+ ret z ;left arrow
+ cp '.'
+ ret z
+ cp ':'
+ ret z
+ cp ';'
+ ret z
+ cp '<'
+ ret z
+ cp '>'
+ ret z
+ ret ;delimiter not found
+
+deblank:
+;deblank the input line
+
+ ld a,(de)
+ or A
+ ret z ;treat end of line as blank
+ cp ' '
+ ret nz
+ inc de
+ jr deblank
+
+addh:
+;add a to h,l
+
+ add a,L
+ ld L,A
+ ret nc
+ inc H
+ ret
+
+fillfcb0:
+;equivalent to fillfcb(0)
+
+ ld A,0
+
+fillfcb:
+
+ ld hl,comfcb
+ call addh
+ push hl
+ push hl ;fcb rescanned at end
+ xor A
+ ld (sdisk),a ;clear selected disk (in case a:...)
+ ld hl,(comaddr)
+ ex de,hl ;command address in d,e
+ call deblank ;to first non-blank character
+ ex de,hl
+ ld (staddr),hl ;in case of errors
+ ex de,hl
+ pop hl ;d,e has command, h,l has fcb address
+
+;look for preceding file name a: b: ...
+
+ ld a,(de)
+ or A
+ jr z,setcur0 ;use current disk if empty command
+ sbc a,'A'-1
+ ld B,A ;disk name held in b if : follows
+ inc de
+ ld a,(de)
+ cp ':'
+ jr z,setdsk ;set disk name if :
+
+setcur:
+;set current disk
+Š dec de ;back to first character of command
+
+setcur0:
+
+ ld a,(cdisk)
+ ld (hl),A
+ jr setname
+
+setdsk:
+;set disk to name in register b
+
+ ld A,B
+ ld (sdisk),a ;mark as disk selected
+ ld (hl),B
+ inc de ;past the :
+
+setname:
+;set the file name field
+
+ ld B,8 ;file name length (max)
+
+setnam0:
+
+ call delim
+ jr z,padname ;not a delimiter
+ inc hl
+ cp '*'
+ jr nz,setnam1 ;must be ?'s
+ ld (hl),'?'
+ jr setnam2 ;to dec count
+
+setnam1:
+
+ ld (hl),A ;store character to fcb
+ inc de
+
+setnam2:
+
+ dec B ;count down length
+ jr nz,setnam0
+
+;end of name, truncate remainder
+
+trname:
+
+ call delim
+ jr z,setty ;set type field if delimiter
+ inc de
+ jr trname
+
+padname:
+
+ inc hl
+ ld (hl),' '
+ dec B
+ jr nz,padname
+
+setty:
+;set the type field
+
+ ld B,3
+ cp '.'
+ jr nz,padty ;skip the type field if no .
+ inc de ;past the ., to the file type field
+
+setty0:
+;set the field from the command buffer
+
+ call delim
+ jr z,padty
+ inc hl
+ cp '*'
+ jr nz,setty1
+ ld (hl),'?' ;since * specified
+ jr setty2
+
+setty1:
+;not a *, so copy to type field
+
+ ld (hl),A
+ inc de
+
+setty2:
+;decrement count and go again
+
+ dec B
+ jr nz,setty0
+
+;end of type field, truncate
+
+trtyp:
+;truncate type field
+
+ call delim
+ jr z,efill
+ inc de
+ jr trtyp
+
+padty:
+;pad the type field with blanks
+
+ inc hl
+ ld (hl),' '
+ dec B
+ jr nz,padty
+
+efill:
+;end of the filename/filetype fill, save command address
+;fill the remaining fields for the fcb
+
+ ld B,3
+
+efill0:
+
+ inc hl
+ ld (hl),0
+ dec B
+ jr nz,efill0
+ ex de,hl
+ ld (comaddr),hl ;set new starting point
+
+;recover the start address of the fcb and count ?'s
+
+ pop hl
+ ld bc,11 ;b=0, c=8+3
+
+scnq:
+
+ inc hl
+ ld A,(hl)
+ cp '?'
+ jr nz,scnq0
+
+;? found, count it in b
+
+ inc B
+
+scnq0:
+
+ dec C
+ jr nz,scnq
+
+;number of ?'s in c, move to a and return with flags set
+Š ld A,B
+ or A
+ ret
+
+intvec:
+;intrinsic function names (all are four characters)
+
+ defb 'DIR '
+ defb 'ERA '
+ defb 'TYPE'
+ defb 'SAVE'
+ defb 'REN '
+ defb 'USER'
+
+intlen equ ($-intvec)/4 ;intrinsic function length
+
+
+intrinsic:
+;look for intrinsic functions (comfcb has been filled)
+
+ ld hl,intvec
+ ld C,0 ;c counts intrinsics as scanned
+
+intrin0:
+
+ lä A,C
+ cp intlen ;done with scan?
+ ret nc
+
+;no, more to scan
+
+ ld de,comfcb+1 ;beginning of name
+ ld B,4 ;length of match is in b
+
+intrin1:
+
+ ld a,(de)
+ cp (hl) ;match?
+ jr nz,intrin2 ;skip if no match
+ inc de
+ inc hl
+ dec B
+ jr nz,intrin1 ;loop while matching
+
+;complete match on name, check for blank in fcb
+
+ ld a,(de)
+ cp ' '
+ jr nz,intrin3 ;otherwise matched
+ ld A,C
+ ret ;with intrinsic number in a
+
+intrin2:
+;mismatch, move to end of intrinsic
+
+ inc hl
+ dec B
+ jr nz,intrin2
+
+intrin3:
+;try next intrinsic
+
+ inc C ;to next intrinsic number
+ jr intrin0 ;for another round
+
+ccpclear:
+;clear the command buffer
+
+ xor A
+ ld (comlen),a
+
+;drop through to start ccp
+
+ccpstart:
+;enter here from boot loader
+
+ ld sp,stack
+ push bc ;save initial disk number
+
+;(high order 4bits=user code, low 4bits=disk#)
+
+ ld A,C
+ rra
+ rra
+ rra
+ rra
+ and 0fh ;user code
+ ld E,A
+ call setuser ;user code selected
+ ld hl,(SUBADDR)
+ dec hl
+ ld A,(hl)
+ ld (hl),0
+ or A
+ call nz,INITIALIZE
+ pop bc ;recall user code and disk number
+ ld A,C
+ and 0fh ;disk number in accumulator
+ ld (cdisk),a ;clears user code nibble
+ call select ;proper disk is selected, now check sub files
+
+;check for initial command
+
+ ld a,(comlen)
+ or A
+ jr nz,ccp0 ;assume typed already
+Šccp:
+;enter here on each command or error condition
+
+ ld sp,stack
+ call crlf ;print d> prompt, where d is disk name
+ ld a,(USERNO)
+ or A
+ jr z,CCP002
+ cp 10
+ jr c,CCP001
+ push af
+ ld A,'1'
+ call PRINTCHAR
+ pop af
+ sub 10
+
+CCP001:
+
+ add a,30H
+ call PRINTCHAR
+
+CCP002:
+
+ call cselect ;get current disk number
+ add a,'A'
+ call printchar
+ ld A,'>'
+ call printchar
+ call readcom ;command buffer filled
+ccp0:
+;(enter here from initialization with command full)
+
+ call SETDMABUFF ;default dma address at buff
+ call cselect
+ ld (cdisk),a ;current disk number saved
+ call fillfcb0 ;command fcb filled
+ call nz,comerr ;the name cannot be an ambiguous reference
+ ld a,(sdisk)
+ or A
+ jp nz,userfunc
+
+;check for an intrinsic function
+
+ call intrinsic
+ ld hl,jmptab ;index is in the accumulator
+ ld E,A
+ ld D,0
+ add hl,de
+ add hl,de ;index in d,e
+ ld A,(hl)
+ inc hl
+ ld H,(hl)
+ ld L,A
+ jp (hl)
+
+;pc changes to the proper intrinsic or user function
+
+jmptab:
+
+ defw direct ;directory search
+ defw erase ;file erase
+ defw type ;type file
+ defw save ;save memory image
+ defw rename ;file rename
+ defw user ;user number
+ defw userfunc ;user-defined function
+
+;
+;utility subroutines for intrinsic handlers
+;
+
+readerr:
+;print the read error message
+
+ ld bc,rdmsg
+ jp print
+
+rdmsg: defb 'READ ERROR',0
+
+
+nofile:
+;print no file message
+
+ ld bc,nofmsg
+ jp print
+
+nofmsg: defb 'NO FILE',0
+
+
+getnumber:
+;read a number from the command line
+
+ call fillfcb0 ;should be number
+ ld a,(sdisk)
+ or A
+ jp nz,comerr ;cannot be prefixed
+
+;convert the byte value in comfcb to binary
+
+ ld hl,comfcb+1
+ ld bc,11 ;(b=0, c=11)
+
+;value accumulated in b, c counts name length to zero
+
+conv0:
+
+ ld A,(hl)
+ cp ' '
+ jr z,conv1
+Š;more to scan, convert char to binary and add
+
+ inc hl
+ sub '0'
+ cp 10
+ jp nc,comerr ;valid?
+ ld D,A ;save value
+ ld A,B ;mult by 10
+ and 11100000b
+ jp nz,comerr
+ ld A,B ;recover value
+ rlca
+ rlca
+ rlca ;*8
+ add a,B
+ jp c,comerr
+ add a,B
+ jp c,comerr ;*8+*2 = *10
+ add a,D
+ jp c,comerr ;+digit
+ ld B,A
+ dec C
+ jr nz,conv0 ;for another digit
+ ret
+
+conv1:
+;end of digits, check for all blanks
+
+ ld A,(hl)
+ cp ' '
+ jp nz,comerr ;blanks?
+ inc hl
+ dec C
+ jr nz,conv1
+ ld A,B ;recover value
+ ret
+
+movename:
+;move 3 characters from h,l to d,e addresses
+
+ ld B,3
+
+move0:
+
+ ld A,(hl)
+ ld (de),a
+ inc hl
+ inc de
+ dec B
+ jr nz,move0
+ ret
+
+addhcf:
+;buff + a + c to h,l followed by fetch
+
+ ld hl,buff
+ add a,C
+ call addh
+ ld A,(hl)
+ ret
+
+setdisk:
+;change disks for this command, if requested
+
+ xor A
+ ld (comfcb),a ;clear disk name from fcb
+ ld a,(sdisk)
+ or A
+ ret z ;no action if not specified
+ dec A
+ ld hl,cdisk
+ cp (hl)
+ ret z ;already selected
+ jp select
+
+resetdisk:
+;return to original disk after command
+
+ ld a,(sdisk)
+ or A
+ ret z ;no action if not selected
+ dec A
+ ld hl,cdisk
+ cp (hl)
+ ret z ;same disk
+ ld a,(cdisk)
+ jp select
+
+;
+;individual intrinsics follow
+;
+
+direct:
+;directory search
+
+ call fillfcb0 ;comfcb gets file name
+ call setdisk ;change disk drives if requested
+ ld hl,comfcb+1
+ ld A,(hl) ;may be empty request
+ cp ' '
+ jr nz,dir1 ;skip fill of ??? if not blank
+
+;set comfcb to all ??? for current disk
+
+ ld B,11 ;length of fill ????????.???
+
+dir0:
+
+ ld (hl),'?'
+ inc hl
+ dec B
+ jr nz,dir0
+
+;not a blank request, must be in comfcb
+
+dir1:
+
+ lä E,0
+ push de ;e counts directory entries
+ call searchcom ;first one has been found
+ call z,nofile ;not found message
+
+dir2:
+
+ jr z,endir
+
+;found, but may be system file
+Š ld a,(dcnt) ;get the location of the element
+ rrca
+ rrca
+ rrca
+ and 1100000b
+ ld C,A
+
+;c contains base index into buff for dir entry
+
+ ld A,sysfile
+ call addhcf ;value to a
+ rla
+ jr c,dir6 ;skip if system file
+
+;c holds index into buffer
+;another fcb found, new line?
+
+ pop de
+ ld A,E
+ inc E
+ push de
+
+;e=0,1,2,3,...new line if mod 4 = 0
+
+ and 11b
+ push af ;and save the test
+ jr nz,dirhdr0 ;header on current line
+ call crlf
+ push bc
+ call cselect
+ pop bc
+
+;current disk in a
+
+ add a,'A'
+ call printbc
+ ld A,':'
+ call printbc
+ jr dirhdr1 ;skip current line hdr
+
+dirhdr0:
+
+ call blank ;after last one
+ ld A,':'
+ call printbc
+
+dirhdr1:
+
+ call blank
+
+;compute position of name in buffer
+
+ ld B,1 ;start with first character of name
+
+dir3:
+
+ ld A,B
+ call addhcf ;buff+a+c fetched
+ and 7fh ;mask flags
+
+;may delete trailing blanks
+
+ cp ' '
+ jr nz,dir4 ;check for blank type
+ pop af
+ push af ;may be 3rd item
+ cp 3
+ jr nz,dirb ;place blank at end if not
+ ld A,9
+ call addhcf ;first char of type
+ and 7fh
+ cp ' '
+ jr z,dir5
+
+;not a blank in the file type field
+
+dirb:
+
+ ld A,' ' ;restore trailing filename chr
+
+dir4:
+
+ call printbc ;char printed
+ inc B
+ ld A,B
+ cp 12
+ jr nc,dir5
+
+;check for break between names
+
+ cp 9
+ jr nz,dir3 ;for another char
+
+;print a blank between names
+
+ call blank
+ jr dir3
+
+dir5:
+;end of current entry
+
+ pop af ;discard the directory counter (mod 4)
+
+dir6:
+
+ call break$key ;check for interrupt at keyboard
+ jr nz,endir ;abort directory search
+ call searchn
+ jr dir2 ;for another entry
+
+endir:
+;end of directory scan
+
+ pop de ;discard directory counter
+ jp retcom
+
+erase:
+
+ call fillfcb0 ;cannot be all ???'s
+ cp 11
+ jr nz,erasefile
+Š;erasing all of the disk
+
+ ld bc,ermsg
+ call print
+
+ call readcom
+ ld hl,comlen
+ dec (hl)
+ jp nz,ccp ;bad input
+ inc hl
+ ld A,(hl)
+ cp 'Y'
+ jp nz,ccp
+
+;ok, erase the entire diskette
+
+ inc hl
+ ld (comaddr),hl ;otherwise error at retcom
+
+erasefile:
+
+ call setdisk
+ ld de,comfcb
+ call delete
+ inc A ;255 returned if not found
+ call z,nofile ;no file message if so
+ jp retcom
+
+
+ermsg: defb 'ALL (Y/N)?',0
+
+
+type:
+
+ call fillfcb0
+ jp nz,comerr ;don't allow ?'s in file name
+ call setdisk
+ call openc ;open the file
+ jr z,typerr ;zero flag indicates not found
+
+;file opened, read 'til eof
+
+ call crlf
+ ld hl,bptr
+ ld (hl),255 ;read first buffer
+
+type0:
+;loop on bptr
+
+ ld hl,bptr
+ ld A,(hl)
+ cp 128 ;end buffer
+ jr c,type1
+ push hl ;carry if 0,1,...,127
+
+;read another buffer full
+
+ call diskreadc
+ pop hl ;recover address of bptr
+ jr nz,typeof ;hard end of file
+ xor A
+ ld (hl),A ;bptr = 0
+
+type1:
+;read character at bptr and print
+
+ inc (hl) ;bptr = bptr + 1
+ ld hl,buff
+ call addh ;h,l addresses char
+ ld A,(hl)
+ cp eofile
+ jp z,retcom
+ call printchar
+ call break$key
+ jp nz,retcom ;abort if break
+ jr type0 ;for another character
+
+typeof:
+;end of file, check for errors
+
+ dec A
+ jp z,retcom
+ call readerr
+
+typerr:
+
+ call resetdisk
+ jp comerr
+
+save:
+
+ call getnumber ; value to register a
+ push af ;save it for later
+
+;should be followed by a file to save the memory image
+
+ call fillfcb0
+ jp nz,comerr ;cannot be ambiguous
+ call setdisk ;may be a disk change
+ ld de,comfcb
+ push de
+ call delete ;existing file removed
+ pop de
+ call make ;create a new file on disk
+ jr z,saverr ;no directory space
+ xor A
+ ld (comrec),a ; clear next record field
+ pop af ;#pages to write is in a, change to #sectors
+Š ld L,A
+ ld H,0
+ add hl,hl
+
+ ld de,tran ;h,l is sector count, d,e is load address
+
+save0:
+;check for sector count zero
+
+ ld A,H
+ or L
+ jr z,save1 ;may be completed
+ dec hl ;sector count = sector count - 1
+ push hl ;save it for next time around
+ ld hl,128
+ add hl,de
+ push hl ;next dma address saved
+ call setdma ;current dma address set
+ ld de,comfcb
+ call diskwrite
+ pop de
+ pop hl ;dma address, sector count
+ jr nz,saverr ;may be disk full case
+ jr save0 ;for another sector
+
+save1:
+;end of dump, close the file
+
+ ld de,comfcb
+ call close
+ inc A ; 255 becomes 00 if error
+ jr nz,retsave ;for another command
+
+saverr:
+;must be full or read only disk
+
+ ld bc,fullmsg
+ call print
+
+retsave:
+;reset dma buffer
+
+ call setdmabuff
+ jp retcom
+
+
+fullmsg: defb 'NO SPACE',0
+
+
+rename:
+;rename a file on a specific disk
+
+ call fillfcb0
+ jp nz,comerr ;must be unambiguous
+ ld a,(sdisk)
+ push af ;save for later compare
+ call setdisk ;disk selected
+ call searchcom ;is new name already there?
+ jr nz,renerr3
+
+;file doesn't exist, move to second half of fcb
+
+ ld hl,comfcb
+ ld de,comfcb+16
+ ld B,16
+ call move0
+
+;check for = or left arrow
+
+ ld hl,(comaddr)
+ ex de,hl
+ call deblank
+ cp '='
+ jr z,ren1 ;ok if =
+ cp la
+ jr nz,renerr2
+
+ren1:
+
+ ex de,hl
+ inc hl
+ ld (comaddr),hl ;past delimiter
+
+;proper delimiter found
+
+ call fillfcb0
+ jr nz,renerr2
+
+;check for drive conflict
+
+ pop af
+ ld B,A ;previous drive number
+ ld hl,sdisk
+ ld A,(hl)
+ or A
+ jr z,ren2
+
+;drive name was specified. same one?
+
+ cp B
+ ld (hl),B
+ jr nz,renerr2
+
+ren2:
+
+ ld (hl),B ;store the name in case drives switched
+ xor A
+ ld (comfcb),a
+ call searchcom ;is old file there?
+ jr z,renerr1
+
+;everything is ok, rename the file
+
+ ld de,comfcb
+ call renam
+ jp retcom
+
+renerr1:
+; no file on disk
+
+ call nofile
+ jp retcom
+
+renerr2:
+; ambigous reference/name conflict
+
+ call resetdisk
+ jp comerr
+
+renerr3:
+; file already exists
+
+ ld bc,renmsg
+ call print
+ jp retcom
+
+
+renmsg: defb 'FILE EXISTS',0
+
+user:
+;set user number
+
+ call getnumber ; leaves the value in the accumulator
+ cp 16
+ jp nc,comerr ; must be between 0 and 15
+ ld E,A ;save for setuser call
+ ld a,(comfcb+1)
+ cp ' '
+ jp z,comerr
+ ld A,E
+ call setuser ;new user number set
+ jp endcom
+
+userfunc:
+;load user function and set up for execution
+
+ ld a,(comfcb+1)
+ cp ' '
+ jr nz,user0
+
+;no file name, but may be disk switch
+
+ ld a,(sdisk)
+ or A
+ jp z,endcom ;no disk name if 0
+ dec A
+ ld (cdisk),a ;set user/disk
+ call select
+ jp endcom
+
+user0:
+;file name is present
+
+ ld de,comfcb+9
+ ld a,(de)
+ cp ' '
+ jp nz,comerr ;type ' '
+ push de
+ call setdisk
+ pop de
+ ld hl,comtype ;.com
+ call movename ;file type is set to .com
+ call openc
+ jp z,userer
+
+;file opened properly, read it into memory
+
+ ld hl,tran ;transient program base
+
+load0:
+
+ push hl ;save dma address
+
+ ex de,hl
+ call setdma
+ ld de,comfcb
+ call diskread
+ jr nz,load1
+
+;sector loaded, set new dma address and compare
+
+ pop hl
+ ld de,128
+ add hl,de
+ ld de,tranm ;has the load overflowed?
+ ld A,L
+ sub E
+ ld A,H
+ sbc a,D
+ jr nc,loaderr
+ jr load0 ;for another sector
+
+load1:
+
+ pop hl
+ dec A
+ jr nz,loaderr ;end file is 1
+ call resetdisk ;back to original disk
+ call fillfcb0
+ ld hl,sdisk
+ push hl
+ ld A,(hl)
+ ld (comfcb),a ;drive number set
+ ld A,16
+ call fillfcb ;move entire fcb to memory
+ pop hl
+ ld A,(hl)
+ ld (comfcb+16),a
+ xor A
+ ld (comrec),a ;record number set to zero
+ ld de,fcb
+ ld hl,comfcb
+ ld B,33
+ call move0
+
+;move command line to buff
+
+ ld hl,combuf
+
+bmove0:
+
+ ld A,(hl)
+ or A
+ jr z,bmove1
+ cp ' '
+ jr z,bmove1
+ inc hl
+ jr bmove0 ;for another scan
+
+;first blank position found
+
+bmove1:
+
+ ld B,0
+ ld de,buff+1
+
+;ready for the move
+
+bmove2:
+
+ ld A,(hl)
+ ld (de),a
+ or A
+ jr z,bmove3
+Š;more to move
+
+ inc B
+ inc hl
+ inc de
+ jr bmove2
+
+bmove3:
+;b has character count
+
+ ld A,B
+ ld (buff),a
+ call crlf
+
+;now go to the loaded program
+
+ call setdmabuff ;default dma
+ call saveuser ;user code saved
+ ld hl,(ZEROADD)
+ ld C,4
+
+ZMOVE:
+
+ ld (hl),0
+ inc hl
+ dec C
+ jr nz,ZMOVE
+
+;low memory diska contains user code
+
+ call tran ;gone to the loaded program
+ ld sp,stack ;may come back here
+ ld a,(USERNO)
+ ld E,A
+ call SETUSER
+ ld a,(CDISK)
+ call select
+ jp ccp
+
+userer:
+;arrive here on command error
+
+ call resetdisk
+ jp comerr
+
+loaderr:
+;cannot load the program
+
+ ld bc,loadmsg
+ call print
+ jr retcom
+
+
+loadmsg: defb 'BAD LOAD',0
+comtype: defb 'COM' ;for com files
+
+
+
+retcom:
+;reset disk before end of command check
+
+ call resetdisk
+
+endcom:
+;end of intrinsic command
+
+ call fillfcb0 ;to check for garbage at end of line
+ ld a,(comfcb+1)
+ sub ' '
+ ld hl,sdisk
+ or (hl)
+
+;0 in accumulator if no disk selected, and blank fcb
+
+ jp nz,comerr
+ jp ccp
+
+;
+; data areas
+;
+ defs 16 ;8 level stack
+
+stack:
+
+;
+; 'submit' file control block
+;
+
+subfcb: defb 1,'$$$ ' ;file name is $$$
+ defb 'SUB',0
+
+sub$s1: defb 0 ;file type is sub
+submod: defb 0 ;module number
+subrc: defs 1 ;record count filed
+ defs 16 ;disk map
+subcr: defs 1 ;current record to read
+
+;
+; command file control block
+;
+Šcomfcb: defs 32 ;fields filled in later
+comrec: defs 1 ;current record to read/write
+dcnt: defs 1 ;disk directory count (used for error codes)
+cdisk: defs 1 ;current disk
+sdisk: defs 1 ;selected disk for current operation
+ ;none=0, a=1, b=2 ...
+
+USERNO: defs 1 ;CURRENT USER NUMBER
+bptr: defs 1 ;buffer pointer
+
+ ; this is code tto make the BDOS (which follows) be on a
+ ; 256 byte page boundry. (make the linker happy)
+last: defb 0
+ org (((last-base)+255) and 0FF00h) -1
+ defb 0
+
+ end ccploc
+
+
\ No newline at end of file
diff --git a/cpm/pcpm/ED.PLM b/cpm/pcpm/ED.PLM
new file mode 100644
index 0000000..548cb08
--- /dev/null
+++ b/cpm/pcpm/ED.PLM
@@ -0,0 +1,1630 @@
+ED:
+DO;
+ /* MODIFIED FOR .PRL OPERATION MAY, 1979 */
+ /* MODIFIED FOR OPERATION WITH CP/M 2.0 AUGUST 1979 */
+DECLARE
+ /* JMP EDCOMMAND - 3 (TO ADDRESS LXI SP) */
+ EDJMP BYTE DATA(0C3H),
+ EDADR ADDRESS DATA(.EDCOMMAND-3);
+
+DECLARE
+ BDISK BYTE EXTERNAL, /* BOOT DISK 0004H */
+ MAXB ADDRESS EXTERNAL, /* MAX BASE 0006H */
+ FCB (33) BYTE EXTERNAL, /* FCB 005CH */
+ BUFF (128)BYTE EXTERNAL, /* BUFFER 0080H */
+ SECTSHF LITERALLY '7', /* SHL(1,SECTSHF) = SECTSIZE */
+ SECTSIZE LITERALLY '80H'; /* SECTOR SIZE */
+
+MON1: PROCEDURE(F,A) EXTERNAL;
+ DECLARE F BYTE, A ADDRESS;
+ END MON1;
+
+MON2: PROCEDURE(F,A) BYTE EXTERNAL;
+ DECLARE F BYTE, A ADDRESS;
+ END MON2;
+
+BOOT: PROCEDURE EXTERNAL;
+ /* SYSTEM REBOOT */
+ END BOOT;
+
+ /* E D : T H E C P / M C O N T E X T E D I T O R */
+
+ /* COPYRIGHT (C) 1976, 1977, 1978, 1979
+ DIGITAL RESEARCH
+ BOX 579 PACIFIC GROVE
+ CALIFORNIA 93950
+ */
+DECLARE COPYRIGHT(*) BYTE DATA
+ (' COPYRIGHT (C) 1979, DIGITAL RESEARCH ');
+
+ /* COMMAND FUNCTION
+ ------- --------
+ A APPEND LINES OF TEXT TO BUFFER
+ B MOVE TO BEGINNING OR END OF TEXT
+ C SKIP CHARACTERS
+ D DELETE CHARACTERS
+ E END OF EDIT
+ F FIND STRING IN CURRENT BUFFER
+ H MOVE TO TOP OF FILE (HEAD)
+ I INSERT CHARACTERS FROM KEYBOARD
+ UP TO NEXT
+ J JUXTAPOSITION OPERATION - SEARCH FOR FIRST STRING,
+ INSERT SECOND STRING, DELETE UNTIL THIRD STRING
+ K DELETE LINES
+ L SKIP LINES
+ M MACRO DEFINITION (SEE COMMENT BELOW)
+ N FIND NEXT OCCURRENCE OF STRING
+ WITH AUTO SCAN THROUGH FILE
+ O RE-EDIT OLD FILE
+ P PAGE AND DISPLAY (MOVES UP OR DOWN 24 LINES AND
+ DISPLAYS 24 LINES)
+ Q QUIT EDIT WITHOUT UPDATING THE FILE
+ R READ FROM FILE .LIB UNTIL AND
+ INSERT INTO TEXT
+ S SEARCH FOR FIRST STRING, REPLACE BY SECOND STRING
+ T TYPE LINES
+ U TRANSLATE TO UPPER CASE (-U CHANGES TO NO TRANSLATE)
+ W WRITE LINES OF TEXT TO FILE
+ X TRANSFER (XFER) LINES TO TEMP FILE
+ Z SLEEP FOR 1/2 SECOND (USED IN MACROS TO STOP DISPLAY)
+ MOVE UP OR DOWN AND PRINT ONE LINE
+
+
+ IN GENERAL, THE EDITOR ACCEPTS SINGLE LETTER COMMANDS WITH OPTIONAL
+INTEGER VALUES PRECEDING THE COMMAND. THE EDITOR ACCEPTS BOTH UPPER AND LOWER
+CASE COMMANDS AND VALUES, AND PERFORMS TRANSLATION TO UPPER CASE UNDER THE FOL-
+LOWING CONDITIONS. IF THE COMMAND IS TYPED IN UPPER CASE, THEN THE DATA WHICH
+FOLLOWS IS TRANSLATED TO UPPER CASE. THUS, IF THE "I" COMMAND IS TYPED IN
+UPPER CASE, THEN ALL INPUT IS AUTOMATICALLY TRANSLATED (ALTHOUGH ECHOED IN
+LOWER CASE, AS TYPED). IF THE "A" COMMAND IS TYPED IN UPPER CASE, THEN ALL
+INPUT IS TRANSLATED AS READ FROM THE DISK. GLOBAL TRANSLATION TO UPPER CASE
+CAN BE CONTROLLED BY THE "U" COMMAND (-U TO NEGATE ITS EFFECT). IF YOU ARE
+OPERATING WITH AN UPPER CASE ONLY TERMINAL, THEN OPERATION IS AUTOMATIC.
+SIMILARLY, IF YOU ARE OPERATING WITH A LOWER CASE TERMINAL, AND TRANSLATION
+TO UPPER CASE IS NOT SPECIFIED, THEN LOWER CASE CHARACTERS CAN BE ENTERED.
+
+ A NUMBER OF COMMANDS CAN BE PRECEDED BY A POSITIVE OR
+ NEGATIVE INTEGER BETWEEN 0 AND 65535 (1 IS DEFAULT IF NO VALUE
+ IS SPECIFIED). THIS VALUE DETERMINES THE NUMBER OF TIMES THE
+ COMMAND IS APPLIED BEFORE RETURNING FOR ANOTHER COMMAND.
+ THE COMMANDS
+ C D K L T P U
+ CAN BE PRECEDED BY AN UNSIGNED, POSITIVE, OR NEGATIVE NUMBER,
+ THE COMMANDS
+ A F J N W Z
+ CAN BE PRECEDED BY AN UNSIGNED OR POSITIVE NUMBER,
+ THE COMMANDS
+ E H O Q
+ CANNOT BE PRECEDED BY A NUMBER. THE COMMANDS
+ F I J M R S
+ ARE ALL FOLLOWED BY ONE OR MORE STRINGS OF CHARACTERS WHICH CAN
+ BE OPTIONALLY SEPARATED OR TERMINATED BY EITHER OR .
+ THE IS GENERALLY USED TO SEPARATE THE SEARCH STRINGS
+ IN THE S AND J COMMANDS, AND IS USED AT THE END OF THE COMMANDS IF
+ ADDITIONAL COMMANDS FOLLOW. FOR EXAMPLE, THE FOLLOWING COMMAND
+ SEQUENCE SEARCHES FOR THE STRING 'GAMMA', SUBSTITUTES THE STRING
+ 'DELTA', AND THEN TYPES THE FIRST PART OF THE LINE WHERE THE
+ CHANGE OCCURRED, FOLLOWED BY THE REMAINDER OF THE LINE WHICH WAS
+ CHANGED:
+ SGAMMADELTA0TT
+
+ THE CONTROL-L CHARACTER IN SEARCH AND SUBSTITUTE STRINGS IS
+ REPLACED ON INPUT BY CHARACTERS. THE CONTROL-I KEY
+ IS TAKEN AS A TAB CHARACTER.
+
+ THE COMMAND R MUST BE FOLLOWED BY A FILE NAME (WITH ASSUMED FILE
+ TYPE OF 'LIB') WITH A TRAILING OR . THE COMMAND
+ I IS FOLLOWED BY A STRING OF SYMBOLS TO INSERT, TERMINATED BY
+ A OR . IF SEVERAL LINES OF TEXT ARE TO BE INSERTED,
+ THE I CAN BE DIRECTLY FOLLOWED BY AN OR IN WHICH
+ CASE THE EDITOR ACCEPTS LINES OF INPUT TO THE NEXT .
+ THE COMMAND 0T PRINTS THE FIRST PART OF THE CURRENT LINE,
+ AND THE COMMAND 0L MOVES THE REFERENCE TO THE BEGINNING OF THE
+ CURRENT LINE. THE COMMAND 0P PRINTS THE CURRENT PAGE ONLY, WHILE
+ THE COMMAND 0Z READS THE CONSOLE RATHER THAN WAITING (THIS IS USED
+ AGAIN WITHIN MACROS TO STOP THE DISPLAY - THE MACRO EXPANSION
+ STOPS UNTIL A CHARACTER IS READ. IF THE CHARACTER IS NOT A BREAK
+ THEN THE MACRO EXPANSION CONTINUES NORMALLY).
+
+ NOTE THAT A POUND SIGN IS TAKEN AS THE NUMBER 65535, ALL
+ UNSIGNED NUMBERS ARE ASSUMED POSITIVE, AND A SINGLE - IS ASSUMED -1
+
+ A NUMBER OF COMMANDS CAN BE GROUPED TOGETHER AND EXECUTED
+ REPETITIVELY USING THE MACRO COMMAND WHICH TAKES THE FORM
+
+ MC1C2...CN
+
+ WHERE IS A NON-NEGATIVE INTEGER N, AND IS
+ OR . THE COMMANDS C1 ... CN FOLLOWING THE M ARE
+ EXECUTED N TIMES, STARTING AT THE CURRENT POSITION IN THE BUFFER.
+ IF N IS 0, 1, OR OMITTED, THE COMMANDS ARE EXECUTED UNTIL THE END
+ IF THE BUFFER IS ENCOUNTERED.
+
+ THE FOLLOWING MACRO, FOR EXAMPLE, CHANGES ALL OCCURRENCES OF
+ THE NAME 'GAMMA' TO 'DELTA', AND PRINTS THE LINES WHICH
+ WERE CHANGED:
+
+ MFGAMMA-5DIDELTA0LT
+
+ (NOTE: AN IS THE CP/M END OF FILE MARK - CONTROL-Z)
+
+ IF ANY KEY IS DEPRESSED DURING TYPING OR MACRO EXPANSION, THE
+ FUNCTION IS CONSIDERED TERMINATED, AND CONTROL RETURNS TO THE
+ OPERATOR.
+
+ ERROR CONDITIONS ARE INDICATED BY PRINTING ONE OF THE CHARACTERS:
+
+ SYMBOL ERROR CONDITION
+ ------ ----------------------------------------------------
+ GREATER FREE MEMORY IS EXHAUSTED - ANY COMMAND CAN BE ISSUED
+ WHICH DOES NOT INCREASE MEMORY REQUIREMENTS.
+ QUESTION UNRECOGNIZED COMMAND OR ILLEGAL NUMERIC FIELD
+ POUND CANNOT APPLY THE COMMAND THE NUMBER OF TIMES SPECFIED
+ (OCCURS IF SEARCH STRING CANNOT BE FOUND)
+ LETTER O CANNOT OPEN .LIB IN R COMMAND
+
+ THE ERROR CHARACTER IS ALSO ACCOMPANIED BY THE LAST CHARACTER
+ SCANNED WHEN THE ERROR OCCURRED. */
+
+DECLARE LIT LITERALLY 'LITERALLY',
+ DCL LIT 'DECLARE',
+ PROC LIT 'PROCEDURE',
+ ADDR LIT 'ADDRESS',
+ CTLL LIT '0CH',
+ CTLR LIT '12H', /* REPEAT LINE IN INSERT MODE */
+ CTLU LIT '15H', /* LINE DELETE IN INSERT MODE */
+ CTLX LIT '18H', /* EQUIVALENT TO CTLU */
+ CTLH LIT '08H', /* BACKSPACE */
+ TAB LIT '09H', /* TAB CHARACTER */
+ LCA LIT '110$0001B', /* LOWER CASE A */
+ LCZ LIT '111$1010B', /* LOWER CASE Z */
+ ENDFILE LIT '1AH'; /* CP/M END OF FILE */
+
+DECLARE
+ MAX ADDRESS, /* .MEMORY(MAX)=0 (END) */
+ MAXM ADDRESS, /* MINUS 1 */
+ HMAX ADDRESS; /* = MAX/2 */
+
+DECLARE
+ RO LITERALLY '9', /* R/O FILE INDICATOR */
+ SY LITERALLY '10', /* SYSTEM FILE ATTRIBUTE */
+ EX LITERALLY '12', /* EXTENT NUMBER POSITION */
+ UB LITERALLY '13', /* UNFILLED BYTES */
+ MD LITERALLY '14', /* MODULE NUMBER POSITION */
+ NR LITERALLY '32', /* NEXT RECORD FIELD */
+ FS LITERALLY '33', /* FCB SIZE */
+ RFCB (FS) BYTE /* READER FILE CONTROL BLOCK */
+ INITIAL(0, /* FILE NAME */ ' ',
+ /* FILE TYPE */ 'LIB',0,0,0),
+ RBP BYTE, /* READ BUFFER POINTER */
+ XFCB (FS) BYTE /* XFER FILE CONTROL BLOCK */
+ INITIAL(0, 'X$$$$$$$','LIB',0,0,0),
+ XFCBE BYTE AT(.XFCB(EX)), /* XFCB EXTENT */
+ XFCBM BYTE AT(.XFCB(MD)), /* MODULE NUMBER */
+ XFCBR BYTE AT(.XFCB(NR)), /* XFCB RECORD # */
+ XBUFF (SECTSIZE) BYTE, /* XFER BUFFER */
+ XBP BYTE, /* XFER POINTER */
+ XFERON BYTE, /* TRUE IF XFER ACTIVE */
+
+ NBUF BYTE, /* NUMBER OF BUFFERS */
+ BUFFLENGTH ADDRESS, /* NBUF * SECTSIZE */
+ SFCB (FS) BYTE AT(.FCB), /* SOURCE FCB = DEFAULT FCB */
+ SBUFFADR ADDRESS, /* SOURCE BUFFER ADDRESS */
+ SBUFF BASED SBUFFADR (128) BYTE, /* SOURCE BUFFER */
+
+ DFCB (FS) BYTE, /* DEST FILE CONTROL BLOCK */
+ DFUB BYTE AT(.DFCB(UB)), /* UNFILLED BYTES IN LAST RECORD */
+ DBUFFADR ADDRESS, /* DESTINATION BUFFER ADDRESS */
+ DBUFF BASED DBUFFADR (128) BYTE, /* DEST BUFFER */
+ NSOURCE ADDRESS, /* NEXT SOURCE CHARACTER */
+ NDEST ADDRESS; /* NEXT DESTINATION CHAR */
+
+DECLARE SDISK BYTE, /* SOURCE FILE DISK */
+ DDISK BYTE; /* DESTINATION FILE DISK */
+
+ /* IO SECTION */
+
+READCHAR: PROCEDURE BYTE; RETURN MON2(1,0);
+ END READCHAR;
+
+DECLARE TRUE LITERALLY '1', FALSE LITERALLY '0',
+ FOREVER LITERALLY 'WHILE TRUE',
+ CR LITERALLY '13',
+ LF LITERALLY '10',
+ WHAT LITERALLY '63';
+
+DECLARE
+ PRINTSUPPRESS BYTE; /* TRUE IF PRINT SUPPRESSED */
+
+PRINTCHAR: PROCEDURE(CHAR);
+ DECLARE CHAR BYTE;
+ IF PRINTSUPPRESS THEN RETURN;
+ CALL MON1(2,CHAR);
+ END PRINTCHAR;
+
+DECLARE
+ COLUMN BYTE, /* CONSOLE COLUMN POSITION */
+ SCOLUMN BYTE, /* STARTING COLUMN IN "I" MODE */
+ TCOLUMN BYTE, /* TEMP DURING BACKSPACE */
+ QCOLUMN BYTE; /* TEMP DURING BACKSPACE */
+
+TTYCHAR: PROCEDURE(CHAR);
+ DECLARE CHAR BYTE;
+ IF CHAR >= ' ' THEN COLUMN = COLUMN + 1;
+ IF CHAR = LF THEN COLUMN = 0;
+ CALL PRINTCHAR(CHAR);
+ END TTYCHAR;
+
+BACKSPACE: PROCEDURE;
+ /* MOVE BACK ONE POSITION */
+ IF COLUMN = 0 THEN RETURN;
+ CALL TTYCHAR(CTLH); /* COLUMN = COLUMN - 1 */
+ CALL TTYCHAR(' ' ); /* COLUMN = COLUMN + 1 */
+ CALL TTYCHAR(CTLH); /* COLUMN = COLUMN - 1 */
+ COLUMN = COLUMN - 2;
+ END BACKSPACE;
+
+PRINTABS: PROCEDURE(CHAR);
+ DECLARE (CHAR,I,J) BYTE;
+ I = CHAR = TAB AND 7 - (COLUMN AND 7);
+ IF CHAR = TAB THEN CHAR = ' ';
+ DO J = 0 TO I;
+ CALL TTYCHAR(CHAR);
+ END;
+ END PRINTABS;
+
+GRAPHIC: PROCEDURE(C) BYTE;
+ DECLARE C BYTE;
+ /* RETURN TRUE IF GRAPHIC CHARACTER */
+ IF C >= ' ' THEN RETURN TRUE;
+ RETURN C = CR OR C = LF OR C = TAB;
+ END GRAPHIC;
+
+PRINTC: PROCEDURE(C);
+ DECLARE C BYTE;
+ IF NOT GRAPHIC(C) THEN
+ DO; CALL PRINTABS('^');
+ C = C + '@';
+ END;
+ CALL PRINTABS(C);
+ END PRINTC;
+
+CRLF: PROCEDURE;
+ CALL PRINTC(CR); CALL PRINTC(LF);
+ END CRLF;
+
+PRINTM: PROCEDURE(A);
+ DECLARE A ADDRESS;
+ CALL MON1(9,A);
+ END PRINTM;
+
+PRINT: PROCEDURE(A);
+ DECLARE A ADDRESS;
+ CALL CRLF;
+ CALL PRINTM(A);
+ END PRINT;
+
+READ: PROCEDURE(A);
+ DECLARE A ADDRESS;
+ CALL MON1(10,A);
+ END READ;
+
+DECLARE DCNT BYTE;
+
+
+OPEN: PROCEDURE(FCB);
+ DECLARE FCB ADDRESS;
+ DCNT = MON2(15,FCB);
+ END OPEN;
+
+CLOSE: PROCEDURE(FCB);
+ DECLARE FCB ADDRESS;
+ DCNT = MON2(16,FCB);
+ END CLOSE;
+
+SEARCH: PROCEDURE(FCB);
+ DECLARE FCB ADDRESS;
+ DCNT = MON2(17,FCB);
+ END SEARCH;
+
+DELETE: PROCEDURE(FCB);
+ DECLARE FCB ADDRESS;
+ CALL MON1(19,FCB);
+ END DELETE;
+
+DISKREAD: PROCEDURE(FCB) BYTE;
+ DECLARE FCB ADDRESS;
+ RETURN MON2(20,FCB);
+ END DISKREAD;
+
+DISKWRITE: PROCEDURE(FCB) BYTE;
+ DECLARE FCB ADDRESS;
+ RETURN MON2(21,FCB);
+ END DISKWRITE;
+
+MAKE: PROCEDURE(FCB);
+ DECLARE FCB ADDRESS;
+ DCNT = MON2(22,FCB);
+ END MAKE;
+
+RENAME: PROCEDURE(FCB);
+ DECLARE FCB ADDRESS;
+ CALL MON1(23,FCB);
+ END RENAME;
+
+DECLARE (MAXLEN,COMLEN) BYTE, COMBUFF(128) BYTE,
+ (TCBP,CBP) BYTE;
+
+READCOM: PROCEDURE;
+ MAXLEN = 128; CALL READ(.MAXLEN);
+ END READCOM;
+
+BREAK$KEY: PROCEDURE BYTE;
+ IF MON2(11,0) THEN
+ DO; /* CLEAR CHAR */
+ CALL MON1(1,0); RETURN TRUE;
+ END;
+ RETURN FALSE;
+ END BREAK$KEY;
+
+CSELECT: PROCEDURE BYTE;
+ /* RETURN CURRENT DRIVE NUMBER */
+ RETURN MON2(25,0);
+ END CSELECT;
+
+SELECT: PROCEDURE(DISK);
+ DECLARE DISK BYTE;
+ /* SET DRIVE NUMBER */
+ CALL MON1(14,DISK);
+ END SELECT;
+
+SETDMA: PROCEDURE(A);
+ DECLARE A ADDRESS;
+ /* SET DMA ADDRESS */
+ CALL MON1(26,A);
+ END SETDMA;
+
+REBOOT: PROCEDURE;
+ IF XFERON THEN CALL DELETE(.XFCB);
+ CALL BOOT;
+ END REBOOT;
+
+DECLARE /* LINE COUNTERS */
+ BASELINE ADDRESS, /* CURRENT LINE */
+ RELLINE ADDRESS, /* RELATIVE LINE IN TYPEOUT */
+ LINESET BYTE; /* TRUE IF LINE #'S PRINTED */
+
+ /* INPUT / OUTPUT BUFFERING ROUTINES */
+
+/* THE PL/M BUILT-IN PROCEDURE "MOVE" IS USED TO MOVE STORAGE,
+ ITS DEFINITION IS:
+ MOVE: PROCEDURE(COUNT,SOURCE,DEST);
+ DECLARE (COUNT,SOURCE,DEST) ADDRESS;
+ / MOVE DATA FROM SOURCE TO DEST ADDRESSES, FOR COUNT BYTES /
+ END MOVE;
+ */
+
+ABORT: PROCEDURE(A);
+ DECLARE A ADDRESS;
+ CALL PRINT(A);
+ CALL CRLF;
+ CALL REBOOT;
+ END ABORT;
+
+FERR: PROCEDURE;
+ CALL CLOSE(.DFCB); /* ATTEMPT TO CLOSE FILE FOR LATER RECOVERY */
+ CALL ABORT (.('DISK OR DIRECTORY FULL$'));
+ END FERR;
+
+SETTYPE: PROCEDURE(A);
+ DECLARE A ADDRESS;
+ CALL MOVE(3,A,.DFCB+9);
+ END SETTYPE;
+
+SETUP: PROCEDURE;
+ NSOURCE = BUFFLENGTH; NDEST = 0;
+ SFCB(EX), SFCB(MD), SFCB(NR) = 0;
+ /* REEL AND RECORD ZEROED */
+ /* COPY NAME TO DESTINATION FCB */
+ CALL MOVE(33,.FCB,.DFCB);
+ /* SOURCE AND DESTINATION DISKS SET */
+
+ /* IF SOURCE AND DESTINATION DISKS DIFFER, CHECK FOR
+ AN EXISTING SOURCE FILE ON THE DESTINATION DISK - THERE
+ COULD BE A FATAL ERROR CONDITION WHICH COULD DESTROY A
+ FILE IF THE USER HAPPENED TO BE ADDRESSING THE WRONG
+ DISK */
+ IF SDISK <> DDISK THEN
+ DO; CALL SELECT(DDISK);
+ CALL SEARCH(.FCB);
+ IF DCNT <> 255 THEN /* SOURCE FILE PRESENT ON DEST DISK */
+ CALL ABORT(.('FILE EXISTS, ERASE IT$'));
+ END;
+ CALL SELECT(SDISK);
+ CALL OPEN(.FCB);
+ IF DCNT = 255 THEN
+ DO; CALL MAKE(.FCB);
+ IF DCNT = 255 THEN CALL FERR;
+ CALL PRINT(.('NEW FILE$'));
+ CALL CRLF;
+ END; ELSE
+ IF ROL(FCB(RO),1) THEN
+ DO;
+ CALL PRINT(.('** FILE IS READ/ONLY **$'));
+ CALL CRLF;
+ END; ELSE
+ IF ROL(FCB(SY),1) THEN
+ CALL ABORT(.('"SYSTEM" FILE NOT ACCESSIBLE$'));
+ CALL SETTYPE(.('BAK'));
+ CALL DELETE(.DFCB);
+ IF SDISK <> DDISK THEN
+ DO; /* REMOVE BAK FILES FROM DESTINATION DISK */
+ CALL SELECT(DDISK);
+ CALL DELETE(.DFCB);
+ END;
+ CALL SETTYPE(.('$$$'));
+ CALL DELETE(.DFCB);
+ CALL MAKE(.DFCB);
+ DFCB(32) = 0; /* NEXT RECORD IS ZERO */
+ IF DCNT = 255 THEN CALL FERR;
+ /* THE TEMP FILE IS NOW CREATED */
+ BASELINE = 1; /* START WITH LINE 1 */
+ END SETUP;
+
+XCLEAR: PROCEDURE;
+ /* CLEAR THE XFER FILE PARAMETERS */
+ XFERON, XFCBE, XFCBR, XBP = 0;
+ END XCLEAR;
+
+SETXDMA: PROCEDURE;
+ CALL SELECT(SDISK);
+ CALL SETDMA(.XBUFF);
+ END SETXDMA;
+
+FILLSOURCE: PROCEDURE;
+ DECLARE I BYTE;
+ ZN: PROCEDURE;
+ NSOURCE = 0;
+ END ZN;
+
+ CALL ZN;
+ CALL SELECT(SDISK);
+ DO I = 0 TO NBUF;
+ CALL SETDMA(SBUFFADR+NSOURCE);
+ IF (DCNT := DISKREAD(.FCB)) <> 0 THEN
+ DO; IF DCNT > 1 THEN CALL FERR;
+ SBUFF(NSOURCE) = ENDFILE;
+ I = NBUF;
+ END;
+ ELSE
+ NSOURCE = NSOURCE + SECTSIZE;
+ END;
+ CALL ZN;
+ END FILLSOURCE;
+
+GETSOURCE: PROCEDURE BYTE;
+ DECLARE B BYTE;
+ IF NSOURCE >= BUFFLENGTH THEN CALL FILLSOURCE;
+ IF (B := SBUFF(NSOURCE)) <> ENDFILE THEN
+ NSOURCE = NSOURCE + 1;
+ RETURN B;
+ END GETSOURCE;
+
+WRITEDEST: PROCEDURE;
+ /* WRITE OUTPUT BUFFER UP TO (NOT INCLUDING) NDEST.
+ LOW 7 BITS OF NDEST ARE ZERO */
+ DECLARE (I,N) BYTE;
+ ZN: PROCEDURE;
+ NDEST = 0;
+ END ZN;
+
+ CALL SELECT(DDISK);
+ IF LOW((N := SHR(NDEST,SECTSHF) - 1)) = 255 THEN RETURN;
+ CALL ZN;
+ DO I = 0 TO N;
+ CALL SETDMA(DBUFFADR+NDEST);
+ IF DISKWRITE(.DFCB) <> 0 THEN CALL FERR;
+ NDEST = NDEST + SECTSIZE;
+ END;
+ CALL ZN;
+ END WRITEDEST;
+
+PUTDEST: PROCEDURE(B);
+ DECLARE B BYTE;
+ IF NDEST >= BUFFLENGTH THEN CALL WRITEDEST;
+ DBUFF(NDEST) = B;
+ NDEST = NDEST + 1;
+ END PUTDEST;
+
+PUTXFER: PROCEDURE(C);
+ DECLARE C BYTE;
+ /* WRITE C TO XFER FILE */
+ IF XBP >= SECTSIZE THEN /* BUFFER OVERFLOW */
+ DO; CALL SETXDMA;
+ IF DISKWRITE(.XFCB) <> 0 THEN CALL FERR;
+ XBP = 0;
+ END;
+ XBUFF(XBP) = C; XBP = XBP + 1;
+ END PUTXFER;
+
+FINIS: PROCEDURE;
+ MOVEUP: PROCEDURE;
+ CALL MOVE(16,.DFCB,.DFCB+16);
+ END MOVEUP;
+
+ /* CLEAR OUTPUT */
+ DFUB = 0 ; /* SET UNFILLED BYTES - USED FOR ISIS-II COMPATIBILITY */
+ DO WHILE (LOW(NDEST) AND 7FH) <> 0;
+ DFUB = DFUB + 1; /* COUNTS UNFILLED BYTES IN LAST RECORD */
+ CALL PUTDEST(ENDFILE);
+ END;
+ CALL WRITEDEST;
+
+ CALL CLOSE(.DFCB);
+ IF DCNT = 255 THEN CALL FERR;
+ /* RENAME OLD FILE TO BAK */
+ CALL SETTYPE(.('BAK')); CALL MOVEUP;
+ CALL SELECT(SDISK);
+ CALL MOVE(16,.FCB,.DFCB);
+ CALL RENAME(.DFCB);
+ CALL MOVEUP;
+ /* RENAME $$$ TO OLD NAME */
+ CALL SETTYPE(.('$$$'));
+ CALL SELECT(DDISK);
+ CALL RENAME(.DFCB);
+ END FINIS;
+
+
+DECLARE
+ LPP LIT '23', /* LINES PER PAGE */
+ FORWARD LIT '1',
+ BACKWARD LIT '0',
+ RUBOUT LIT '07FH',
+ POUND LIT '23H',
+ MACSIZE LIT '128', /* MAX MACRO SIZE */
+ SCRSIZE LIT '100', /* SCRATCH BUFFER SIZE */
+ COMSIZE LIT 'ADDRESS'; /* DETERMINES MAX COMMAND NUMBER*/
+
+DCL MACRO(MACSIZE) BYTE,
+ SCRATCH(SCRSIZE) BYTE, /* SCRATCH BUFFER FOR F,N,S */
+ (WBP, WBE, WBJ) BYTE, /* END OF F STRING, S STRING, J STRING */
+ (FLAG, MP, MI, XP) BYTE,
+ MT COMSIZE;
+
+DCL (START, RESTART, OVERCOUNT, OVERFLOW, RESET, BADCOM) LABEL;
+
+DCL INSERTING BYTE, /* TRUE IF INSERTING CHARACTERS */
+ READBUFF BYTE; /* TRUE IF END OF READ BUFFER */
+
+DECLARE
+ EOS LITERALLY '0FFH';
+
+
+
+PRINTNMAC: PROCEDURE(CHAR);
+ DECLARE CHAR BYTE;
+ /* PRINT IF NOT IN MACRO EXPANSION */
+ IF MP <> 0 THEN RETURN;
+ CALL PRINTC(CHAR);
+ END PRINTNMAC;
+
+
+
+
+DECLARE TRANSLATE BYTE, /* TRUE IF TRANSLATION TO UPPER CASE */
+ UPPER BYTE; /* TRUE IF GLOBALLY TRANLATING TO UC */
+
+LOWERCASE: PROCEDURE(C) BYTE;
+ DECLARE C BYTE;
+ /* RETURN TRUE IF LOWER CASE ALPHABETIC */
+ RETURN C >= LCA AND C <= LCZ;
+ END LOWERCASE;
+
+UCASE: PROCEDURE(C) BYTE;
+ DECLARE C BYTE;
+ /* TRANSLATE C TO UPPER CASE */
+ IF LOWERCASE(C) THEN RETURN C AND 5FH;
+ RETURN C;
+ END UCASE;
+
+UTRAN: PROCEDURE(C) BYTE;
+ DECLARE C BYTE;
+ /* TRANSLATE TO UPPER CASE IF ALPHABETIC LOWER AND TRANSLATE */
+ IF TRANSLATE THEN RETURN UCASE(C);
+ RETURN C;
+ END UTRAN;
+
+PRINTVALUE: PROCEDURE(V);
+ /* PRINT THE LINE VALUE V */
+ DECLARE (D,ZERO) BYTE,
+ (K,V) ADDRESS;
+ K = 10000;
+ ZERO = FALSE;
+ DO WHILE K <> 0;
+ D = LOW(V/K); V = V MOD K;
+ K = K / 10;
+ IF ZERO OR D <> 0 THEN
+ DO; ZERO = TRUE;
+ CALL PRINTC('0'+D);
+ END; ELSE
+ CALL PRINTC(' ');
+ END;
+ END PRINTVALUE;
+
+PRINTLINE: PROCEDURE(V);
+ DECLARE V ADDRESS;
+ IF NOT LINESET THEN RETURN;
+ CALL PRINTVALUE(V);
+ CALL PRINTC(':');
+ CALL PRINTC(' ');
+ IF INSERTING THEN CALL PRINTC(' '); ELSE
+ CALL PRINTC('*');
+ END PRINTLINE;
+
+
+PRINTBASE: PROCEDURE;
+ CALL PRINTLINE(BASELINE);
+ END PRINTBASE;
+
+PRINTNMBASE: PROCEDURE;
+ IF MP <> 0 THEN RETURN;
+ CALL PRINTBASE;
+ END PRINTNMBASE;
+
+READC: PROCEDURE BYTE;
+ /* MAY BE MACRO EXPANSION */
+ IF MP > 0 THEN
+ DO;
+ IF BREAK$KEY THEN GO TO OVERCOUNT;
+ IF XP >= MP THEN
+ DO; /* START AGAIN */
+ IF MT <> 0 THEN
+ DO; IF (MT:=MT-1) = 0 THEN
+ GO TO OVERCOUNT;
+ END;
+ XP = 0;
+ END;
+ RETURN UTRAN(MACRO((XP := XP + 1) - 1));
+ END;
+ IF INSERTING THEN RETURN UTRAN(READCHAR);
+
+ /* GET COMMAND LINE */
+ IF READBUFF THEN
+ DO; READBUFF = FALSE;
+ IF LINESET AND COLUMN = 0 THEN
+ DO;
+ IF BACK >= MAXM THEN
+ CALL PRINTLINE(0); ELSE
+ CALL PRINTBASE;
+ END; ELSE
+ CALL PRINTC('*');
+ CALL READCOM; CBP = 0;
+ CALL PRINTC(LF);
+ COLUMN = 0;
+ END;
+ IF (READBUFF := CBP = COMLEN ) THEN COMBUFF(CBP) = CR;
+ RETURN UTRAN(COMBUFF((CBP := CBP +1) -1));
+ END READC;
+
+SETRDMA: PROCEDURE;
+ /* SET READ LIB DMA ADDRESS */
+ CALL SELECT(SDISK);
+ CALL SETDMA(.BUFF);
+ END SETRDMA;
+
+READFILE: PROCEDURE BYTE;
+ IF RBP >= SECTSIZE THEN
+ DO; CALL SETRDMA;
+ IF DISKREAD(.RFCB) <> 0 THEN RETURN ENDFILE;
+ RBP = 0;
+ END;
+ RETURN UTRAN(BUFF((RBP := RBP + 1) - 1));
+ END READFILE;
+
+DCL (DISTANCE, TDIST) COMSIZE,
+ (DIRECTION, CHAR) BYTE,
+ ( FRONT, BACK, FIRST, LAST) ADDR;
+
+SETFF: PROCEDURE;
+ DISTANCE = 0FFFFH;
+ END SETFF;
+
+DISTZERO: PROCEDURE BYTE;
+ /* RETURN TRUE IF DISTANCE IS ZERO */
+ RETURN DISTANCE = 0;
+ END DISTZERO;
+
+ZERODIST: PROCEDURE;
+ DISTANCE = 0;
+ END ZERODIST;
+
+DISTNZERO: PROCEDURE BYTE;
+ /* CHECK FOR ZERO DISTANCE AND DECREMENT */
+ IF NOT DISTZERO THEN
+ DO; DISTANCE = DISTANCE - 1;
+ RETURN TRUE;
+ END;
+ RETURN FALSE;
+ END DISTNZERO;
+
+SETLIMITS: PROC;
+ DCL (I,K,L,M) ADDR, (MIDDLE,LOOPING) BYTE;
+ RELLINE = 1; /* RELATIVE LINE COUNT */
+ IF DIRECTION = BACKWARD THEN
+ DO; DISTANCE = DISTANCE+1; I = FRONT; L = 0; K = 0FFFFH;
+ END; ELSE
+ DO; I = BACK; L = MAXM; K = 1;
+ END;
+
+ LOOPING = TRUE;
+ DO WHILE LOOPING;
+ DO WHILE (MIDDLE := I <> L) AND
+ MEMORY(M:=I+K) <> LF;
+ I = M;
+ END;
+ RELLINE = RELLINE - 1;
+ LOOPING = (DISTANCE := DISTANCE - 1) <> 0;
+ IF NOT MIDDLE THEN
+ DO; LOOPING = FALSE;
+ I = I - K;
+ END; ELSE
+ IF LOOPING THEN I = M;
+ END;
+
+ IF DIRECTION = BACKWARD THEN
+ DO; FIRST = I; LAST = FRONT - 1;
+ END; ELSE
+ DO; FIRST = BACK + 1; LAST = I + 1;
+ END;
+ END SETLIMITS;
+
+INCFRONT: PROC; FRONT = FRONT + 1;
+ END INCFRONT;
+INCBACK: PROCEDURE; BACK = BACK + 1;
+ END INCBACK;
+DECFRONT: PROC; FRONT = FRONT - 1;
+ END DECFRONT;
+DECBACK: PROC; BACK = BACK - 1;
+ END DECBACK;
+INCBASE: PROCEDURE;
+ BASELINE = BASELINE + 1;
+ END INCBASE;
+
+
+MEM$MOVE: PROC(MOVEFLAG);
+ DECLARE (MOVEFLAG,C) BYTE;
+ /* MOVE IF MOVEFLAG IS TRUE */
+ IF DIRECTION = FORWARD THEN
+ DO WHILE BACK < LAST; CALL INCBACK;
+ IF MOVEFLAG THEN
+ DO;
+ IF (C := MEMORY(BACK)) = LF THEN CALL INCBASE;
+ MEMORY(FRONT) = C; CALL INCFRONT;
+ END;
+ END; ELSE
+ DO WHILE FRONT > FIRST; CALL DECFRONT;
+ IF (C := MEMORY(FRONT)) = LF THEN BASELINE = BASELINE - 1;
+ IF MOVEFLAG THEN
+ DO; MEMORY(BACK) = C; CALL DECBACK;
+ END;
+ END;
+ END MEM$MOVE;
+
+MOVER: PROC;
+ CALL MEM$MOVE(TRUE);
+ END MOVER;
+
+SETPTRS: PROC;
+ CALL MEM$MOVE(FALSE);
+ END SETPTRS;
+
+MOVELINES: PROC;
+ CALL SETLIMITS;
+ CALL MOVER;
+ END MOVELINES;
+
+SETCLIMITS: PROC;
+ IF DIRECTION = BACKWARD THEN
+ DO; LAST = BACK;
+ IF DISTANCE > FRONT THEN
+ FIRST = 1; ELSE FIRST = FRONT - DISTANCE;
+ END; ELSE
+ DO; FIRST = FRONT;
+ IF DISTANCE >= MAX - BACK THEN
+ LAST = MAXM; ELSE LAST = BACK + DISTANCE;
+ END;
+ END SETCLIMITS;
+
+READLINE: PROCEDURE;
+ DECLARE B BYTE;
+ /* READ ANOTHER LINE OF INPUT */
+ CTRAN: PROCEDURE(B) BYTE;
+ DECLARE B BYTE;
+ /* CONDITIONALLY TRANSLATE TO UPPER CASE ON INPUT */
+ IF UPPER THEN RETURN UTRAN(B);
+ RETURN B;
+ END CTRAN;
+ DO FOREVER;
+ IF FRONT >= BACK THEN GO TO OVERFLOW;
+ IF (B := CTRAN(GETSOURCE)) = ENDFILE THEN
+ DO; CALL ZERODIST; RETURN;
+ END;
+ MEMORY(FRONT) = B;
+ CALL INCFRONT;
+ IF B = LF THEN
+ DO; CALL INCBASE;
+ RETURN;
+ END;
+ END;
+ END READLINE;
+
+WRITELINE: PROCEDURE;
+ /* WRITE ONE LINE OUT */
+ DECLARE B BYTE;
+ DO FOREVER;
+ IF BACK >= MAXM THEN /* EMPTY */
+ DO; CALL ZERODIST; RETURN;
+ END;
+ CALL INCBACK;
+ CALL PUTDEST(B:=MEMORY(BACK));
+ IF B = LF THEN
+ DO; CALL INCBASE;
+ RETURN;
+ END;
+ END;
+ END WRITELINE;
+
+WRHALF: PROCEDURE;
+ /* WRITE LINES UNTIL AT LEAST HALF THE BUFFER IS EMPTY */
+ CALL SETFF;
+ DO WHILE DISTNZERO;
+ IF HMAX >= (MAXM - BACK) THEN CALL ZERODIST; ELSE
+ CALL WRITELINE;
+ END;
+ END WRHALF;
+
+WRITEOUT: PROCEDURE;
+ /* WRITE LINES DETERMINED BY 'DISTANCE',
+ CALLED FROM W AND E COMMANDS */
+ DIRECTION = BACKWARD; FIRST = 1; LAST = BACK;
+ CALL MOVER;
+ IF DISTZERO THEN CALL WRHALF;
+ /* DISTANCE = 0 IF CALL WRHALF */
+ DO WHILE DISTNZERO;
+ CALL WRITELINE;
+ END;
+ IF BACK < LAST THEN
+ DO; DIRECTION = FORWARD; CALL MOVER;
+ END;
+ END WRITEOUT;
+
+CLEARMEM: PROCEDURE;
+ /* CLEAR MEMORY BUFFER */
+ CALL SETFF;
+ CALL WRITEOUT;
+ END CLEARMEM;
+
+TERMINATE: PROCEDURE;
+ /* CLEAR BUFFERS */
+ CALL CLEARMEM;
+ DO WHILE (CHAR := GETSOURCE) <> ENDFILE;
+ CALL PUTDEST(CHAR);
+ END;
+ CALL FINIS;
+ END TERMINATE;
+
+
+INSERT: PROCEDURE;
+ /* INSERT CHAR INTO MEMORY BUFFER */
+ IF FRONT = BACK THEN GO TO OVERFLOW;
+ MEMORY(FRONT) = CHAR; CALL INCFRONT;
+ IF CHAR = LF THEN CALL INCBASE;
+ END INSERT;
+
+SCANNING: PROCEDURE BYTE;
+ /* READ A CHARACTER AND CHECK FOR ENDFILE OR CR */
+ RETURN NOT ((CHAR := READC) = ENDFILE OR
+ (CHAR = CR AND NOT INSERTING));
+ END SCANNING;
+
+COLLECT: PROCEDURE;
+ /* READ COMMAND BUFFER AND INSERT CHARACTERS INTO
+ SCRATCH 'TIL NEXT CONTROL-Z OR CR FOR FIND, NEXT, JUXT, OR
+ SUBSTITUTE COMMANDS - FILL AT WBE AND INCREMENT WBE SO IT
+ ADDRESSES NEXT EMPTY POSITION OF SCRATCH */
+ SETSCR: PROCEDURE;
+ SCRATCH(WBE) = CHAR;
+ IF (WBE := WBE + 1) >= SCRSIZE THEN GO TO OVERFLOW;
+ END SETSCR;
+ DO WHILE SCANNING;
+ IF CHAR = CTLL THEN
+ DO; CHAR = CR; CALL SETSCR;
+ CHAR = LF;
+ END;
+ IF CHAR = 0 THEN GO TO BADCOM;
+ CALL SETSCR;
+ END;
+ END COLLECT;
+
+FIND: PROCEDURE(PA,PB) BYTE;
+ DECLARE (PA,PB) BYTE;
+ /* FIND THE STRING IN SCRATCH STARTING AT PA AND ENDING AT PB */
+ DECLARE J ADDRESS,
+ (K, MATCH) BYTE;
+ J = BACK ;
+ MATCH = FALSE;
+ DO WHILE NOT MATCH AND (MAXM > J);
+ LAST,J = J + 1; /* START SCAN AT J */
+ K = PA ; /* ATTEMPT STRING MATCH AT K */
+ DO WHILE SCRATCH(K) = MEMORY(LAST) AND
+ NOT (MATCH := K = PB);
+ /* MATCHED ONE MORE CHARACTER */
+ K = K + 1; LAST = LAST + 1;
+ END;
+ END;
+ IF MATCH THEN /* MOVE STORAGE */
+ DO; LAST = LAST - 1; CALL MOVER;
+ END;
+ RETURN MATCH;
+ END FIND;
+
+SETFIND: PROCEDURE;
+ /* SETUP THE SEARCH STRING FOR F,N, AND S COMMANDS */
+ WBE = 0; CALL COLLECT; WBP = WBE;
+ END SETFIND;
+
+CHKFOUND: PROCEDURE;
+ /* CHECK FOR FOUND STRING IN F AND S COMMANDS */
+ IF NOT FIND(0,WBP) THEN /* NO MATCH */ GO TO OVERCOUNT;
+ END CHKFOUND;
+
+
+
+SETRFCB: PROCEDURE;
+ /* PLACE CHAR INTO READ FILE CONTROL BLOCK AND INCREMENT */
+ RFCB((RBP := RBP + 1) - 1) = UCASE(CHAR);
+ END SETRFCB;
+
+PRINTREL: PROCEDURE;
+ CALL PRINTLINE(BASELINE+RELLINE);
+ END PRINTREL;
+
+TYPELINES: PROCEDURE;
+ DCL I ADDR;
+ DCL C BYTE;
+ CALL SETLIMITS;
+ /* DISABLE THE * PROMPT */
+ INSERTING = TRUE;
+ IF DIRECTION = FORWARD THEN
+ DO; RELLINE = 0; I = FRONT;
+ END; ELSE
+ I = FIRST;
+ IF (C := MEMORY(I-1)) = LF AND COLUMN <> 0 THEN
+ CALL CRLF;
+ DO I = FIRST TO LAST;
+ IF C = LF THEN
+ DO;
+ CALL PRINTREL;
+ RELLINE = RELLINE + 1;
+ IF BREAK$KEY THEN GO TO OVERCOUNT;
+ END;
+ CALL PRINTC(C:=MEMORY(I));
+ END;
+ END TYPELINES;
+
+SETLPP: PROCEDURE;
+ /* SET DISTANCE TO LINES PER PAGE */
+ DISTANCE = LPP;
+ END SETLPP;
+
+SAVEDIST: PROCEDURE;
+ TDIST = DISTANCE;
+ END SAVEDIST;
+
+RESTDIST: PROCEDURE;
+ DISTANCE = TDIST;
+ END RESTDIST;
+
+PAGE: PROCEDURE;
+ DECLARE I BYTE;
+ CALL SAVEDIST;
+ CALL SETLPP;
+ CALL MOVELINES;
+ I = DIRECTION;
+ DIRECTION = FORWARD;
+ CALL SETLPP;
+ CALL TYPELINES;
+ DIRECTION = I;
+ IF LAST = MAXM OR FIRST = 1 THEN CALL ZERODIST;
+ ELSE CALL RESTDIST;
+ END PAGE;
+
+WAIT: PROCEDURE;
+ /* 1/2 SECOND TIME OUT */
+ DECLARE I BYTE;
+ DO I = 0 TO 19;
+ IF BREAK$KEY THEN GO TO RESET;
+ CALL TIME(250);
+ END;
+ END WAIT;
+
+SETFORWARD: PROCEDURE;
+ DIRECTION = FORWARD;
+ DISTANCE = 1;
+ END SETFORWARD;
+
+APPHALF: PROCEDURE;
+ /* APPEND 'TIL BUFFER IS AT LEAST HALF FULL */
+ CALL SETFF; /* DISTANCE = 0FFFFH */
+ DO WHILE DISTNZERO;
+ IF FRONT >= HMAX THEN CALL ZERODIST; ELSE
+ CALL READLINE;
+ END;
+ END APPHALF;
+
+INSCRLF: PROCEDURE;
+ /* INSERT CR LF CHARACTERS */
+ CHAR = CR; CALL INSERT;
+ CHAR = LF; CALL INSERT;
+ END INSCRLF;
+
+TESTCASE: PROCEDURE;
+ DECLARE T BYTE;
+ /* TEST FOR UPPER OR LOWER CASE COMMAND AND SET TRANSLATE
+ FLAG (USED TO DETERMINE IF CHARACTERS WHICH FOLLOW GO TO UPPER */
+ TRANSLATE = TRUE;
+ T = LOWERCASE(CHAR);
+ CHAR = UTRAN(CHAR);
+ TRANSLATE = UPPER OR NOT T;
+ END TESTCASE;
+
+READCTRAN: PROCEDURE;
+ /* SET TRANSLATE TO FALSE AND READ NEXT CHARACTER */
+ TRANSLATE = FALSE;
+ CHAR = READC;
+ CALL TESTCASE;
+ END READCTRAN;
+
+SINGLECOM: PROCEDURE(C) BYTE;
+ /* RETURN TRUE IF COMMAND IS ONLY CHARACTER, NOT IN MACRO */
+ DECLARE C BYTE;
+ RETURN CHAR = C AND COMLEN = 1 AND MP = 0;
+ END SINGLECOM;
+
+SINGLERCOM: PROCEDURE(C) BYTE;
+ DECLARE C BYTE;
+ /* RETURN TRUE IF COMMAND IS ONLY CHARACTER, NOT IN MACRO, AND
+ THE OPERATOR HAS RESPONDED WITH 'Y' TO A Y/N REQUEST */
+ IF SINGLECOM(C) THEN
+ DO; CALL CRLF; CALL PRINTCHAR(C);
+ CALL MON1(9,.('-(Y/N)',WHAT,'$'));
+ C = UCASE(READCHAR); CALL CRLF;
+ IF C <> 'Y' THEN GO TO START;
+ RETURN TRUE;
+ END;
+ RETURN FALSE;
+ END SINGLERCOM;
+
+
+
+
+
+
+ /* INITIALIZE THE SYSTEM */
+
+EDCOMMAND: /* PAST LXI SP,STACK */
+ /* I/O BUFFER REGION IS 1/8 AVAILABLE MEMORY */
+ NBUF = SHR(MAX := MAXB - .MEMORY,SECTSHF+3) - 1;
+ /* NBUF IS NUMBER OF BUFFERS - 1 */
+ BUFFLENGTH = SHL(DOUBLE(NBUF+1),SECTSHF+1);
+ /* NOW SET MAX AS REMAINDER OF FREE MEMORY */
+ IF BUFFLENGTH + 1024 > MAX THEN
+ DO; CALL PRINT(.('NO MEMORY$'));
+ CALL BOOT;
+ END;
+ /* REMOVE BUFFER SPACE AND 00 AT END OF MEMORY VECTOR */
+ MAX = MAX - BUFFLENGTH - 1;
+ /* RESET BUFFER LENGTH FOR I AND O */
+ BUFFLENGTH = SHR(BUFFLENGTH,1);
+ SBUFFADR = MAXB - BUFFLENGTH;
+ DBUFFADR = SBUFFADR - BUFFLENGTH;
+ MEMORY(MAX) = 0; /* STOPS MATCH AT END OF BUFFER */
+ MAXM = MAX - 1;
+ HMAX = SHR(MAXM,1);
+ /* NO TRANSLATE, WITH LINE NUMBERS */
+ UPPER, PRINTSUPPRESS = FALSE;
+ LINESET = TRUE;
+ /* GET SOURCE AND DESTINATION DISKS */
+ IF (FCB(1) = ' ') OR (FCB(17) <> ' ') THEN CALL FERR;
+ IF (SDISK := FCB(0)) = 0 THEN SDISK = CSELECT; ELSE
+ DO; SDISK = SDISK - 1; FCB(0) = 0; /* CLEAR DISK NAME */
+ END;
+ IF (DDISK := FCB(16)) = 0 THEN DDISK = SDISK; ELSE
+ DDISK = DDISK - 1;
+ /* CLEAR THE XFER FILE */
+ CALL XCLEAR;
+
+RESTART:
+ CALL SETUP;
+ MEMORY(0) = LF;
+ FRONT = 1; BACK = MAXM;
+ COLUMN = 0;
+ GO TO START;
+
+OVERCOUNT: FLAG = POUND; GO TO RESET;
+
+BADCOM: FLAG = WHAT; GO TO RESET;
+
+OVERFLOW: /* ARRIVE HERE ON OVERFLOW CONDITION (I,F,S COMMAND) */
+ FLAG = '>';
+
+RESET: /* ARRIVE HERE ON ERROR CONDITION */
+ PRINTSUPPRESS = FALSE;
+ CALL PRINT(.('BREAK "$'));
+ CALL PRINTC(FLAG);
+ CALL PRINTM(.('" AT $'));
+ CALL PRINTC(CHAR);
+ CALL CRLF;
+
+
+START:
+ READBUFF = TRUE;
+ MP = 0;
+
+
+ DO FOREVER; /* OR UNTIL THE POWER IS TURNED OFF */
+
+ /* **************************************************************
+ SIMPLE COMMANDS (CANNOT BE PRECEDED BY DIRECTION/DISTANCE):
+ E END THE EDIT NORMALLY
+ H MOVE TO HEAD OF EDITED FILE
+ I INSERT CHARACTERS
+ O RETURN TO THE ORIGINAL FILE
+ R READ FROM LIBRARY FILE
+ Q QUIT EDIT WITHOUT CHANGES TO ORIGINAL FILE
+ ************************************************************** */
+
+
+
+ INSERTING = FALSE;
+ CALL READCTRAN;
+ MI = CBP; /* SAVE STARTING ADDRESS FOR COMMAND */
+ IF SINGLECOM('E') THEN
+ DO; CALL TERMINATE;
+ IF SDISK <> DDISK THEN /* CHANGE DISKS */
+ /* USER CODE IN HIGH NIBBLE */
+ BDISK = (BDISK AND 0F0H) OR (DDISK AND 0FH);
+ CALL REBOOT;
+ END; ELSE
+
+
+ IF SINGLECOM('H') THEN /* GO TO TOP */
+ DO; CALL TERMINATE;
+ CHAR = DDISK; DDISK = SDISK; SDISK = CHAR;
+ /* PING - PONG DISKS */
+ GO TO RESTART;
+ END; ELSE
+
+
+ IF CHAR = 'I' THEN /* INSERT CHARACTERS */
+ DO;
+ IF (INSERTING := (CBP = COMLEN) AND (MP = 0)) THEN
+ CALL PRINTNMBASE;
+ SCOLUMN = COLUMN; /* STARTING COLUMN POSITION */
+ DO WHILE SCANNING;
+ DO WHILE CHAR <> 0;
+ IF CHAR=CTLU OR CHAR=CTLX OR CHAR=CTLR THEN
+ /* LINE DELETE OR RETYPE */
+ DO;
+ DISTANCE = 0; DIRECTION = BACKWARD;
+ /* ELIMINATE OR REPEAT THE LINE */
+ IF CHAR = CTLR THEN
+ DO; CALL CRLF;
+ CALL TYPELINES;
+ END; ELSE
+ /* LINE DELETE */
+ DO; CALL SETLIMITS; CALL SETPTRS;
+ IF CHAR = CTLU THEN
+ DO; CALL CRLF; CALL PRINTNMBASE;
+ END; ELSE
+ /* MUST BE CTLX */
+ DO WHILE COLUMN > SCOLUMN;
+ CALL BACKSPACE;
+ END;
+ END;
+ END; ELSE
+ IF CHAR = CTLH THEN
+ DO;
+ IF (TCOLUMN := COLUMN) > 0 THEN
+ CALL PRINTNMAC(' '); /* RESTORE AFT BACKSP */
+ IF FRONT > 1 AND TCOLUMN > SCOLUMN THEN
+ DO;
+ IF MEMORY(FRONT-1) <> LF THEN
+ DO; /* CHARACTER CAN BE ELIMINATED */
+ CALL DECFRONT;
+ PRINTSUPPRESS = TRUE;
+ /* BACKSPACE CHARACTER ACCEPTED */
+ COLUMN = 0;
+ DISTANCE = 0; DIRECTION = BACKWARD;
+ CALL TYPELINES;
+ PRINTSUPPRESS = FALSE;
+ /* COLUMN POSITION NOW RESET */
+ IF (QCOLUMN := COLUMN) < SCOLUMN THEN
+ QCOLUMN = SCOLUMN;
+ COLUMN = TCOLUMN; /* ORIGINAL VALUE */
+ DO WHILE COLUMN > QCOLUMN;
+ CALL BACKSPACE;
+ END;
+ TCOLUMN = COLUMN;
+ END;
+ END;
+ CHAR = 0;
+ COLUMN = TCOLUMN;
+ END; ELSE
+ IF CHAR = RUBOUT THEN
+ DO; IF FRONT = 1 THEN GO TO RESET;
+ CALL DECFRONT; CALL PRINTC(CHAR:=MEMORY(FRONT));
+ IF CHAR = LF THEN BASELINE=BASELINE-1;
+ CHAR = 0;
+ END; ELSE
+ /* NOT A SPECIAL CASE */
+ DO; IF NOT GRAPHIC(CHAR) THEN
+ DO; CALL PRINTNMAC('^');
+ CALL PRINTNMAC(CHAR + '@');
+ END;
+ IF CHAR = CTLL THEN
+ CALL INSCRLF; ELSE
+ DO; /* COLUMN COUNT GOES UP IF GRAPHIC */
+ /* COMPUTE OUTPUT COLUMN POSITION */
+ IF MP = 0 THEN
+ DO; IF CHAR >= ' ' THEN
+ COLUMN = COLUMN + 1; ELSE
+ IF CHAR = TAB THEN
+ COLUMN = COLUMN + (8 - (COLUMN AND 111B));
+ END;
+ CALL INSERT;
+ END;
+ END;
+ IF CHAR = LF THEN CALL PRINTNMBASE;
+ IF CHAR = CR THEN
+ CALL PRINTNMAC(CHAR:=LF); ELSE CHAR = 0;
+ END;
+ END;
+ IF CHAR <> ENDFILE THEN /* MUST HAVE STOPPED ON CR */
+ CALL INSCRLF;
+ IF INSERTING AND LINESET THEN CALL CRLF;
+ END; ELSE
+
+
+ IF SINGLERCOM('O') THEN /* FORGET THIS EDIT */
+ GO TO RESTART; ELSE
+
+
+ IF CHAR = 'R' THEN
+ DO; DECLARE I BYTE;
+ /* READ FROM LIB FILE */
+ RBP = 1; CALL SETRDMA;
+ DO WHILE SCANNING;
+ IF RBP > 8 THEN GO TO OVERCOUNT;
+ CALL SETRFCB;
+ END;
+ CHAR = ' ';
+ IF (FLAG := RBP = 1) THEN /* READ FROM XFER FILE */
+ DO;
+ CALL MOVE(8,.XFCB(1),.RFCB(1));
+ CALL CLOSE(.XFCB);
+ END; ELSE /* LIB NAME SPECIFIED */
+ DO WHILE RBP <= 8;
+ CALL SETRFCB;
+ END;
+ RFCB(12), RFCB(32) = 0; /* FILL REEL, AND NEXT RECORD */
+ CALL OPEN(.RFCB); RBP = SECTSIZE;
+ IF DCNT = 255 THEN
+ DO; FLAG = 'O'; GO TO RESET;
+ END;
+ DO WHILE (CHAR := READFILE) <> ENDFILE;
+ CALL INSERT;
+ END;
+ I = 0;
+ IF FLAG THEN /* MAY BE XFER DATA IN BUFFER */
+ DO WHILE I < XBP;
+ CHAR = XBUFF(I); I = I + 1;
+ CALL INSERT;
+ END;
+ END; ELSE
+
+
+ IF SINGLERCOM('Q') THEN
+ DO; CALL DELETE(.DFCB); CALL REBOOT;
+ END; ELSE
+
+
+
+ /* MAY BE A COMMAND WHICH HAS AN OPTIONAL DIRECTION AND DISTANCE */
+ DO; /* SCAN A SIGNED INTEGER VALUE (IF ANY) */
+ DCL I BYTE;
+
+ DIGIT: PROCEDURE BYTE;
+ RETURN (I := CHAR - '0') <= 9;
+ END DIGIT;
+
+ NUMBER: PROCEDURE;
+ DISTANCE = 0;
+ DO WHILE DIGIT;
+ DISTANCE = SHL(DISTANCE,3) +
+ SHL(DISTANCE,1) + I;
+ CALL READCTRAN;
+ END;
+ /* RETURN WITH DISTANCE = NUMBER, CHAR = NEXT */
+ END NUMBER;
+
+ RELDISTANCE: PROCEDURE;
+ IF DISTANCE > BASELINE THEN
+ DO; DIRECTION = FORWARD;
+ DISTANCE = DISTANCE - BASELINE;
+ END; ELSE
+ DO; DIRECTION = BACKWARD;
+ DISTANCE = BASELINE - DISTANCE;
+ END;
+ END RELDISTANCE;
+
+ CALL SETFORWARD;
+
+ IF CHAR = '-' THEN
+ DO; CALL READCTRAN; DIRECTION = BACKWARD;
+ END;
+
+ IF CHAR = POUND THEN
+ DO; CALL SETFF; CALL READCTRAN;
+ END; ELSE
+
+ IF DIGIT THEN
+ DO; CALL NUMBER;
+ /* MAY BE ABSOLUTE LINE REFERENCE */
+ IF CHAR = ':' THEN
+ DO; CHAR = 'L';
+ CALL RELDISTANCE;
+ END;
+ END; ELSE
+
+ IF CHAR = ':' THEN /* LEADING COLON */
+ DO; CALL READCTRAN; /* CLEAR THE COLON */
+ CALL NUMBER;
+ CALL RELDISTANCE;
+ IF DIRECTION = FORWARD THEN
+ DISTANCE = DISTANCE + 1;
+ END;
+
+ IF DISTZERO THEN DIRECTION = BACKWARD;
+ /* DIRECTION AND DISTANCE ARE NOW SET */
+
+
+ /* **************************************************************
+ MAY BE A COMMAND WHICH HAS DIRECTION AND DISTANCE SPECIFIED:
+ B BEGINNING/BOTTOM OF BUFFER
+ C MOVE CHARACTER POSITIONS
+ D DELETE CHARACTERS
+ K KILL LINES
+ L MOVE LINE POSITION
+ P PAGE UP OR DOWN (LPP LINES AND PRINT)
+ T TYPE LINES
+ U UPPER CASE TRANSLATE
+ V VERIFY LINE NUMBERS
+ MOVE UP OR DOWN LINES AND PRINT LINE
+ ************************************************************** */
+
+
+ IF CHAR = 'B' THEN
+ DO; DIRECTION = 1 - DIRECTION;
+ FIRST = 1; LAST = MAXM; CALL MOVER;
+ END; ELSE
+
+
+ IF CHAR = 'C' THEN
+ DO; CALL SETCLIMITS; CALL MOVER;
+ END; ELSE
+
+
+ IF CHAR = 'D' THEN
+ DO; CALL SETCLIMITS;
+ CALL SETPTRS; /* SETS BACK/FRONT */
+ END; ELSE
+
+
+ IF CHAR = 'K' THEN
+ DO; CALL SETLIMITS;
+ CALL SETPTRS;
+ END; ELSE
+
+
+ IF CHAR = 'L' THEN CALL MOVELINES; ELSE
+
+ IF CHAR = 'P' THEN /* PAGE MODE PRINT */
+ DO; IF DISTZERO THEN
+ DO; DIRECTION = FORWARD;
+ CALL SETLPP; CALL TYPELINES;
+ END; ELSE
+ DO WHILE DISTNZERO; CALL PAGE;
+ CALL WAIT;
+ END;
+ END; ELSE
+
+
+ IF CHAR = 'T' THEN
+ CALL TYPELINES; ELSE
+
+
+
+ IF CHAR = 'U' THEN
+ UPPER = DIRECTION = FORWARD; ELSE
+
+ IF CHAR = 'V' THEN
+ DO; /* 0V DISPLAYS BUFFER STATE */
+ IF DISTZERO THEN
+ DO; CALL PRINTVALUE(BACK-FRONT);
+ CALL PRINTC('/');
+ CALL PRINTVALUE(MAXM);
+ CALL CRLF;
+ END; ELSE
+ LINESET = DIRECTION = FORWARD;
+ END; ELSE
+
+ IF CHAR = CR THEN /* MAY BE MOVE/TYPE COMMAND */
+ DO;
+ IF MI = 1 AND MP = 0 THEN /* FIRST COMMAND */
+ DO; CALL MOVELINES; CALL SETFORWARD; CALL TYPELINES;
+ END;
+ END; ELSE
+
+ IF DIRECTION = FORWARD OR DISTZERO THEN
+ DO;
+
+ /* **************************************************************
+ COMMANDS WHICH ALLOW ONLY A PRECEDING NUMBER:
+ A APPEND LINES
+ F FIND NTH OCCURRENCE
+ M APPLY MACRO
+ N SAME AS F WITH AUTOSCAN THROUGH FILE
+ S PERFORM N SUBSTITUTIONS
+ W WRITE LINES TO OUTPUT FILE
+ X TRANSFER (XFER) LINES TO TEMP FILE
+ Z SLEEP
+ ************************************************************** */
+
+
+
+ IF CHAR = 'A' THEN
+ DO; DIRECTION = FORWARD;
+ FIRST = FRONT; LAST = MAXM; CALL MOVER;
+ /* ALL STORAGE FORWARD */
+ IF DISTZERO THEN CALL APPHALF;
+ /* DISTANCE = 0 IF APPHALF CALLED */
+ DO WHILE DISTNZERO;
+ CALL READLINE;
+ END;
+ DIRECTION = BACKWARD; CALL MOVER;
+ /* POINTERS REPOSITIONED */
+ END; ELSE
+
+
+ IF CHAR = 'F' THEN
+ DO; CALL SETFIND; /* SEARCH STRING SCANNED
+ AND SETUP BETWEEN 0 AND WBP-1 IN SCRATCH */
+ DO WHILE DISTNZERO; CALL CHKFOUND;
+ END;
+ END; ELSE
+
+
+ IF CHAR = 'J' THEN /* JUXTAPOSITION OPERATION */
+ DO; DECLARE T ADDRESS;
+ CALL SETFIND; CALL COLLECT;
+ WBJ = WBE; CALL COLLECT;
+ /* SEARCH FOR STRING 0 - WBP-1, INSERT STRING WBP TO WBJ-1,
+ AND THEN DELETE UP TO STRING WBJ TO WBE-1 */
+ DO WHILE DISTNZERO; CALL CHKFOUND;
+ /* INSERT STRING */ MI = WBP - 1;
+ DO WHILE (MI := MI + 1) < WBJ;
+ CHAR = SCRATCH(MI); CALL INSERT;
+ END;
+ T = FRONT; /* SAVE POSITION FOR DELETE */
+ IF NOT FIND(WBJ,WBE) THEN GO TO OVERCOUNT;
+ /* STRING FOUND, SO MOVE IT BACK */
+ FIRST = FRONT - (WBE - WBJ);
+ DIRECTION = BACKWARD; CALL MOVER;
+ /* NOW REMOVE THE INTERMEDIATE STRING */
+ FRONT = T;
+ END;
+ END; ELSE
+
+
+ IF CHAR = 'M' AND MP = 0 THEN /* MACRO DEFINITION */
+ DO; XP = 255;
+ IF DISTANCE = 1 THEN CALL ZERODIST;
+ DO WHILE (MACRO(XP := XP + 1) := READC) <> CR;
+ END;
+ MP = XP; XP = 0; MT = DISTANCE;
+ END; ELSE
+
+
+ IF CHAR = 'N' THEN
+ DO; /* SEARCH FOR STRING WITH AUTOSCAN */
+ CALL SETFIND; /* SEARCH STRING SCANNED */
+ DO WHILE DISTNZERO;
+ /* FIND ANOTHER OCCURRENCE OF STRING */
+ DO WHILE NOT FIND(0,WBP); /* NOT IN BUFFER */
+ IF BREAK$KEY THEN GO TO RESET;
+ CALL SAVEDIST; CALL CLEARMEM;
+ /* MEMORY BUFFER WRITTEN */
+ CALL APPHALF;
+ DIRECTION = BACKWARD; FIRST = 1; CALL MOVER;
+ CALL RESTDIST; DIRECTION = FORWARD;
+ /* MAY BE END OF FILE */
+ IF BACK >= MAXM THEN GO TO OVERCOUNT;
+ END;
+ END;
+ END; ELSE
+
+
+ IF CHAR = 'S' THEN /* SUBSTITUTE COMMAND */
+ DO; CALL SETFIND;
+ CALL COLLECT;
+ /* FIND STRING FROM 0 TO WBP-1, SUBSTITUTE STRING
+ BETWEEN WBP AND WBE-1 IN SCRATCH */
+ DO WHILE DISTNZERO;
+ CALL CHKFOUND;
+ /* FRONT AND BACK NOW POSITIONED AT FOUND
+ STRING - REPLACE IT */
+ FRONT = FRONT - (MI := WBP); /* BACKED UP */
+ DO WHILE MI < WBE;
+ CHAR = SCRATCH(MI);
+ MI = MI + 1; CALL INSERT;
+ END;
+ END;
+ END; ELSE
+
+
+ IF CHAR = 'W' THEN
+ CALL WRITEOUT; ELSE
+
+ IF CHAR = 'X' THEN /* TRANSFER LINES */
+ DO;
+ CALL SETXDMA;
+ IF DISTZERO THEN /* CLEAR THE FILE */
+ DO; CALL XCLEAR;
+ CALL DELETE(.XFCB);
+ END; ELSE
+ /* TRANSFER LINES */
+ DO; DECLARE I ADDRESS;
+ IF NOT XFERON THEN /* CREATE XFER FILE */
+ DO; CALL XCLEAR;
+ XFERON = TRUE;
+ CALL DELETE(.XFCB); /* OLD VERSION GONE */
+ CALL MAKE(.XFCB);
+ IF DCNT = 255 THEN CALL FERR;
+ END;
+ CALL SETLIMITS;
+ DO I = FIRST TO LAST;
+ CALL PUTXFER(MEMORY(I));
+ END;
+ END;
+ END; ELSE
+
+ IF CHAR = 'Z' THEN /* SLEEP */
+ DO;
+ IF DISTZERO THEN
+ DO; IF READCHAR = ENDFILE THEN GO TO RESET;
+ END;
+ DO WHILE DISTNZERO; CALL WAIT;
+ END;
+ END; ELSE
+ IF CHAR <> 0 THEN /* NOT BREAK LEFT OVER FROM STOP */
+ /* DIRECTION FORWARD, BUT NOT ONE OF THE ABOVE */
+ GO TO BADCOM;
+
+
+ END; ELSE /* DIRECTION NOT FORWARD */
+ GO TO BADCOM;
+ END;
+ END;
+END;
+
\ No newline at end of file
diff --git a/cpm/pcpm/PIP.PLM b/cpm/pcpm/PIP.PLM
new file mode 100644
index 0000000..d17c817
--- /dev/null
+++ b/cpm/pcpm/PIP.PLM
@@ -0,0 +1,1509 @@
+PIPMOD:
+DO;
+/* P E R I P H E R A L I N T E R C H A N G E P R O G R A M
+
+ COPYRIGHT (C) 1976, 1977, 1978, 1979, 1980, 1984
+ DIGITAL RESEARCH
+ BOX 579
+ PACIFIC GROVE, CA
+ 93950
+ */
+
+DECLARE
+ CPMVERSION LITERALLY '0028H'; /* REQUIRED FOR OPERATION */
+
+DECLARE
+ MAXB ADDRESS EXTERNAL, /* ADDR FIELD OF JMP BDOS */
+ FCB (33) BYTE EXTERNAL, /* DEFAULT FILE CONTROL BLOCK */
+ BUFF(128)BYTE EXTERNAL; /* DEFAULT BUFFER */
+
+DECLARE
+ ENDFILE LITERALLY '1AH', /* END OF FILE MARK */
+ JMP LITERALLY '0C3H', /* 8080 JUMP INSTRUCTION */
+ RET LITERALLY '0C9H'; /* 8080 RETURN */
+
+/* THE FIRST PORTION OF THE PIP PROGRAM 'FAKES' THE PAGE ONE
+(100H - 1FFH) SECTION OF PIP WHICH CONTAINS A JUMP TO PIPENTRY, AND
+SPACE FOR CUSTOM I/O DRIVERS (WHICH CAN BE 'PATCHED' USING DDT) IN THE
+REMAINING PAGE ONE AREA. THE PIP PROGRAM ACTUALLY STARTS AT 200H */
+
+DECLARE JUMP BYTE DATA(JMP); /* JMP INSTRUCTION TO */
+/* JMP .PIPENTRY-3 WHERE THE LXI SP,STACK ACTUALLY OCCURS */
+DECLARE JADR ADDRESS DATA(.PIPENTRY-3); /* START OF PIP */
+DECLARE INPSUB(3) BYTE DATA(RET,0,0); /* INP: RET NOP NOP */
+DECLARE OUTSUB(3) BYTE DATA(RET,0,0); /* OUT: RET NOP NOP */
+DECLARE INPDATA BYTE DATA(ENDFILE); /* RETURNED DATA */
+ /* NOTE: PAGE 1 AT 100H CONTAINS THE FOLLOWING
+ 100H: JMP PIPENTRY ;TO START THE PIP PROGRAM
+ 103H: RET ;INP: DEFAULTS TO EMPTY INPUT (DATA 1AH AT 109H)
+ 104H: NOP
+ 105H: NOP
+ 106H: RET ;OUT: DEFAULTS TO EMPTY OUTPUT
+ 107H: NOP
+ 108H: NOP
+ 109H: 1AH=ENDFILE ;DATA FROM INP: FUNCTION IS STORED HERE ON
+ ;RETURN FROM THE INP: ENTRY POINT
+ 10AH: - 1FFH ;SPACE RESERVED FOR SPECIAL PURPOSE
+ ; DRIVERS - IF INCLUDED, THEN REPLACE 103H AND 106H BY JMP'S
+ ; TO THE PROPER LOCATIONS WITHIN THE RESERVED AREA.
+ ; ALSO, RETURN DATA FROM INP: ENTRY POINT AT 109H.
+ ; THESE DRIVERS ARE MOST EASILY INSERTED WITH THE DDT PROGRAM
+ ; UNDER CP/M
+ */
+
+DECLARE /* 16 BYTE MESSAGE */
+ FREEMEMORY LITERALLY '''(INP:/OUT:SPACE)''',
+ /* 256 BYTE AREA FOR INP: OUT: PATCHING */
+ RESERVED(*) BYTE DATA(0,0,0,0,0,0,
+ FREEMEMORY, FREEMEMORY, FREEMEMORY,
+ FREEMEMORY, FREEMEMORY, FREEMEMORY, FREEMEMORY,
+ FREEMEMORY, FREEMEMORY, FREEMEMORY, FREEMEMORY,
+ FREEMEMORY, FREEMEMORY, FREEMEMORY, FREEMEMORY);
+
+
+
+
+ DECLARE COPYRIGHT(*) BYTE DATA (
+ ' COPYRIGHT (C) 1984, DIGITAL RESEARCH, PIP VERS 1.6');
+
+ DECLARE INPLOC ADDRESS DATA (.INPSUB); /* ADDRESS OF INP: DEVICE */
+ DECLARE OUTLOC ADDRESS DATA (.OUTSUB); /* ADDRESS OF OUT: DEVICE */
+
+OUT: PROCEDURE(B);
+ DECLARE B BYTE;
+ /* SEND B TO OUT: DEVICE */
+ CALL OUTLOC;
+ END OUT;
+
+INP: PROCEDURE BYTE;
+ CALL INPLOC;
+ RETURN INPDATA;
+ END INP;
+
+
+TIMEOUT: PROCEDURE;
+ /* WAIT FOR 50 MSEC */
+ CALL TIME(250); CALL TIME(250);
+ END TIMEOUT;
+
+ /* LITERAL DECLARATIONS */
+ DECLARE
+ LIT LITERALLY 'LITERALLY',
+ LPP LIT '60', /* LINES PER PAGE */
+ TAB LIT '09H', /* HORIZONTAL TAB */
+ FF LIT '0CH', /* FORM FEED */
+ LA LIT '05FH', /* LEFT ARROW */
+ LB LIT '05BH', /* LEFT BRACKET */
+ RB LIT '05DH', /* RIGHT BRACKET */
+ XOFF LIT '13H', /* TRANSMIT BUFFER FUNCTION */
+
+ inpp lit '0',
+ aux lit '1',
+ LST LIT '4',
+ conp lit '6', /* console */
+ NULP LIT '6', /* NUL: BEFORE INCREMENT */
+ EOFP LIT '7', /* EOF: BEFORE INCREMENT */
+ hsaux LIT 'aux', /* READER DEVICES */
+ PRNT LIT '4', /* PRINTER */
+
+
+ FSIZE LIT '33',
+ FRSIZE LIT '36', /* SIZE OF RANDOM FCB */
+ NSIZE LIT '8',
+ FNSIZE LIT '11',
+ MDISK LIT '1',
+ FNAM LIT '8',
+ FEXT LIT '9',
+ FEXTL LIT '3',
+ ROFILE LITERALLY '9', /* READ ONLY FILE FIELD */
+ SYSFILE LITERALLY '10', /* SYSTEM FILE FIELD */
+ FREEL LIT '12', /* REEL NUMBER FIELD OF FCB */
+
+ HBUFS LIT '80', /* "HEX" BUFFER SIZE */
+
+ ERR LIT '0',
+ SPECL LIT '1',
+ FILE LIT '2',
+ PERIPH LIT '3',
+ DISKNAME LIT '4';
+
+DECLARE
+ COLUMN BYTE, /* COLUMN COUNT FOR PRINTER TABS */
+ LINENO BYTE, /* LINE WITHIN PAGE */
+ AMBIG BYTE, /* SET FOR AMBIGUOUS FILE REFS */
+ PARSET BYTE, /* TRUE IF PARAMETERS PRESENT */
+ FEEDBASE BYTE, /* USED TO FEED SEARCH CHARACTERS */
+ FEEDLEN BYTE, /* LENGTH OF FEED STRING */
+ MATCHLEN BYTE, /* USED IN MATCHING STRINGS */
+ QUITLEN BYTE, /* USED TO TERMINATE QUIT COMMAND */
+ NBUF BYTE, /* NUM BUFFERS-1 IN SBUFF AND DBUFF */
+ CDISK BYTE, /* CURRENT DISK */
+ BUFFER LITERALLY 'BUFF', /* DEFAULT BUFFER */
+ SEARFCB LITERALLY 'FCB', /* SEARCH FCB IN MULTI COPY */
+ MEMSIZE LITERALLY 'MAXB', /* MEMORY SIZE */
+ SBLEN ADDRESS, /* SOURCE BUFFER LENGTH */
+ DBLEN ADDRESS, /* DEST BUFFER LENGTH */
+ SBASE ADDRESS, /* SOURCE BUFFER BASE */
+ /* THE VECTORS DBUFF AND SBUFF ARE DECLARED WITH DIMENSION
+ 1024, BUT ACTUALLY VARY WITH THE FREE MEMORY SIZE */
+ DBUFF(1024) BYTE AT (.MEMORY), /* DESTINATION BUFFER */
+ SBUFF BASED SBASE (1024) BYTE, /* SOURCE BUFFER */
+ SDISK BYTE, /* SOURCE DISK */
+ (SCOM, DHEX) BYTE, /* SOURCE IS 'COM' FILE IF TRUE */
+ /* DEST IS 'HEX' FILE IF TRUE */
+ SOURCE (FSIZE) BYTE, /* SOURCE FCB */
+ SFUB BYTE AT(.SOURCE(13)), /* UNFILLED BYTES FIELD */
+ DEST (FRSIZE) BYTE, /* DESTINATION FCB */
+ DESTR ADDRESS AT(.DEST(33)), /* RANDOM RECORD POSITION */
+ DESTO BYTE AT(.DEST(35)), /* RANDOM OVERFLOW BYTE */
+ DFUB BYTE AT (.DEST(13)), /* UNFILLED BYTES FIELD */
+ DDISK BYTE, /* DESTINATION DISK */
+ HBUFF(HBUFS) BYTE, /* HEX FILE BUFFER */
+ HSOURCE BYTE, /* NEXT HEX SOURCE CHARACTER */
+
+ NSOURCE ADDRESS, /* NEXT SOURCE CHARACTER */
+ HARDEOF ADDRESS, /* SET TO NSOURCE ON REAL EOF */
+ NDEST ADDRESS; /* NEXT DESTINATION CHARACTER */
+
+DECLARE
+ /* SUBMIT FILE CONTROL BLOCK FOR ERROR DELETE */
+ SUBFCB (*) BYTE DATA (0,'$$$ SUB',0,0,0);
+
+ DECLARE
+ PDEST BYTE, /* DESTINATION DEVICE */
+ PSOURCE BYTE; /* CURRENT SOURCE DEVICE */
+
+ DECLARE
+ MULTCOM BYTE, /* FALSE IF PROCESSING ONE LINE */
+ PUTNUM BYTE, /* SET WHEN READY FOR NEXT LINE NUM */
+ CONCNT BYTE, /* COUNTER FOR CONSOLE READY CHECK */
+ CHAR BYTE, /* LAST CHARACTER SCANNED */
+ TYPE BYTE, /* TYPE OF CHARACTER SCANNED */
+ FLEN BYTE; /* FILE NAME LENGTH */
+
+MON1: PROCEDURE(F,A) EXTERNAL;
+ DECLARE F BYTE,
+ A ADDRESS;
+ END MON1;
+
+MON2: PROCEDURE(F,A) BYTE EXTERNAL;
+ DECLARE F BYTE,
+ A ADDRESS;
+ END MON2;
+
+MON3: PROCEDURE(F,A) ADDRESS EXTERNAL;
+ DECLARE F BYTE,
+ A ADDRESS;
+ END MON3;
+
+BOOT: PROCEDURE EXTERNAL;
+ /* SYSTEM REBOOT */
+ END BOOT;
+
+READRDR: PROCEDURE BYTE;
+ /* READ CURRENT READER DEVICE */
+ RETURN MON2(3,0);
+ END READRDR;
+
+READCHAR: PROCEDURE BYTE;
+ /* READ CONSOLE CHARACTER */
+ RETURN MON2(1,0);
+ END READCHAR;
+
+DECLARE
+ TRUE LITERALLY '1',
+ FALSE LITERALLY '0',
+ FOREVER LITERALLY 'WHILE TRUE',
+ CR LITERALLY '13',
+ LF LITERALLY '10',
+ WHAT LITERALLY '63';
+
+PRINTCHAR: PROCEDURE(CHAR);
+ DECLARE CHAR BYTE;
+ CALL MON1(2,CHAR AND 7FH);
+ END PRINTCHAR;
+
+CRLF: PROCEDURE;
+ CALL PRINTCHAR(CR);
+ CALL PRINTCHAR(LF);
+ END CRLF;
+
+PRINT: PROCEDURE(A);
+ DECLARE A ADDRESS;
+ /* PRINT THE STRING STARTING AT ADDRESS A UNTIL THE
+ NEXT DOLLAR SIGN IS ENCOUNTERED */
+ CALL CRLF;
+ CALL MON1(9,A);
+ END PRINT;
+
+DECLARE DCNT BYTE;
+
+VERSION: PROCEDURE ADDRESS;
+ RETURN MON3(12,0); /* VERSION NUMBER */
+ END VERSION;
+
+INITIALIZE: PROCEDURE;
+ CALL MON1(13,0);
+ END INITIALIZE;
+
+SELECT: PROCEDURE(D);
+ DECLARE D BYTE;
+ CALL MON1(14,D);
+ END SELECT;
+
+OPEN: PROCEDURE(FCB);
+ DECLARE FCB ADDRESS;
+ DCNT = MON2(15,FCB);
+ END OPEN;
+
+CLOSE: PROCEDURE(FCB);
+ DECLARE FCB ADDRESS;
+ DCNT = MON2(16,FCB);
+ END CLOSE;
+
+SEARCH: PROCEDURE(FCB);
+ DECLARE FCB ADDRESS;
+ DCNT = MON2(17,FCB);
+ END SEARCH;
+
+SEARCHN: PROCEDURE;
+ DCNT = MON2(18,0);
+ END SEARCHN;
+
+DELETE: PROCEDURE(FCB);
+ DECLARE FCB ADDRESS;
+ CALL MON1(19,FCB);
+ END DELETE;
+
+DISKREAD: PROCEDURE(FCB) BYTE;
+ DECLARE FCB ADDRESS;
+ RETURN MON2(20,FCB);
+ END DISKREAD;
+
+DISKWRITE: PROCEDURE(FCB) BYTE;
+ DECLARE FCB ADDRESS;
+ RETURN MON2(21,FCB);
+ END DISKWRITE;
+
+MAKE: PROCEDURE(FCB);
+ DECLARE FCB ADDRESS;
+ DCNT = MON2(22,FCB);
+ END MAKE;
+
+RENAME: PROCEDURE(FCB);
+ DECLARE FCB ADDRESS;
+ CALL MON1(23,FCB);
+ END RENAME;
+
+DECLARE
+ CUSER BYTE, /* CURRENT USER NUMBER */
+ SUSER BYTE; /* SOURCE USER NUMBER ('G' PARAMETER) */
+
+SETIND: PROCEDURE(FCB);
+ DECLARE FCB ADDRESS;
+ CALL MON1(30,FCB);
+ END SETIND;
+
+GETUSER: PROCEDURE BYTE;
+ RETURN MON2(32,0FFH);
+ END GETUSER;
+
+SETUSER: PROCEDURE(USER);
+ DECLARE USER BYTE;
+ CALL MON1(32,USER);
+ END SETUSER;
+
+SETCUSER: PROCEDURE;
+ CALL SETUSER(CUSER);
+ END SETCUSER;
+
+SETSUSER: PROCEDURE;
+ CALL SETUSER(SUSER);
+ END SETSUSER;
+
+READ$RANDOM: PROCEDURE(FCB) BYTE;
+ DECLARE FCB ADDRESS;
+ RETURN MON2(33,FCB);
+ END READ$RANDOM;
+
+WRITE$RANDOM: PROCEDURE(FCB) BYTE;
+ DECLARE FCB ADDRESS;
+ RETURN MON2(34,FCB);
+ END WRITE$RANDOM;
+
+SET$RANDOM: PROCEDURE(FCB);
+ DECLARE FCB ADDRESS;
+ /* SET RANDOM RECORD POSITION */
+ CALL MON1(36,FCB);
+ END SET$RANDOM;
+
+DECLARE CBUFF(130) BYTE, /* COMMAND BUFFER */
+ MAXLEN BYTE AT (.CBUFF(0)), /* MAX BUFFER LENGTH */
+ COMLEN BYTE AT (.CBUFF(1)), /* CURRENT LENGTH */
+ COMBUFF (128) BYTE AT (.CBUFF(2)); /* COMMAND BUFFER CONTENTS */
+DECLARE (TCBP,CBP) BYTE; /* TEMP CBP, COMMAND BUFFER POINTER */
+
+READCOM: PROCEDURE;
+ /* READ INTO COMMAND BUFFER */
+ MAXLEN = 128;
+ CALL MON1(10,.MAXLEN);
+ END READCOM;
+
+DECLARE MCBP BYTE;
+
+CONBRK: PROCEDURE BYTE;
+ /* CHECK CONSOLE CHARACTER READY */
+ RETURN MON2(11,0);
+ END CONBRK;
+
+DECLARE /* CONTROL TOGGLE VECTOR */
+ CONT(26) BYTE, /* ONE FOR EACH ALPHABETIC */
+ /* 00 01 02 03 04 05 06 07 08 09 10 11 12 13
+ A B C D E F G H I J K L M N
+ 14 15 16 17 18 19 20 21 22 23 24 25
+ O P Q R S T U V W X Y Z */
+ BLOCK BYTE AT(.CONT(1)), /* BLOCK MODE TRANSFER */
+ DELET BYTE AT(.CONT(3)), /* DELETE CHARACTERS */
+ ECHO BYTE AT(.CONT(4)), /* ECHO CONSOLE CHARACTERS */
+ FORMF BYTE AT(.CONT(5)), /* FORM FILTER */
+ GETU BYTE AT(.CONT(6)), /* GET FILE, USER # */
+ HEXT BYTE AT(.CONT(7)), /* HEX FILE TRANSFER */
+ IGNOR BYTE AT(.CONT(8)), /* IGNORE :00 RECORD ON FILE */
+ LOWER BYTE AT(.CONT(11)), /* TRANSLATE TO LOWER CASE */
+ NUMB BYTE AT(.CONT(13)), /* NUMBER OUTPUT LINES */
+ OBJ BYTE AT(.CONT(14)), /* OBJECT FILE TRANSFER */
+ PAGCNT BYTE AT(.CONT(15)), /* PAGE LENGTH */
+ QUITS BYTE AT(.CONT(16)), /* QUIT COPY */
+ RSYS BYTE AT(.CONT(17)), /* READ SYSTEM FILES */
+ STARTS BYTE AT(.CONT(18)), /* START COPY */
+ TABS BYTE AT(.CONT(19)), /* TAB SET */
+ UPPER BYTE AT(.CONT(20)), /* UPPER CASE TRANSLATE */
+ VERIF BYTE AT(.CONT(21)), /* VERIFY EQUAL FILES ONLY */
+ WRROF BYTE AT(.CONT(22)), /* WRITE TO R/O FILE */
+ ZEROP BYTE AT(.CONT(25)); /* ZERO PARITY ON INPUT */
+
+ SETDMA: PROCEDURE(A);
+ DECLARE A ADDRESS;
+ CALL MON1(26,A);
+ END SETDMA;
+
+DECLARE ZEROSUP BYTE, /* ZERO SUPPRESSION */
+ (C3,C2,C1) BYTE; /* LINE COUNT ON PRINTER */
+
+ ERROR: PROCEDURE(A);
+ DECLARE A ADDRESS, I BYTE;
+ CALL SETCUSER;
+ CALL PRINT(A); CALL PRINTCHAR(':'); CALL PRINTCHAR(' ');
+ DO I = TCBP TO CBP;
+ IF I < COMLEN THEN CALL PRINTCHAR(COMBUFF(I));
+ END;
+ /* ZERO THE COMLEN IN CASE THIS IS A SINGLE COMMAND */
+ COMLEN = 0;
+ /* DELETE ANY $$$.SUB FILES IN CASE BATCH PROCESSING */
+ /* DELETE SUB FILE ONLY IF PRESENT (MAY BE R/O DISK) */
+ CALL SEARCH(.SUBFCB);
+ IF DCNT <> 255 THEN CALL DELETE(.SUBFCB);
+ CALL CRLF;
+ GO TO RETRY;
+ END ERROR;
+
+ MOVE: PROCEDURE(S,D,N);
+ DECLARE (S,D) ADDRESS, N BYTE;
+ DECLARE A BASED S BYTE, B BASED D BYTE;
+ DO WHILE (N:=N-1) <> 255;
+ B = A; S = S+1; D = D+1;
+ END;
+ END MOVE;
+
+
+ FILLSOURCE: PROCEDURE;
+ /* FILL THE SOURCE BUFFERS */
+ DECLARE (I,J) BYTE;
+ NSOURCE = 0;
+ CALL SELECT(SDISK);
+ CALL SETSUSER; /* SOURCE USER NUMBER SET */
+ DO I = 0 TO NBUF;
+ /* SET DMA ADDRESS TO NEXT BUFFER POSIITION */
+ CALL SETDMA(.SBUFF(NSOURCE));
+ IF (J := DISKREAD(.SOURCE)) <> 0 THEN
+ DO; IF J <> 1 THEN
+ CALL ERROR(.('DISK READ ERROR$'));
+ /* END - OF - FILE */
+ HARDEOF = NSOURCE; /* SET HARD END-OF-FILE */
+ SBUFF(NSOURCE) = ENDFILE; I = NBUF;
+ END; ELSE
+ NSOURCE = NSOURCE + 128;
+ END;
+ NSOURCE = 0;
+ CALL SETCUSER; /* BACK TO CURRENT USER NUMBER */
+ END FILLSOURCE;
+
+
+ WRITEDEST: PROCEDURE;
+ /* WRITE OUTPUT BUFFERS UP TO BUT NOT INCLUDING POSITION
+ NDEST - THE LOW ORDER 7 BITS OF NDEST ARE ZERO */
+ DECLARE (I, J, N) BYTE;
+ DECLARE DMA ADDRESS;
+ DECLARE DATAOK BYTE;
+ IF (N := LOW(SHR(NDEST,7)) - 1) = 255 THEN RETURN ;
+ NDEST = 0;
+ CALL SELECT(DDISK);
+ CALL SETRANDOM(.DEST); /* SET BASE RECORD FOR VERIFY */
+ DO I = 0 TO N;
+ /* SET DMA ADDRESS TO NEXT BUFFER */
+ DMA = .DBUFF(NDEST);
+ CALL SETDMA(DMA);
+ IF DISKWRITE(.DEST) <> 0 THEN
+ CALL ERROR(.('DISK WRITE ERROR$'));
+ NDEST = NDEST + 128;
+ END;
+ IF VERIF THEN /* VERIFY DATA WRITTEN OK */
+ DO;
+ NDEST = 0;
+ CALL SETDMA(.BUFF); /* FOR COMPARE */
+ DO I = 0 TO N;
+ DATAOK = READRANDOM(.DEST) = 0;
+ DESTR = DESTR + 1; /* NEXT RANDOM READ */
+ J = 0;
+ /* PERFORM COMPARISON */
+ DO WHILE DATAOK AND J < 80H;
+ DATAOK = BUFFER(J) = DBUFF(NDEST+J);
+ J = J + 1;
+ END;
+ NDEST = NDEST + 128;
+ IF NOT DATAOK THEN
+ CALL ERROR(.('VERIFY ERROR$'));
+ END;
+ DATAOK = DISKWRITE(.DEST);
+ /* NOW READY TO CONTINUE THE WRITE OPERATION */
+ END;
+ NDEST = 0;
+ END WRITEDEST;
+
+ PUTDCHAR: PROCEDURE(B);
+ DECLARE B BYTE;
+ /* WRITE BYTE B TO THE DESTINATION DEVICE GIVEN BY PDEST */
+ IF B >= ' ' THEN
+ DO; COLUMN = COLUMN + 1;
+ IF DELET > 0 THEN /* MAY BE PAST RIGHT SIDE */
+ DO; IF COLUMN > DELET THEN RETURN;
+ END;
+ END;
+ DO CASE PDEST;
+ /* CASE 0 IS THE DESTINATION FILE */
+ DO;
+ IF NDEST >= DBLEN THEN CALL WRITEDEST;
+ DBUFF(NDEST) = B;
+ NDEST = NDEST+1;
+ END;
+ /* case 1 is INP */
+ CALL ERROR(.('NOT A CHARACTER SINK$'));
+ /* case 2 is AUX */
+ do;
+ do while (mon2(8,0) or conbrk) = 0; /* allow break from console */
+ end;
+ if mon2(8,0) then call mon1(4,b);
+ end;
+ /* CASE 3 IS OUT */
+ CALL OUT(B);
+ /* CASE 4 IS PRN (TABS EXPANDED, LINES LISTED, CHANGED TO LST) */
+ GO TO LSTL;
+ /* CASE 5 IS LST */
+ LSTL:
+ CALL MON1(5,B);
+ /* CASE 6 IS CON */
+ CALL MON1(2,B);
+ END;
+ END PUTDCHAR;
+
+PUTDESTC: PROCEDURE(B);
+ DECLARE (B,I) BYTE;
+ /* WRITE DESTINATION CHARACTER, TAB EXPANSION */
+ IF B <> TAB THEN CALL PUTDCHAR(B); ELSE
+ IF TABS = 0 THEN CALL PUTDCHAR(B); ELSE
+ /* B IS TAB CHAR, TABS > 0 */
+ DO; I = COLUMN;
+ DO WHILE I >= TABS;
+ I = I - TABS;
+ END;
+ I = TABS - I;
+ DO WHILE I > 0;
+ I = I - 1;
+ CALL PUTDCHAR(' ');
+ END;
+ END;
+ IF B = CR THEN COLUMN = 0;
+ END PUTDESTC;
+
+PRINT1: PROCEDURE(B);
+ DECLARE B BYTE;
+ IF (ZEROSUP := ZEROSUP AND B = 0) THEN CALL PUTDESTC(' '); ELSE
+ CALL PUTDESTC('0'+B);
+ END PRINT1;
+
+PRINTDIG: PROCEDURE(D);
+ DECLARE D BYTE;
+ CALL PRINT1(SHR(D,4)); CALL PRINT1(D AND 1111B);
+ END PRINTDIG;
+
+NEWLINE: PROCEDURE;
+ DECLARE ONE BYTE;
+ ONE = 1;
+ ZEROSUP = NUMB = 1;
+ C1 = DEC(C1+ONE); C2 = DEC(C2 PLUS 0); C3 = DEC(C3 PLUS 0);
+ CALL PRINTDIG(C3); CALL PRINTDIG(C2); CALL PRINTDIG(C1);
+ IF NUMB = 1 THEN /* USUALLY PRINTER OUTPUT */
+ DO; CALL PUTDESTC(':'); CALL PUTDESTC(' ');
+ END; ELSE
+ CALL PUTDESTC(TAB);
+ END NEWLINE;
+
+CLEARBUFF: PROCEDURE;
+ /* CLEAR OUTPUT BUFFER IN BLOCK MODE TRANSMISION */
+ DECLARE NA ADDRESS;
+ DECLARE I BYTE;
+ I = LOW(NDEST) AND 7FH; /* REMAINING PARTIAL BUFFER LENGTH */
+ NA = NDEST AND 0FF80H; /* START OF SEGMENT NOT WRITTEN */
+ CALL WRITEDEST; /* CLEARS BUFFERS */
+ CALL MOVE(.DBUFF(NA),.DBUFF,I);
+ /* DATA MOVED TO BEGINNING OF BUFFER */
+ NDEST = I;
+ END CLEARBUFF;
+
+PUTDEST: PROCEDURE(B);
+ DECLARE (I,B) BYTE;
+ /* WRITE DESTINATION CHARACTER, CHECK TABS AND LINES */
+ IF FORMF THEN /* SKIP FORM FEEDS */
+ DO; IF B = FF THEN RETURN;
+ END;
+ IF PUTNUM THEN /* END OF LINE OR START OF FILE */
+ DO;
+ IF B <> FF THEN /* NOT FORM FEED */
+ DO;
+ IF (I:=PAGCNT) <> 0 THEN /* PAGE EJECT */
+ DO; IF I=1 THEN I=LPP;
+ IF (LINENO := LINENO + 1) >= I THEN
+ DO; LINENO = 0; /* NEW PAGE */
+ CALL PUTDESTC(FF);
+ END;
+ END;
+ IF NUMB > 0 THEN
+ CALL NEWLINE;
+ PUTNUM = FALSE;
+ END;
+ END;
+ IF BLOCK THEN /* BLOCK MODE TRANSFER */
+ DO;
+ IF B = XOFF AND PDEST = 0 THEN
+ DO; CALL CLEARBUFF; /* BUFFERS WRITTEN */
+ RETURN; /* DON'T PASS THE X-OFF */
+ END;
+ END;
+ IF B = FF THEN LINENO = 0;
+ CALL PUTDESTC(B);
+ IF B = LF THEN PUTNUM = TRUE;
+ END PUTDEST;
+
+
+UTRAN: PROCEDURE(B) BYTE;
+ DECLARE B BYTE;
+ /* TRANSLATE ALPHA TO UPPER CASE */
+ IF B >= 110$0001B AND B <= 111$1010B THEN /* LOWER CASE */
+ B = B AND 101$1111B; /* TO UPPER CASE */
+ RETURN B;
+ END UTRAN;
+
+LTRAN: PROCEDURE(B) BYTE;
+ DECLARE B BYTE;
+ /* TRANSLATE TO LOWER CASE ALPHA */
+ IF B >= 'A' AND B <= 'Z' THEN B = B OR 10$0000B; /* TO LOWER */
+ RETURN B;
+ END LTRAN;
+
+GETSOURCEC: PROCEDURE BYTE;
+ /* READ NEXT SOURCE CHARACTER */
+ DECLARE (iob,B,CONCHK) BYTE;
+
+ IF PSOURCE - 1 <= aux THEN /* 1 ... aux+1 */
+ DO; IF (BLOCK OR HEXT) AND CONBRK THEN
+ DO;
+ IF READCHAR = ENDFILE THEN RETURN ENDFILE;
+ CALL PRINT(.('READER STOPPING',CR,LF,'$'));
+ RETURN XOFF;
+ END;
+ END;
+
+ CONCHK = TRUE; /* CONSOLE STATUS CHECK BELOW */
+
+ DO CASE PSOURCE;
+ /* CASE 0 IS SOURCE FILE */
+ DO; IF NSOURCE >= SBLEN THEN CALL FILLSOURCE;
+ B = SBUFF(NSOURCE);
+ NSOURCE = NSOURCE + 1;
+ END;
+ /* CASE 1 IS INP */
+ B = INP;
+ /* case 2 is AUX */
+ do;
+ do while (mon2(7,0) or conbrk) = 0; /* allow break from console */
+ end;
+ if mon2(7,0) then b = mon2(3,0);
+ else b = lf; /* allow an abort to happen below */
+ end;
+ /* CASE 3 IS OUT */
+ GO TO NOTSOURCE;
+ /* CASE 4 IS PRN */
+ GO TO NOTSOURCE;
+ /* CASE 5 IS LST */
+ NOTSOURCE:
+ DO; CALL ERROR(.('NOT A CHARACTER SOURCE$'));
+ END;
+ /* CASE 6 IS CON */
+ DO; CONCHK = FALSE; /* DON'T CHECK CONSOLE STATUS */
+ B = MON2(1,0);
+ END;
+ END; /* OF CASES */
+ IF ECHO THEN /* COPY TO CONSOLE DEVICE */
+ DO; iob = pdest; PDEST = CONP; CALL PUTDEST(B);
+ PDEST = IOB;
+ END;
+ IF CONCHK THEN /* TEST FOR CONSOLE CHAR READY */
+ DO;
+ IF SCOM THEN /* SOURCE IS A COM FILE */
+ CONCHK = (CONCNT := CONCNT + 1) = 0; ELSE /* ASCII */
+ CONCHK = B = LF;
+ IF CONCHK THEN
+ DO; IF CONBRK THEN
+ DO;
+ IF READCHAR = ENDFILE THEN RETURN ENDFILE;
+ CALL ERROR(.('ABORTED$'));
+ END;
+ END;
+ END;
+ IF ZEROP THEN B = B AND 7FH;
+ IF UPPER THEN RETURN UTRAN(B);
+ IF LOWER THEN RETURN LTRAN(B);
+ RETURN B;
+ END GETSOURCEC;
+
+GETSOURCE: PROCEDURE BYTE;
+ /* GET NEXT SOURCE CHARACTER */
+ DECLARE CHAR BYTE;
+ MATCH: PROCEDURE(B) BYTE;
+ /* MATCH START AND QUIT STRINGS */
+ DECLARE (B,C) BYTE;
+ IF (C:=COMBUFF(B:=(B+MATCHLEN))) = ENDFILE THEN /* END MATCH */
+ DO; COMBUFF(B) = CHAR; /* SAVE CURRENT CHARACTER */
+ RETURN TRUE;
+ END;
+ IF C = CHAR THEN MATCHLEN = MATCHLEN + 1; ELSE
+ MATCHLEN = 0; /* NO MATCH */
+ RETURN FALSE;
+ END MATCH;
+ IF QUITLEN > 0 THEN
+ DO; IF (QUITLEN := QUITLEN - 1) = 1 THEN RETURN LF;
+ RETURN ENDFILE; /* TERMINATED WITH CR,LF,ENDFILE */
+ END;
+ DO FOREVER; /* LOOKING FOR START */
+ IF FEEDLEN > 0 THEN /* GET SEARCH CHARACTERS */
+ DO; FEEDLEN = FEEDLEN - 1;
+ CHAR = COMBUFF(FEEDBASE);
+ FEEDBASE = FEEDBASE + 1;
+ RETURN CHAR;
+ END;
+ IF (CHAR := GETSOURCEC) = ENDFILE THEN RETURN ENDFILE;
+ IF STARTS > 0 THEN /* LOOKING FOR START STRING */
+ DO; IF MATCH(STARTS) THEN
+ DO; FEEDBASE = STARTS; STARTS = 0;
+ FEEDLEN = MATCHLEN + 1;
+ END; /* OTHERWISE NO MATCH, SKIP CHARACTER */
+ END; ELSE
+ IF QUITS > 0 THEN /* PASS CHARACTERS TIL MATCH */
+ DO; IF MATCH(QUITS) THEN
+ DO; QUITS = 0; QUITLEN = 2;
+ /* SUBSEQUENTLY RETURN CR, LF, ENDFILE */
+ RETURN CR;
+ END;
+ RETURN CHAR;
+ END; ELSE
+ RETURN CHAR;
+ END; /* OF DO FOREVER */
+ END GETSOURCE;
+
+DECLARE DISK BYTE; /* SELECTED DISK */
+
+ GNC: PROCEDURE BYTE;
+ IF (CBP := CBP + 1) >= COMLEN THEN RETURN CR;
+ RETURN UTRAN(COMBUFF(CBP));
+ END GNC;
+
+ DEBLANK: PROCEDURE;
+ DO WHILE (CHAR := GNC) = ' ';
+ END;
+ END DEBLANK;
+
+ SCAN: PROCEDURE(FCBA);
+ DECLARE FCBA ADDRESS, /* ADDRESS OF FCB TO FILL */
+ FCB BASED FCBA (FSIZE) BYTE; /* FCB TEMPLATE */
+ DECLARE (I,J,K) BYTE; /* TEMP COUNTERS */
+
+ /* SCAN LOOKS FOR THE NEXT DELIMITER, DEVICE NAME, OR FILE NAME.
+ THE VALUE OF CBP MUST BE 255 UPON ENTRY THE FIRST TIME */
+
+ DELIMITER: PROCEDURE(C) BYTE;
+ DECLARE (I,C) BYTE;
+ DECLARE DEL(*) BYTE DATA
+ (' =.:,<>',CR,LA,LB,RB);
+ DO I = 0 TO LAST(DEL);
+ IF C = DEL(I) THEN RETURN TRUE;
+ END;
+ RETURN FALSE;
+ END DELIMITER;
+
+ PUTCHAR: PROCEDURE;
+ FCB(FLEN:=FLEN+1) = CHAR;
+ IF CHAR = WHAT THEN AMBIG = TRUE; /* CONTAINS AMBIGUOUS REF */
+ END PUTCHAR;
+
+ FILLQ: PROCEDURE(LEN);
+ /* FILL CURRENT NAME OR TYPE WITH QUESTION MARKS */
+ DECLARE LEN BYTE;
+ CHAR = WHAT; /* QUESTION MARK */
+ DO WHILE FLEN < LEN;
+ CALL PUTCHAR;
+ END;
+ END FILLQ;
+
+ GETFCB: PROCEDURE(I) BYTE;
+ DECLARE I BYTE;
+ RETURN FCB(I);
+ END GETFCB;
+
+ SCANPAR: PROCEDURE;
+ DECLARE (I,J) BYTE;
+ /* SCAN OPTIONAL PARAMETERS */
+ PARSET = TRUE;
+ SUSER = CUSER; /* SOURCE USER := CURRENT USER */
+ CHAR = GNC; /* SCAN PAST BRACKET */
+ DO WHILE NOT(CHAR = CR OR CHAR = RB);
+ IF (I := CHAR - 'A') > 25 THEN /* NOT ALPHA */
+ DO; IF CHAR = ' ' THEN CHAR = GNC; ELSE
+ CALL ERROR(.('BAD PARAMETER$'));
+ END; ELSE
+ DO; /* SCAN PARAMETER VALUE */
+ IF CHAR = 'S' OR CHAR = 'Q' THEN
+ DO; /* START OR QUIT COMMAND */
+ J = CBP + 1; /* START OF STRING */
+ DO WHILE NOT ((CHAR := GNC) = ENDFILE OR CHAR = CR);
+ END;
+ CHAR=GNC;
+ END; ELSE
+ IF (J := (CHAR := GNC) - '0') > 9 THEN J = 1;
+ ELSE
+ DO WHILE (K := (CHAR := GNC) - '0') <= 9;
+ J = J * 10 + K;
+ END;
+ CONT(I) = J;
+ IF I = 6 THEN /* SET SOURCE USER */
+ DO;
+ IF J > 31 THEN
+ CALL ERROR(.('INVALID USER NUMBER$'));
+ SUSER = J;
+ END;
+ END;
+ END;
+ CHAR = GNC;
+ END SCANPAR;
+
+ CHKSET: PROCEDURE;
+ IF CHAR = LA THEN CHAR = '=';
+ END CHKSET;
+
+ /* INITIALIZE FILE CONTROL BLOCK TO EMPTY */
+ AMBIG = FALSE; TYPE = ERR; CHAR = ' '; FLEN = 0;
+ DO WHILE FLEN < FSIZE-1;
+ IF FLEN = FNSIZE THEN CHAR = 0;
+ CALL PUTCHAR;
+ END;
+
+ /* DEBLANK COMMAND BUFFER */
+ CALL DEBLANK;
+
+ /* SAVE STARTING POSITION OF SCAN FOR DIAGNOSTICS */
+ TCBP = CBP;
+
+ /* MAY BE A SEPARATOR */
+ IF DELIMITER(CHAR) THEN
+ DO; CALL CHKSET;
+ TYPE = SPECL; RETURN;
+ END;
+
+ /* CHECK PERIPHERALS AND DISK FILES */
+ DISK = 0;
+ /* CLEAR PARAMETERS */
+ DO I = 0 TO 25; CONT(I) = 0;
+ END;
+ PARSET = FALSE;
+ FEEDLEN,MATCHLEN,QUITLEN = 0;
+ /* SCAN NEXT NAME */
+ DO FOREVER;
+ FLEN = 0;
+ DO WHILE NOT DELIMITER(CHAR);
+ IF FLEN >= NSIZE THEN /* ERROR, FILE NAME TOO LONG */
+ RETURN;
+ IF CHAR = '*' THEN CALL FILLQ(NSIZE); ELSE CALL PUTCHAR;
+ CHAR = GNC;
+ END;
+
+ /* CHECK FOR DISK NAME OR DEVICE NAME */
+ IF CHAR = ':' THEN
+ DO; IF DISK <> 0 THEN RETURN; /* ALREADY SET */
+ IF FLEN = 1 THEN
+ /* MAY BE DISK NAME A ... Z */
+ DO;
+ IF (DISK := GETFCB(1) - 'A' + 1) > 26 THEN
+ /* ERROR, INVALID DISK NAME */ RETURN;
+ CALL DEBLANK; /* MAY BE DISK NAME ONLY */
+ IF DELIMITER(CHAR) THEN
+ DO; IF CHAR = LB THEN
+ CALL SCANPAR;
+ CBP = CBP - 1;
+ TYPE = DISKNAME;
+ RETURN;
+ END;
+ END; ELSE
+
+ /* MAY BE A THREE CHARACTER DEVICE NAME */
+ IF FLEN <> 3 THEN /* ERROR, CANNOT BE DEVICE NAME */
+ RETURN; ELSE
+
+ /* LOOK FOR DEVICE NAME */
+ DO; DECLARE (I,J,K) BYTE, M LITERALLY '7',
+ IO(*) BYTE DATA
+ ('INPAUXOUTPRNLSTCONNULEOF',0);
+
+ /* NOTE THAT ALL READER-LIKE DEVICES MUST BE
+ PLACED BEFORE 'AUX', AND ALL LISTING-LIKE DEVICES
+ MUST APPEAR BELOW LST, BUT ABOVE AUX. THE LITERAL
+ DECLARATIONS FOR LST AND AUX MUST INDICATE
+ THE POSITIONS OF THESE DEVICES IN THE LIST */
+
+ J = 255;
+ DO K = 0 TO M;
+ I = 0;
+ DO WHILE ((I:=I+1) <= 3) AND
+ IO(J+I) = GETFCB(I);
+ END;
+ IF I = 4 THEN /* COMPLETE MATCH */
+ DO; TYPE = PERIPH;
+ /* SCAN PARAMETERS */
+ IF GNC = LB THEN CALL SCANPAR;
+ CBP = CBP - 1; CHAR = K;
+ RETURN;
+ END;
+ /* OTHERWISE TRY NEXT DEVICE */ J = J + 3;
+ END;
+
+ /* ERROR, NO DEVICE NAME MATCH */ RETURN;
+ END;
+ IF CHAR = LB THEN /* PARAMETERS FOLLOW */
+ CALL SCANPAR;
+ END; ELSE
+
+ /* CHAR IS NOT ':', SO FILE NAME IS SET. SCAN REMAINDER */
+ DO; IF FLEN = 0 THEN /* ERROR, NO PRIMARY NAME */
+ RETURN;
+ FLEN = FNAM;
+ IF CHAR = '.' THEN /* SCAN FILE TYPE */
+ DO WHILE NOT DELIMITER(CHAR := GNC);
+ IF FLEN >= FNSIZE THEN
+ /* ERROR, TYPE FIELD TOO LONG */ RETURN;
+ IF CHAR = '*' THEN CALL FILLQ(FNSIZE);
+ ELSE CALL PUTCHAR;
+ END;
+
+ IF CHAR = LB THEN
+ CALL SCANPAR;
+ /* RESCAN DELIMITER NEXT TIME AROUND */
+ CBP = CBP - 1;
+ TYPE = FILE;
+ /* DISK IS THE SELECTED DISK (1 2 3 ... ) */
+ IF DISK = 0 THEN DISK = CDISK + 1; /* DEFAULT */
+ FCB(0),FCB(32) = 0;
+ RETURN;
+ END;
+ END;
+ END SCAN;
+
+ NULLS: PROCEDURE;
+ /* SEND 40 NULLS TO OUTPUT DEVICE */
+ DECLARE I BYTE;
+ DO I = 0 TO 39; CALL PUTDEST(0);
+ END;
+ END NULLS;
+
+
+ DECLARE FEXTH(FEXTL) BYTE, /* HOLDS DESTINATION FILE TYPE */
+ COPYING BYTE; /* TRUE WHILE COPYING TO DEST FILE */
+
+ MOVEXT: PROCEDURE(A);
+ DECLARE A ADDRESS;
+ /* MOVE THREE CHARACTER EXTENT INTO DEST FCB */
+ CALL MOVE(A,.DEST(FEXT),FEXTL);
+ END MOVEXT;
+
+EQUAL: PROCEDURE(A,B) BYTE;
+ /* COMPARE THE STRINGS AT A AND B UNTIL EITHER A MISMATCH OR
+ A '$' IS ENCOUNTERED IN STRING B */
+ DECLARE (A,B) ADDRESS,
+ (SA BASED A, SB BASED B) BYTE;
+ DO WHILE SB <> '$';
+ IF (SB AND 7FH) <> (SA AND 7FH) THEN RETURN FALSE;
+ A = A + 1; B = B + 1;
+ END;
+ RETURN TRUE;
+ END EQUAL;
+
+READ$EOF: PROCEDURE BYTE;
+ /* RETURN TRUE IF END OF FILE */
+ CHAR = GETSOURCE;
+ IF SCOM THEN RETURN HARDEOF < NSOURCE;
+ RETURN CHAR = ENDFILE;
+ END READ$EOF;
+
+
+HEXRECORD: PROCEDURE BYTE;
+ /* READ ONE RECORD INTO SBUFF AND CHECK FOR PROPER FORM
+ RETURNS 0 IF RECORD OK
+ RETURNS 1 IF END OF TAPE (:00000)
+ RETURNS 2 IF ERROR IN RECORD */
+
+
+ DECLARE XOFFSET BYTE; /* TRUE IF XOFF RECVD */
+ DECLARE NOERRS BYTE; /* TRUE IF NO ERRORS IN THIS RECORD */
+
+ PRINTERR: PROCEDURE(A);
+ /* PRINT ERROR MESSAGE IF NOERRS TRUE */
+ DECLARE A ADDRESS;
+ IF NOERRS THEN
+ DO; NOERRS = FALSE;
+ CALL PRINT(A);
+ END;
+ END PRINTERR;
+
+ CHECKXOFF: PROCEDURE;
+ IF XOFFSET THEN
+ DO; XOFFSET = FALSE;
+ CALL CLEARBUFF;
+ END;
+ END CHECKXOFF;
+
+ SAVECHAR: PROCEDURE BYTE;
+ /* READ CHARACTER AND SAVE IN BUFFER */
+ DECLARE I BYTE;
+ IF NOERRS THEN
+ DO;
+ DO WHILE (I := GETSOURCE) = XOFF; XOFFSET = TRUE;
+ END;
+ HBUFF(HSOURCE) = I;
+ IF (HSOURCE := HSOURCE + 1) >= LAST(HBUFF) THEN
+ CALL PRINTERR(.('RECORD TOO LONG$'));
+ RETURN I;
+ END;
+ RETURN ENDFILE; /* ON ERROR FLAG */
+ END SAVECHAR;
+
+ DECLARE (M, RL, CS, RT) BYTE,
+ LDA ADDRESS; /* LOAD ADDRESS WHICH FOLLOWS : */
+
+ READHEX: PROCEDURE BYTE;
+ DECLARE H BYTE;
+ IF (H := SAVECHAR) - '0' <= 9 THEN RETURN H-'0';
+ IF H - 'A' > 5 THEN
+ CALL PRINTERR(.('INVALID DIGIT$'));
+ RETURN H - 'A' + 10;
+ END READHEX;
+
+ READBYTE: PROCEDURE BYTE;
+ /* READ TWO HEX DIGITS */
+ RETURN SHL(READHEX,4) OR READHEX;
+ END READBYTE;
+
+ READCS: PROCEDURE BYTE;
+ /* READ BYTE WITH CHECKSUM */
+ RETURN CS := CS + READBYTE;
+ END READCS;
+
+ READADDR: PROCEDURE ADDRESS;
+ /* READ DOUBLE BYTE WITH CHECKSUM */
+ RETURN SHL(DOUBLE(READCS),8) OR READCS;
+ END READADDR;
+
+ NOERRS = TRUE; /* NO ERRORS DETECTED IN THIS RECORD */
+
+ /* READ NEXT RECORD */
+ /* SCAN FOR THE ':' */
+ HSOURCE = 0;
+ DO WHILE (CS := SAVECHAR) <> ':';
+ HSOURCE = 0;
+ IF CS = ENDFILE THEN
+ DO; CALL PRINT(.('END OF FILE, CTL-Z',WHAT,'$'));
+ IF READCHAR = ENDFILE THEN RETURN 1;
+ ELSE HSOURCE = 0;
+ END;
+ CALL CHECKXOFF;
+ END;
+
+ /* ':' FOUND */
+ CS = 0;
+ IF (RL := READCS) = 0 THEN /* END OF TAPE */
+ DO; DO WHILE (RL := SAVECHAR) <> ENDFILE;
+ CALL CHECKXOFF;
+ END;
+ IF NOERRS THEN RETURN 1;
+ RETURN 2;
+ END;
+
+ /* RECORD LENGTH IS NOT ZERO */
+ LDA = READADDR; /* LOAD ADDRESS */
+
+ /* READ WORDS UNTIL RECORD LENGTH EXHAUSTED */
+ RT = READCS; /* RECORD TYPE */
+ DO WHILE RL <> 0 AND NOERRS; RL = RL - 1;
+ M = READCS;
+ /* INCREMENT LA HERE FOR EXACT ADDRESS */
+ END;
+
+ /* CHECK SUM */
+ IF CS + READBYTE <> 0 THEN
+ CALL PRINTERR(.('CHECKSUM ERROR$'));
+
+ CALL CHECKXOFF;
+ IF NOERRS THEN RETURN 0;
+ RETURN 2;
+ END HEXRECORD;
+
+READTAPE: PROCEDURE;
+ /* READ HEX FILE FROM HIGH SPEED READER TO 'HEX' FILE,
+ CHECK EACH RECORD FOR VALID DIGITS, AND PROPER CHECKSUM */
+ DECLARE (I,A) BYTE;
+ DO FOREVER;
+ DO WHILE (I := HEXRECORD) <= 1;
+ IF NOT (I = 1 AND IGNOR) THEN
+ DO A = 1 TO HSOURCE;
+ CALL PUTDEST(HBUFF(A-1));
+ END;
+ CALL PUTDEST(CR); CALL PUTDEST(LF);
+ IF I = 1 THEN /* END OF TAPE ENCOUNTERED */
+ RETURN;
+ END;
+ CALL CRLF; HBUFF(HSOURCE) = '$';
+ CALL PRINT(.HBUFF);
+ CALL PRINT(.('CORRECT ERROR, TYPE RETURN OR CTL-Z$'));
+ CALL CRLF;
+ IF READCHAR = ENDFILE THEN RETURN;
+ END;
+ END READTAPE;
+
+FORMERR: PROCEDURE;
+ CALL ERROR(.('INVALID FORMAT$'));
+ END FORMERR;
+
+SETUPDEST: PROCEDURE;
+ CALL SELECT(DDISK);
+ DHEX = EQUAL(.DEST(FEXT),.('HEX$'));
+ CALL MOVE(.DEST(FEXT),.FEXTH,FEXTL); /* SAVE TYPE */
+ DEST(ROFILE) = DEST(ROFILE) AND 7FH;
+ DEST(SYSFILE)= DEST(SYSFILE)AND 7FH;
+ CALL MOVEXT(.('$$$'));
+ CALL DELETE(.DEST); /* REMOVE OLD $$$ FILE */
+ CALL MAKE(.DEST); /* CREATE A NEW ONE */
+ IF DCNT = 255 THEN CALL ERROR(.('NO DIRECTORY SPACE$'));
+ DEST(32),NDEST = 0;
+ END SETUPDEST;
+
+SETUPSOURCE: PROCEDURE;
+ HARDEOF = 0FFFFH;
+ CALL SETSUSER; /* SOURCE USER */
+ CALL SELECT(SDISK);
+ CALL OPEN(.SOURCE);
+ CALL SETCUSER; /* BACK TO CURRENT USER */
+ IF (NOT RSYS) AND ROL(SOURCE(SYSFILE),1) THEN
+ DCNT = 255;
+ IF DCNT = 255 THEN CALL ERROR(.('NO FILE$'));
+ SOURCE(32) = 0;
+ /* CAUSE IMMEDIATE READ */
+ SCOM = EQUAL(.SOURCE(FEXT),.('COM$'));
+ NSOURCE = SBLEN;
+ END SETUPSOURCE;
+
+CHECK$STRINGS: PROCEDURE;
+ IF STARTS > 0 THEN
+ CALL ERROR(.('START NOT FOUND$'));
+ IF QUITS > 0 THEN
+ CALL ERROR(.('QUIT NOT FOUND$'));
+ END CHECK$STRINGS;
+
+CLOSEDEST: PROCEDURE(DIRECT);
+ DECLARE DIRECT BYTE;
+ /* DIRECT IS TRUE IF SECTOR-BY-SECTOR COPY */
+ IF DIRECT THEN
+ /* GET UNFILLED BYTES FROM SOURCE BUFFER */
+ DFUB = SFUB; ELSE DFUB = 0;
+ DO WHILE (LOW(NDEST) AND 7FH) <> 0;
+ DFUB = DFUB + 1;
+ CALL PUTDEST(ENDFILE);
+ END;
+ CALL CHECK$STRINGS;
+ CALL WRITEDEST;
+ CALL SELECT(DDISK);
+ CALL CLOSE(.DEST);
+ IF DCNT = 255 THEN
+ CALL ERROR(.('CANNOT CLOSE DESTINATION FILE$'));
+ CALL MOVEXT(.FEXTH); /* RECALL ORIGINAL TYPTE */
+ DEST(12) = 0;
+ CALL OPEN(.DEST);
+ IF DCNT <> 255 THEN /* FILE EXISTS */
+ DO;
+ IF ROL(DEST(ROFILE),1) THEN /* READ ONLY */
+ DO;
+ IF NOT WRROF THEN
+ DO;
+ CALL PRINT (.('DESTINATION IS R/O, DELETE (Y/N)?$'));
+ IF UTRAN(READCHAR) <> 'Y' THEN
+ DO; CALL PRINT(.('**NOT DELETED**$'));
+ CALL CRLF;
+ CALL MOVEXT(.('$$$'));
+ CALL DELETE(.DEST);
+ RETURN;
+ END;
+ CALL CRLF;
+ END;
+ DEST(ROFILE) = DEST(ROFILE) AND 7FH;
+ CALL SETIND(.DEST);
+ END;
+ CALL DELETE(.DEST);
+ END;
+ CALL MOVE(.DEST,.DEST(16),16); /* READY FOR RENAME */
+ CALL MOVEXT(.('$$$'));
+ CALL RENAME(.DEST);
+ END CLOSEDEST;
+
+SIZE$NBUF: PROCEDURE;
+ /* COMPUTE NUMBER OF BUFFERS - 1 FROM DBLEN */
+ NBUF = (SHR(DBLEN,7) AND 0FFH) - 1;
+ /* COMPUTED AS DBLEN/128-1, WHERE DBLEN <= 32K (AND THUS
+ NBUF RESULTS IN A VALUE <= 2**15/2**7-1 = 2**8-1 = 255) */
+ END SIZE$NBUF;
+
+SET$DBLEN: PROCEDURE;
+ /* ABSORB THE SOURCE BUFFER INTO THE DEST BUFFER */
+ SBASE = .MEMORY;
+ IF DBLEN >= 4000H THEN DBLEN = 7F80H; ELSE
+ DBLEN = DBLEN + SBLEN;
+ CALL SIZE$NBUF;
+ END SET$DBLEN;
+
+SIZE$MEMORY: PROCEDURE;
+ /* SET UP SOURCE AND DESTINATION BUFFERS */
+ SBASE = .MEMORY + SHR(MEMSIZE - .MEMORY,1);
+ SBLEN, DBLEN = SHR((MEMSIZE - .MEMORY) AND 0FF00H,1);
+ CALL SIZE$NBUF;
+ END SIZE$MEMORY;
+
+COPYCHAR: PROCEDURE;
+ /* PERFORM THE ACTUAL COPY FUNCTION */
+ DECLARE RESIZED BYTE; /* TRUE IF SBUFF AND DBUFF COMBINED */
+ IF (RESIZED := (BLOCK AND PSOURCE <> 0)) THEN /* BLOCK MODE */
+ CALL SET$DBLEN; /* ABSORB SOURCE BUFFER */
+ IF HEXT OR IGNOR THEN /* HEX FILE */
+ CALL READTAPE; ELSE
+ DO WHILE NOT READ$EOF;
+ CALL PUTDEST(CHAR);
+ END;
+ IF RESIZED THEN
+ DO; CALL CLEARBUFF;
+ CALL SIZE$MEMORY;
+ END;
+ END COPYCHAR;
+
+SIMPLECOPY: PROCEDURE;
+ DECLARE (FASTCOPY,I) BYTE;
+ REAL$EOF: PROCEDURE BYTE;
+ RETURN HARDEOF <> 0FFFFH;
+ END REALEOF;
+ CALL SIZE$MEMORY;
+ TCBP = MCBP; /* FOR ERROR TRACING */
+ CALL SETUPDEST;
+ CALL SETUPSOURCE;
+ /* FILES READY FOR DIRECT COPY */
+ FASTCOPY = TRUE;
+ /* LOOK FOR PARAMETERS */
+ DO I = 0 TO 25;
+ IF CONT(I) <> 0 THEN
+ DO;
+ IF NOT(I=6 OR I=14 OR I=17 OR I=21 OR I=22) THEN
+ /* NOT OBJ OR VERIFY */
+ FASTCOPY = FALSE;
+ END;
+ END;
+ IF FASTCOPY THEN /* COPY DIRECTLY TO DBUFF */
+ DO; CALL SET$DBLEN; /* EXTEND DBUFF */
+ DO WHILE NOT REAL$EOF;
+ CALL FILLSOURCE;
+ IF REAL$EOF THEN
+ NDEST = HARDEOF; ELSE NDEST = DBLEN;
+ CALL WRITEDEST;
+ END;
+ CALL SIZE$MEMORY; /* RESET TO TWO BUFFERS */
+ END; ELSE
+ CALL COPYCHAR;
+ CALL CLOSEDEST(FASTCOPY);
+ END SIMPLECOPY;
+
+MULTCOPY: PROCEDURE;
+ DECLARE (NEXTDIR, NDCNT, NCOPIED) ADDRESS;
+ PRNAME: PROCEDURE;
+ /* PRINT CURRENT FILE NAME */
+ DECLARE (I,C) BYTE;
+ CALL CRLF;
+ DO I = 1 TO FNSIZE;
+ IF (C := DEST(I)) <> ' ' THEN
+ DO; IF I = FEXT THEN CALL PRINTCHAR('.');
+ CALL PRINTCHAR(C);
+ END;
+ END;
+ END PRNAME;
+
+ NEXTDIR,NCOPIED = 0;
+ DO FOREVER;
+ /* FIND A MATCHING ENTRY */
+ CALL SETSUSER; /* SOURCE USER */
+ CALL SELECT(SDISK);
+ CALL SETDMA(.BUFFER);
+ CALL SEARCH(.SEARFCB);
+ NDCNT = 0;
+ DO WHILE (DCNT <> 255) AND NDCNT < NEXTDIR;
+ NDCNT = NDCNT + 1;
+ CALL SEARCHN;
+ END;
+ CALL SETCUSER;
+ /* FILE CONTROL BLOCK IN BUFFER */
+ IF DCNT = 255 THEN
+ DO; IF NCOPIED = 0 THEN
+ CALL ERROR(.('NOT FOUND$')); CALL CRLF;
+ RETURN;
+ END;
+ NEXTDIR = NDCNT + 1;
+ /* GET THE FILE CONTROL BLOCK NAME TO DEST */
+ CALL MOVE(.BUFFER+SHL(DCNT AND 11B,5),.DEST,16);
+ DEST(0) = 0;
+ DEST(12) = 0;
+ CALL MOVE(.DEST,.SOURCE,16); /* FILL BOTH FCB'S */
+ IF RSYS OR NOT ROL(DEST(SYSFILE),1) THEN /* OK TO READ */
+ DO;
+ IF (NCOPIED := NCOPIED + 1) = 1 THEN
+ CALL PRINT(.('COPYING -$'));
+ CALL PRNAME;
+ CALL SIMPLECOPY;
+ END;
+ END;
+ END MULTCOPY;
+
+SET$SDISK: PROCEDURE;
+ IF DISK > 0 THEN SDISK = DISK - 1; ELSE SDISK = CDISK;
+ END SET$SDISK;
+
+SET$DDISK: PROCEDURE;
+ IF PARSET THEN /* PARAMETERS PRESENT */ CALL FORMERR;
+ IF DISK > 0 THEN DDISK = DISK - 1; ELSE DDISK = CDISK;
+ END SET$DDISK;
+
+CHECK$DISK: PROCEDURE;
+ IF SUSER <> CUSER THEN /* DIFFERENT DISKS */
+ RETURN;
+ IF DDISK = SDISK THEN CALL FORMERR;
+ END CHECK$DISK;
+
+CHECK$EOL: PROCEDURE;
+ CALL DEBLANK;
+ IF CHAR <> CR THEN CALL FORMERR;
+ END CHECK$EOL;
+
+SCANDEST: PROCEDURE(COPYFCB);
+ DECLARE COPYFCB ADDRESS;
+ CALL SET$SDISK;
+ CALL CHECK$EOL;
+ CALL MOVE(.SOURCE,COPYFCB,33);
+ CALL CHECK$DISK;
+ END SCANDEST;
+
+SCANEQL: PROCEDURE;
+ CALL SCAN(.SOURCE);
+ IF NOT (TYPE = SPECL AND CHAR = '=') THEN CALL FORMERR;
+ MCBP = CBP; /* FOR ERROR PRINTING */
+ END SCANEQL;
+
+
+PIPENTRY:
+ /* BUFFER AT 80H CONTAINS REMAINDER OF LINE TYPED
+ FOLLOWING THE COMMAND 'PIP' - IF ZERO THEN PROMPT TIL CR */
+ CALL MOVE(.BUFF,.COMLEN,80H);
+ MULTCOM = COMLEN = 0;
+
+ /* GET CURRENT CP/M VERSION */
+ IF VERSION < CPMVERSION THEN
+ DO;
+ CALL PRINT(.('Requires Personal CP/M 1.0 or newer for operation.$'));
+ CALL BOOT;
+ END;
+ /* GET CURRENT USER */
+ CUSER = GETUSER;
+ /* GET CURRENT DISK */
+ CDISK = MON2(25,0);
+
+ RETRY:
+ /* ENTER HERE ON ERROR EXIT FROM THE PROCEDURE 'ERROR' */
+ CALL SIZE$MEMORY;
+ /* MAIN PROCESSING LOOP. PROCESS UNTIL CR ONLY */
+ DO FOREVER;
+ SUSER = CUSER;
+ C1, C2, C3 = 0; /* LINE COUNT = 000000 */
+ PUTNUM = TRUE; /* ACTS LIKE LF OCCURRED ON ASCII FILE */
+ CONCNT,COLUMN = 0; /* PRINTER TABS */
+ LINENO = 254; /* INCREMENTED TO 255 > PAGCNT */
+ /* READ FROM CONSOLE IF NOT A ONELINER */
+ IF MULTCOM THEN
+ DO; CALL PRINTCHAR('*'); CALL READCOM;
+ CALL CRLF;
+ END;
+ CBP = 255;
+ IF COMLEN = 0 THEN /* SINGLE CARRIAGE RETURN */
+ DO; CALL SELECT(CDISK);
+ CALL BOOT;
+ END;
+
+ /* LOOK FOR SPECIAL CASES FIRST */
+ DDISK,SDISK,PSOURCE,PDEST = 0;
+ CALL SCAN(.DEST);
+ IF TYPE = PERIPH THEN GO TO SIMPLECOM;
+ IF TYPE = DISKNAME THEN
+ DO; DDISK = DISK - 1;
+ CALL SCANEQL;
+ CALL SCAN(.SOURCE);
+ /* MAY BE MULTI COPY */
+ IF TYPE <> FILE THEN CALL FORMERR;
+ IF AMBIG THEN
+ DO; CALL SCANDEST(.SEARFCB);
+ CALL MULTCOPY;
+ END; ELSE
+ DO; CALL SCANDEST(.DEST);
+ /* FORM IS A:=B:UFN */
+ CALL SIMPLECOPY;
+ END;
+ GO TO ENDCOM;
+ END;
+
+
+ IF TYPE <> FILE OR AMBIG THEN CALL FORMERR;
+ CALL SET$DDISK;
+ CALL SCANEQL;
+ CALL SCAN(.SOURCE);
+ IF TYPE = DISKNAME THEN
+ DO;
+ CALL SET$SDISK; CALL CHECK$DISK;
+ CALL MOVE(.DEST,.SOURCE,33);
+ CALL CHECK$EOL;
+ CALL SIMPLECOPY;
+ GO TO ENDCOM;
+ END;
+ /* MAY BE POSSIBLE TO DO A FAST DISK COPY */
+ IF TYPE = FILE THEN /* FILE TO FILE */
+ DO; CALL DEBLANK; IF CHAR <> CR THEN GO TO SIMPLECOM;
+ /* FILE TO FILE */
+ CALL SET$SDISK;
+ CALL SIMPLECOPY;
+ GO TO ENDCOM;
+ END;
+
+SIMPLECOM:
+ CBP = 255; /* READY FOR RESCAN */
+
+ /* OTHERWISE PROCESS SIMPLE REQUEST */
+ CALL SCAN(.DEST);
+ IF (TYPE < FILE) OR AMBIG THEN /* DELIMITER OR ERROR */
+ CALL ERROR(.('UNRECOGNIZED DESTINATION$'));
+
+ DHEX = FALSE;
+ IF TYPE = FILE THEN
+ DO; /* DESTINATION IS A FILE, SAVE EXTENT NAME */
+ CALL SET$DDISK;
+ CALL SETUPDEST;
+ CHAR = 255;
+ END; ELSE
+ /* PERIPHERAL NAME */
+ IF CHAR >= NULP OR CHAR = inpp THEN CALL ERROR(.('CANNOT WRITE$'));
+
+ PDEST = CHAR + 1;
+
+ /* NOW SCAN THE DELIMITER */
+ CALL SCAN(.SOURCE);
+ IF TYPE <> SPECL OR CHAR <> '=' THEN
+ CALL ERROR(.('INVALID PIP FORMAT$'));
+
+ /* OTHERWISE SCAN AND COPY UNTIL CR */
+ COPYING = TRUE;
+ DO WHILE COPYING;
+ SUSER = CUSER;
+ CALL SCAN(.SOURCE);
+ /* SUSER MAY HAVE BEEN RESET */
+ SCOM = FALSE;
+ IF TYPE = FILE AND NOT AMBIG THEN /* A SOURCE FILE */
+ DO;
+ CALL SET$SDISK;
+ CALL SETUPSOURCE;
+ CHAR = 255;
+ END; ELSE
+
+ IF TYPE <> PERIPH OR (CHAR <= LST AND CHAR > aux) THEN
+ CALL ERROR(.('CANNOT READ$'));
+
+
+ SCOM = SCOM OR OBJ; /* MAY BE ABSOLUTE COPY */
+ PSOURCE = CHAR + 1;
+ IF CHAR = NULP THEN CALL NULLS; ELSE
+ IF CHAR = EOFP THEN CALL PUTDEST(ENDFILE); ELSE
+ DO; /* DISK COPY */
+ IF (CHAR < hsaux AND DHEX) THEN HEXT = 1;
+ /* HEX FILE SET IF SOURCE IS RDR AND DEST IS HEX FILE */
+ IF PDEST = PRNT THEN
+ DO; NUMB = 1;
+ IF TABS = 0 THEN TABS = 8;
+ IF PAGCNT = 0 THEN PAGCNT = 1;
+ END;
+ CALL COPYCHAR;
+ END;
+
+ CALL CHECK$STRINGS;
+ /* READ ENDFILE, GO TO NEXT SOURCE */
+ CALL SCAN(.SOURCE);
+ IF TYPE <> SPECL OR (CHAR <> ',' AND CHAR <> CR) THEN
+ CALL ERROR(.('INVALID SEPARATOR$'));
+
+ COPYING = CHAR <> CR;
+ END;
+
+ /* IF NECESSARY, CLOSE FILE OR PUNCH TRAILER */
+ IF PDEST = aux THEN
+ DO; CALL PUTDEST(ENDFILE); CALL NULLS;
+ END;
+ IF PDEST = 0 THEN /* FILE HAS TO BE CLOSED AND RENAMED */
+ CALL CLOSEDEST(FALSE);
+
+ /* COMLEN SET TO 0 IF NOT PROCESSING MULTIPLE COMMANDS */
+ENDCOM:
+ COMLEN = MULTCOM;
+
+ END; /* DO FOREVER */
+END;
+
\ No newline at end of file
diff --git a/cpm/pcpm/READ.ME b/cpm/pcpm/READ.ME
new file mode 100644
index 0000000..6a7f4d1
--- /dev/null
+++ b/cpm/pcpm/READ.ME
@@ -0,0 +1,39 @@
+The following list of corrections should be made to the Personal CP/M 8-bit
+version 1.0 documentation.
+
+Programmer's Guide
+
+ page 2-10
+ BDOS function 2
+ text says 'CONSOLE INPUT'
+ should be 'CONSOLE OUTPUT'
+
+ page 2-45
+ BDOS function 33
+ 'Entry Parameters' add after Register C line:
+ 'Register DE: FCB Address'
+
+ page 2-49
+ BDOS function 35
+ replace information about values returned in registers with:
+ 'Random record field of FCB set'
+
+System Guide
+
+ Section 2
+ References to the BDOS size being 1100h bytes are incorrect.
+ The BDOS code segment is 1000h bytes, and the BDOS data
+ segment is 00BFh bytes. With the standard distibution,
+ BDOSH.REL and BDOSL.REL will link these in a separate area
+ from the BDOS code segment. OEMs that purchase the source
+ can set an assembly-time switch that will make the data areas
+ part of the code segment so that it will all be linked as one
+ segment of 1100h bytes if the BDOS will execute in RAM.
+
+ page 4-15
+ BIOS function WRITE
+ Entry Parameters: Register C = 0: normal sector write
+ 1: write to directory sector
+ 2: write to the first sector
+ of a new data block
+
\ No newline at end of file
diff --git a/cpm/pcpm/README.TOO b/cpm/pcpm/README.TOO
new file mode 100644
index 0000000..85725eb
--- /dev/null
+++ b/cpm/pcpm/README.TOO
@@ -0,0 +1,15 @@
+Please note: line 2528 in BDOS.MAC is corrupted. It should read
+
+ jp z,COPY$DIRLOC ;stop at end of dir
+
+--------------------------
+
+This zip file contains the original source for Personal CP/M 1.0.
+If anybody figures out anything about this code, please drop an
+email message to me at :
+
+gaby@gaby.de
+
+and I'll pass it on.
+
+tnx
diff --git a/cpm/pcpm/STAT.PLM b/cpm/pcpm/STAT.PLM
new file mode 100644
index 0000000..149475c
--- /dev/null
+++ b/cpm/pcpm/STAT.PLM
@@ -0,0 +1,834 @@
+stat:
+do;
+declare
+ cpmversion literally '20h'; /* requires 2.0 cp/m */
+ /* c p / m s t a t u s c o m m a n d (s t a t) */
+
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+/* status status status status status status */
+
+/*
+ copyright(c) 1975, 1976, 1977, 1978, 1979, 1984
+ digital research
+ box 579
+ pacific grove, ca
+ 93950
+ */
+
+/* modified 10/30/78 to fix the space computation */
+/* modified 01/28/79 to remove despool dependencies */
+/* modified 07/26/79 to operate under cp/m 2.0 */
+/* modified 03/14/84 to remove iobyte modification for Personal CP/M */
+
+declare jump byte data(0c3h),
+ jadr address data (.status);
+ /* jump to status */
+
+/* function call 32 returns the address of the disk parameter
+block for the currently selected disk, which consists of:
+ scptrk (2 by) number of sectors per track
+ blkshf (1 by) log2 of blocksize (2**blkshf=blksize)
+ blkmsk (1 by) 2**blkshf-1
+ extmsk (1 by) logical/physical extents
+ maxall (2 by) max alloc number
+ dirmax (2 by) size of directory-1
+ dirblk (2 by) reservation bits for directory
+ chksiz (2 by) size of checksum vector
+ offset (2 by) offset for operating system
+*/
+
+declare
+ /* fixed locations for cp/m */
+ bdosa literally '0006h', /* bdos base */
+ buffa literally '0080h', /* default buffer */
+ fcba literally '005ch', /* default file control block */
+ dolla literally '006dh', /* dollar sign position */
+ parma literally '006eh', /* parameter, if sent */
+ rreca literally '007dh', /* random record 7d,7e,7f */
+ rreco literally '007fh', /* high byte of random overflow */
+ sectorlen literally '128', /* sector length */
+ memsize address at(bdosa), /* end of memory */
+ rrec address at(rreca), /* random record address */
+ rovf byte at(rreco), /* overflow on getfile */
+ doll byte at(dolla), /* dollar parameter */
+ parm byte at(parma), /* parameter */
+ sizeset byte, /* true if displaying size field */
+ dpba address, /* disk parameter block address */
+ dpb based dpba structure
+ (spt address, bls byte, bms byte, exm byte, mxa address,
+ dmx address, dbl address, cks address, ofs address),
+ scptrk literally 'dpb.spt',
+ blkshf literally 'dpb.bls',
+ blkmsk literally 'dpb.bms',
+ extmsk literally 'dpb.exm',
+ maxall literally 'dpb.mxa',
+ dirmax literally 'dpb.dmx',
+ dirblk literally 'dpb.dbl',
+ chksiz literally 'dpb.cks',
+ offset literally 'dpb.ofs';
+
+
+boot: procedure external;
+ /* reboot */
+ end boot;
+
+mon1: procedure(f,a) external;
+ declare f byte, a address;
+ end mon1;
+
+mon2: procedure(f,a) byte external;
+ declare f byte, a address;
+ end mon2;
+
+mon3: procedure(f,a) address external;
+ declare f byte, a address;
+ end mon3;
+
+
+status: procedure;
+ declare copyright(*) byte data (
+ ' Copyright (c) 1984, Digital Research');
+ /* dummy outer procedure 'status' will start at 100h */
+ /* determine status of currently selected disk */
+
+declare alloca address,
+ /* alloca is the address of the disk allocation vector */
+ alloc based alloca (1024) byte; /* allocation vector */
+
+declare
+ true literally '1',
+ false literally '0',
+ forever literally 'while true',
+ cr literally '13',
+ lf literally '10';
+
+printchar: procedure(char);
+ declare char byte;
+ call mon1(2,char);
+ end printchar;
+
+crlf: procedure;
+ call printchar(cr);
+ call printchar(lf);
+ end crlf;
+
+printb: procedure;
+ /* print blank character */
+ call printchar(' ');
+ end printb;
+
+printx: procedure(a);
+ declare a address;
+ declare s based a byte;
+ do while s <> 0;
+ call printchar(s);
+ a = a + 1;
+ end;
+ end printx;
+
+print: procedure(a);
+ declare a address;
+ /* print the string starting at address a until the
+ next 0 is encountered */
+ call crlf;
+ call printx(a);
+ end print;
+
+break: procedure byte;
+ return mon2(11,0); /* console ready */
+ end break;
+
+declare dcnt byte;
+
+version: procedure byte;
+ /* returns current cp/m version # */
+ return mon2(12,0);
+ end version;
+
+select: procedure(d);
+ declare d byte;
+ call mon1(14,d);
+ end select;
+
+open: procedure(fcb);
+ declare fcb address;
+ dcnt = mon2(15,fcb);
+ end open;
+
+search: procedure(fcb);
+ declare fcb address;
+ dcnt = mon2(17,fcb);
+ end search;
+
+searchn: procedure;
+ dcnt = mon2(18,0);
+ end searchn;
+
+cselect: procedure byte;
+ /* return current disk number */
+ return mon2(25,0);
+ end cselect;
+
+setdma: procedure(dma);
+ declare dma address;
+ call mon1(26,dma);
+ end setdma;
+
+getalloca: procedure address;
+ /* get base address of alloc vector */
+ return mon3(27,0);
+ end getalloca;
+
+getlogin: procedure address;
+ /* get the login vector */
+ return mon3(24,0);
+ end getlogin;
+
+writeprot: procedure;
+ /* write protect the current disk */
+ call mon1(28,0);
+ end writeprot;
+
+getrodisk: procedure address;
+ /* get the read-only disk vector */
+ return mon3(29,0);
+ end getrodisk;
+
+setind: procedure;
+ /* set file indicators for current fcb */
+ call mon1(30,fcba);
+ end setind;
+
+set$dpb: procedure;
+ /* set disk parameter block values */
+ dpba = mon3(31,0); /* base of dpb */
+ end set$dpb;
+
+getuser: procedure byte;
+ /* return current user number */
+ return mon2(32,0ffh);
+ end getuser;
+
+setuser: procedure(user);
+ declare user byte;
+ call mon1(32,user);
+ end setuser;
+
+getfilesize: procedure(fcb);
+ declare fcb address;
+ call mon1(35,fcb);
+ end getfilesize;
+
+declare oldsp address, /* sp on entry */
+ stack(16) address; /* this program's stack */
+
+declare
+ fcbmax literally '512', /* max fcb count */
+ fcbs literally 'memory',/* remainder of memory */
+ fcb(33) byte at (fcba), /* default file control block */
+ buff(128) byte at (buffa); /* default buffer */
+
+declare bpb address; /* bytes per block */
+
+set$bpb: procedure;
+ call set$dpb; /* disk parameters set */
+ bpb = shl(double(1),blkshf) * sectorlen;
+ end set$bpb;
+
+select$disk: procedure(d);
+ declare d byte;
+ /* select disk and set bpb */
+ call select(d);
+ call set$bpb; /* bytes per block */
+ end select$disk;
+
+getalloc: procedure(i) byte;
+ /* return the ith bit of the alloc vector */
+ declare i address;
+ return
+ rol(alloc(shr(i,3)), (i and 111b) + 1);
+ end getalloc;
+
+declare
+ accum(4) byte, /* accumulator */
+ ibp byte; /* input buffer pointer */
+
+compare: procedure(a) byte;
+ /* compare accumulator with four bytes addressed by a */
+ declare a address;
+ declare (s based a) (4) byte;
+ declare i byte;
+ do i = 0 to 3;
+ if s(i) <> accum(i) then return false;
+ end;
+ return true;
+ end compare;
+
+scan: procedure;
+ /* fill accum with next input value */
+ declare (i,b) byte;
+ setacc: procedure(b);
+ declare b byte;
+ accum(i) = b; i = i + 1;
+ end setacc;
+ /* deblank input */
+ do while buff(ibp) = ' '; ibp=ibp+1;
+ end;
+ /* initialize accum length */
+ i = 0;
+ do while i < 4;
+ if (b := buff(ibp)) > 1 then /* valid */
+ call setacc(b); else /* blank fill */
+ call setacc(' ');
+ if b <= 1 or b = ',' or b = ':' or
+ b = '*' or b = '.' or b = '>' or
+ b = '<' or b = '=' then buff(ibp) = 1;
+ else
+ ibp = ibp + 1;
+ end;
+ ibp = ibp + 1;
+ end scan;
+
+pdecimal: procedure(v,prec);
+ /* print value v with precision prec (10,100,1000)
+ with leading zero suppression */
+ declare
+ v address, /* value to print */
+ prec address, /* precision */
+ zerosup byte, /* zero suppression flag */
+ d byte; /* current decimal digit */
+ zerosup = true;
+ do while prec <> 0;
+ d = v / prec ; /* get next digit */
+ v = v mod prec;/* get remainder back to v */
+ prec = prec / 10; /* ready for next digit */
+ if prec <> 0 and zerosup and d = 0 then call printb; else
+ do; zerosup = false; call printchar('0'+d);
+ end;
+ end;
+ end pdecimal;
+
+add$block: procedure(ak,ab);
+ declare (ak, ab) address;
+ /* add one block to the kilobyte accumulator */
+ declare kaccum based ak address; /* kilobyte accum */
+ declare baccum based ab address; /* byte accum */
+ baccum = baccum + bpb;
+ do while baccum >= 1024;
+ baccum = baccum - 1024;
+ kaccum = kaccum + 1;
+ end;
+ end add$block;
+
+count: procedure(mode) address;
+ declare mode byte; /* true if counting 0's */
+ /* count kb remaining, kaccum set upon exit */
+ declare
+ ka address, /* kb accumulator */
+ ba address, /* byte accumulator */
+ i address, /* local index */
+ bit byte; /* always 1 if mode = false */
+ ka, ba = 0;
+ bit = 0;
+ do i = 0 to maxall;
+ if mode then bit = getalloc(i);
+ if not bit then call add$block(.ka,.ba);
+ end;
+ return ka;
+ end count;
+
+abortmsg: procedure;
+ call print(.('** Aborted **',0));
+ end abortmsg;
+
+userstatus: procedure;
+ /* display active user numbers */
+ declare i byte;
+ declare user(32) byte;
+ declare ufcb(*) byte data ('????????????',0,0,0);
+ call print(.('Active User :',0));
+ call pdecimal(getuser,10);
+ call print(.('Active Files:',0));
+ do i = 0 to last(user);
+ user(i) = false;
+ end;
+ call setdma(.fcbs);
+ call search(.ufcb);
+ do while dcnt <> 255;
+ if (i := fcbs(shl(dcnt and 11b,5))) <> 0e5h then
+ user(i and 1fh) = true;
+ call searchn;
+ end;
+ do i = 0 to last(user);
+ if user(i) then call pdecimal(i,10);
+ end;
+ end userstatus;
+
+drivestatus: procedure;
+ declare
+ rpb address,
+ rpd address;
+ pv: procedure(v);
+ declare v address;
+ call crlf;
+ call pdecimal(v,10000);
+ call printchar(':');
+ call printb;
+ end pv;
+ /* print the characteristics of the currently selected drive */
+ call print(.(' ',0));
+ call printchar(cselect+'A');
+ call printchar(':');
+ call printx(.(' Drive Characteristics',0));
+ rpb = shl(double(1),blkshf); /* records/block=2**blkshf */
+ if (rpd := (maxall+1) * rpb) = 0 and (rpb <> 0) then
+ call print(.('65536: ',0)); else
+ call pv(rpd);
+ call printx(.('128 Byte Record Capacity',0));
+ call pv(count(false));
+ call printx(.('Kilobyte Drive Capacity',0));
+ call pv(dirmax+1);
+ call printx(.('32 Byte Directory Entries',0));
+ call pv(shl(chksiz,2));
+ call printx(.('Checked Directory Entries',0));
+ call pv((extmsk+1) * 128);
+ call printx(.('Records/ Extent',0));
+ call pv(rpb);
+ call printx(.('Records/ Block',0));
+ call pv(scptrk);
+ call printx(.('Sectors/ Track',0));
+ call pv(offset);
+ call printx(.('Reserved Tracks',0));
+ call crlf;
+ end drivestatus;
+
+diskstatus: procedure;
+ /* display disk status */
+ declare login address, d byte;
+ login = getlogin; /* login vector set */
+ d = 0;
+ do while login <> 0;
+ if low(login) then
+ do; call select$disk(d);
+ call drivestatus;
+ end;
+ login = shr(login,1);
+ d = d + 1;
+ end;
+ end diskstatus;
+
+match: procedure(va,vl) byte;
+ /* return index+1 to vector at va if match */
+ declare va address,
+ v based va (16) byte,
+ vl byte;
+ declare (i,j,match,sync) byte;
+ j,sync = 0;
+ do sync = 1 to vl;
+ match = true;
+ do i = 0 to 3;
+ if v(j) <> accum(i) then match=false;
+ j = j + 1;
+ end;
+ if match then return sync;
+ end;
+ return 0; /* no match */
+ end match;
+
+declare devl(*) byte data
+ ('VAL:USR:DSK:');
+
+devreq: procedure byte;
+ /* process device request, return true if found */
+
+ declare
+ (i,j,items) byte;
+
+
+ items = 0;
+ do forever;
+ call scan;
+ if (i:=match(.devl,8)) = 0 then return items<>0;
+ items = items+1; /* found first/next item */
+ if i = 1 then /* list possible assignment */
+ do;
+ call print(.('Temp R/O Disk: d:=R/O',0));
+ call print(.('Set Indicator: d:filename.typ ',
+ '$R/O $R/W $SYS $DIR',0));
+ call print(.('Disk Status : DSK: d:DSK:',0));
+ call print(.('User Status : USR:',0));
+ end; else
+ if i = 2 then /* list user status values */
+ call userstatus;
+ else
+ if i = 3 then /* show the disk device status */
+ call diskstatus;
+ /* end of current item, look for more */
+ call scan;
+ if accum(0) = ' ' then return true;
+ if accum(0) <> ',' then
+ do; call print(.('Bad Delimiter',0));
+ return true;
+ end;
+ end; /* of do forever */
+ end devreq;
+
+pvalue: procedure(v);
+ declare (d,zero) byte,
+ (k,v) address;
+ k = 10000;
+ zero = false;
+ do while k <> 0;
+ d = low(v/k); v = v mod k;
+ k = k / 10;
+ if zero or k = 0 or d <> 0 then
+ do; zero = true; call printchar('0'+d);
+ end;
+ end;
+ call printchar('k');
+ call crlf;
+ end pvalue;
+
+comp$alloc: procedure;
+ alloca = getalloca;
+ call printchar(cselect+'A');
+ call printx(.(': ',0));
+ end comp$alloc;
+
+prcount: procedure;
+ /* print the actual byte count */
+ call pvalue(count(true));
+ end prcount;
+
+pralloc: procedure;
+ /* print allocation for current disk */
+ call print (.('Bytes Remaining On ',0));
+ call comp$alloc;
+ call prcount;
+ end pralloc;
+
+prstatus: procedure;
+ /* print the status of the disk system */
+ declare (login, rodisk) address;
+ declare d byte;
+ login = getlogin; /* login vector set */
+ rodisk = getrodisk; /* read only disk vector set */
+ d = 0;
+ do while login <> 0;
+ if low(login) then
+ do; call select$disk(d);
+ call comp$alloc;
+ call printx(.('R/',0));
+ if low(rodisk) then
+ call printchar('O'); else
+ call printchar('W');
+ call printx(.(', Space: ',0));
+ call prcount;
+ end;
+ login = shr(login,1); rodisk = shr(rodisk,1);
+ d = d + 1;
+ end;
+ call crlf;
+ end prstatus;
+
+setdisk: procedure;
+ if fcb(0) <> 0 then call select$disk(fcb(0)-1);
+ end setdisk;
+
+getfile: procedure;
+ /* process file request */
+
+ declare
+ fnam literally '11', fext literally '12',
+ fmod literally '14',
+ frc literally '15', fln literally '15',
+ fdm literally '16', fdl literally '31',
+ ftyp literally '9',
+ rofile literally '9', /* read/only file */
+ infile literally '10'; /* invisible file */
+ declare
+ fcbn address, /* number of fcb's collected so far */
+ finx(fcbmax) address, /* index vector used during sort */
+ fcbe(fcbmax) address, /* extent counts */
+ fcbb(fcbmax) address, /* byte count (mod kb) */
+ fcbk(fcbmax) address, /* kilobyte count */
+ fcbr(fcbmax) address, /* record count */
+ bfcba address, /* index into directory buffer */
+ fcbsa address, /* index into fcbs */
+ bfcb based bfcba (32) byte, /* template over directory */
+ fcbv based fcbsa (16) byte; /* template over fcbs entry */
+ declare
+ i address, /* fcb counter during collection and display */
+ l address, /* used during sort and display */
+ k address, /* " */
+ m address, /* " */
+ kb byte, /* byte counter */
+ lb byte, /* byte counter */
+ mb byte, /* byte counter */
+ (b,f) byte, /* counters */
+ matched byte; /* used during fcbs search */
+
+ multi16: procedure;
+ /* utility to compute fcbs address from i */
+ fcbsa = shl(i,4) + .fcbs;
+ end multi16;
+
+ declare
+ scase byte; /* status case # */
+
+ declare
+ fstatlist(*) byte data('R/O',0,'R/W',0,'SYS',0,'DIR',0);
+
+ setfilestatus: procedure byte;
+ /* eventually, scase set r/o=0,r/w=1,dat=2,sys=3 */
+ declare
+ fstat(*) byte data('R/O R/W SYS DIR ');
+ if doll = ' ' then return false;
+ call move(4,.parm,.accum); /* $???? */
+ if accum(0) = 'S' and accum(1) = ' ' then
+ return not (sizeset := true);
+ /* must be a parameter */
+ if (scase := match(.fstat,4)) = 0 then
+ call print(.('Invalid File Indicator',0));
+ return true;
+ end setfilestatus;
+
+ printfn: procedure;
+ declare (k, lb) byte;
+ /* print file name */
+ do k = 1 to fnam;
+ if (lb := fcbv(k) and 7fh) <> ' ' then
+ do; if k = ftyp then call printchar('.');
+ call printchar(lb);
+ end;
+ end;
+ end printfn;
+
+ call set$bpb; /* in case default disk */
+ call setdisk;
+ sizeset = false;
+ scase = 255;
+ if setfilestatus then
+ do; if scase = 0 then return;
+ scase = scase - 1;
+ end; else
+ if fcb(1) = ' ' then /* no file named */
+ do; call pralloc;
+ return;
+ end;
+ /* read the directory, collect all common file names */
+ fcbn,fcb(0) = 0;
+ fcb(fext),fcb(fmod) = '?'; /* question mark matches all */
+ call search(fcba); /* fill directory buffer */
+ collect: /* label for debug */
+ do while dcnt <> 255;
+ /* another item found, compare it for common entry */
+ bfcba = shl(dcnt and 11b,5)+buffa; /* dcnt mod 4 * 32 */
+ matched = false; i = 0;
+ do while not matched and i < fcbn;
+ /* compare current entry */
+ call multi16;
+ do kb = 1 to fnam;
+ if bfcb(kb) <> fcbv(kb) then kb = fnam; else
+ /* complete match if at end */
+ matched = kb = fnam;
+ end;
+ i = i + 1;
+ end;
+ checkmatched: /* label for debug */
+ if matched then i = i - 1; else
+ do; /* copy to new position in fcbs */
+ fcbn = (i := fcbn) + 1;
+ call multi16;
+ /* fcbsa set to next to fill */
+ if (fcbn > fcbmax) or (fcbsa + 16) >= memsize then
+ do; call print(.('** Too Many Files **',0));
+ i = 0; fcbn = 1;
+ call multi16;
+ end;
+ /* save index to element for later sort */
+ finx(i) = i;
+ do kb = 0 to fnam;
+ fcbv(kb) = bfcb(kb);
+ end;
+ fcbe(i),fcbb(i),fcbk(i),fcbr(i) = 0;
+ end;
+ /* entry is at, or was placed at location i in fcbs */
+ fcbe(i) = fcbe(i) + 1; /* extent incremented */
+ /* record count */
+ fcbr(i) = fcbr(i) + bfcb(frc)
+ + (bfcb(fext) and extmsk) * 128;
+ /* count kilobytes */
+ countbytes: /* label for debug */
+ lb = 1;
+ if maxall > 255 then lb = 2; /* double precision inx */
+ do kb = fdm to fdl by lb;
+ mb = bfcb(kb);
+ if lb = 2 then /* double precision inx */
+ mb = mb or bfcb(kb+1);
+ if mb <> 0 then /* allocated */
+ call add$block(.fcbk(i),.fcbb(i));
+ end;
+ call searchn; /* to next entry in directory */
+ end; /* of do while dcnt <> 255 */
+
+ display: /* label for debug */
+ /* now display the collected data */
+ if fcbn = 0 then call print(.('File Not Found',0)); else
+ if scase = 255 then /* display collected data */
+ do;
+ /* sort the file names in ascending order */
+ if fcbn > 1 then /* requires at least two to sort */
+ do; l = 1;
+ do while l > 0; /* bubble sort */
+ l = 0;
+ do m = 0 to fcbn - 2;
+ i = finx(m+1); call multi16; bfcba = fcbsa; i = finx(m);
+ call multi16; /* sets fcbsa, basing fcbv */
+ do kb = 1 to fnam; /* compare for less or equal */
+ if (b:=bfcb(kb)) < (f:=fcbv(kb)) then /* switch */
+ do; k = finx(m); finx(m) = finx(m + 1);
+ finx(m + 1) = k; l = l + 1; kb = fnam;
+ end;
+ else if b > f then kb = fnam; /* stop compare */
+ end;
+ end;
+ end;
+ end;
+ if sizeset then
+ call print(.(' Size ',0)); else
+ call crlf;
+ call printx(.(' Recs Bytes Ext Acc',0));
+ l = 0;
+ do while l < fcbn;
+ i = finx(l); /* i is the index to next in order */
+ call multi16; call crlf;
+ /* print the file length */
+ call move(16,.fcbv(0),fcba);
+ fcb(0) = 0;
+ if sizeset then
+ do; call getfilesize(fcba);
+ if rovf <> 0 then call printx(.('65536',0)); else
+ call pdecimal(rrec,10000);
+ call printb;
+ end;
+ call pdecimal(fcbr(i),10000); /* rrrrr */
+ call printb; /* blank */
+ call pdecimal(fcbk(i),10000); /* bbbbbk */
+ call printchar('k'); call printb;
+ call pdecimal(fcbe(i),1000); /* eeee */
+ call printb;
+ call printchar('R');
+ call printchar('/');
+ if rol(fcbv(rofile),1) then
+ call printchar('O'); else
+ call printchar('W');
+ call printb;
+ call printchar('A'+cselect); call printchar(':');
+ /* print filename.typ */
+ if (mb:=rol(fcbv(infile),1)) then call printchar('(');
+ call printfn;
+ if mb then call printchar(')');
+ l = l + 1;
+ end;
+ call pralloc;
+ end; else
+ setfileatt: /* label for debug */
+ /* set file attributes */
+ do;
+ l = 0;
+ do while l < fcbn;
+ if break then
+ do; call abortmsg; return;
+ end;
+ i = l;
+ call multi16;
+ call crlf;
+ call printfn;
+ do case scase;
+ /* set to r/o */
+ fcbv(rofile) = fcbv(rofile) or 80h;
+ /* set to r/w */
+ fcbv(rofile) = fcbv(rofile) and 7fh;
+ /* set to sys */
+ fcbv(infile) = fcbv(infile) or 80h;
+ /* set to dir */
+ fcbv(infile) = fcbv(infile) and 7fh;
+ end;
+ /* place name into default fcb location */
+ call move(16,fcbsa,fcba);
+ fcb(0) = 0; /* in case matched user# > 0 */
+ call setind; /* indicators set */
+ call printx(.(' set to ',0));
+ call printx(.fstatlist(shl(scase,2)));
+ l = l + 1;
+ end;
+ end;
+ end getfile;
+
+setdrivestatus: procedure;
+ /* handle possible drive status assignment */
+ call scan; /* remove drive name */
+ call scan; /* check for = */
+ if accum(0) = '=' then
+ do; call scan; /* get assignment */
+ if compare(.('R/O ')) then
+ do; call setdisk; /* a: ... */
+ call writeprot;
+ end; else
+ call print(.('Invalid Disk Assignment',0));
+ end;
+ else /* not a disk assignment */
+ do; call setdisk;
+ if match(.devl,8) = 3 then call drive$status; else
+ call getfile;
+ end;
+ end setdrivestatus;
+
+ /* save stack pointer and reset */
+oldsp = stackptr;
+stackptr = .stack(length(stack));
+/* process request */
+if version < cpmversion then
+ call print(.('Wrong CP/M Version (Requires 2.0 or greater)',0));
+ else
+ do;
+ /* size display if $S set in command */
+ ibp = 1; /* initialize buffer pointer */
+ if fcb(0) = 0 and fcb(1) = ' ' then /* stat only */
+ call prstatus; else
+ do;
+ if fcb(0) <> 0 then
+ call setdrivestatus; else
+ do;
+ if not devreq then /* must be file name */
+ call getfile;
+ end;
+ end;
+ end;
+ /* restore old stack before exit */
+ stackptr = oldsp;
+ end status;
+end;
+
\ No newline at end of file
diff --git a/cpm/pcpm/XSUB.SUB b/cpm/pcpm/XSUB.SUB
new file mode 100644
index 0000000..8d172ad
--- /dev/null
+++ b/cpm/pcpm/XSUB.SUB
@@ -0,0 +1,10 @@
+asm xsub0
+rmac xsub1
+link xsub1[os]
+xsub
+ddt xsub1.spr
+ixsub0.hex
+r
+g0
+save 4 xsubnew.com
+
\ No newline at end of file
diff --git a/cpm/pcpm/XSUB0.ASM b/cpm/pcpm/XSUB0.ASM
new file mode 100644
index 0000000..280b5c1
--- /dev/null
+++ b/cpm/pcpm/XSUB0.ASM
@@ -0,0 +1,135 @@
+; xsub relocator version 2.2
+version equ 20h
+; xsub relocator program, included with the module
+; to perform the move from 200h to the destination address
+;
+; copyright (c) 1979, 1980
+; digital research
+; box 579
+; pacific grove, ca.
+; 93950
+;
+ org 100h
+ db (lxi or (b shl 3)) ;lxi b,module size
+ org $+2 ;skip address field
+ jmp start
+ db ' Extended Submit Vers '
+ db version/16+'0','.',version mod 16+'0'
+nogo: db 'Xsub Already Present$'
+badver: db 'Requires CP/M Version 2.0 or later$'
+;
+bdos equ 0005h ;bdos entry point
+print equ 9 ;bdos print function
+vers equ 12 ;get version number
+ccplen equ 0800h ;size of ccp
+module equ 200h ;module address
+;
+start:
+; ccp's stack used throughout
+ push b ;save the module's length
+ lda bdos+1 ;xsub already present?
+ cpi 06h ;low address must be 06h
+ jnz loaderr
+ lhld bdos+1
+ inx h
+ inx h
+ inx h
+ lxi d,xsubcon
+ mvi c,4
+present:
+ ldax d
+ cmp m
+ jnz continue
+ inx h
+ inx d
+ dcr c
+ jz loaderr
+ jmp present
+;
+loaderr:
+; bdos or xsub not lowest module in memory, return to ccp
+ mvi c,print
+ lxi d,nogo ;already present message
+ call bdos ;to print the message
+ pop b ;recall length
+ ret ;to the ccp
+;
+continue:
+ mvi c,vers
+ call bdos ;version number?
+ cpi version ;2.0 or greater
+ jnc versok
+;
+; wrong version
+ mvi c,print
+ lxi d,badver
+ call bdos
+ pop b
+ ret ;to ccp
+;
+versok:
+ lxi h,bdos+2;address field of jump to bdos (top memory)
+ mov a,m ;a has high order address of memory top
+ dcr a ;page directly below bdos
+ sui (ccplen shr 8) ;-ccp pages
+ pop b ;recall length of module
+ push b ;and save it again
+ sub b ;a has high order address of reloc area
+ mov d,a
+ mvi e,0 ;d,e addresses base of reloc area
+ push d ;save for relocation below
+;
+ lxi h,module;ready for the move
+move: mov a,b ;bc=0?
+ ora c
+ jz reloc
+ dcx b ;count module size down to zero
+ mov a,m ;get next absolute location
+ stax d ;place it into the reloc area
+ inx d
+ inx h
+ jmp move
+;
+reloc: ;storage moved, ready for relocation
+; hl addresses beginning of the bit map for relocation
+ pop d ;recall base of relocation area
+ pop b ;recall module length
+ push h ;save bit map base in stack
+ mov h,d ;relocation bias is in d
+;
+rel0: mov a,b ;bc=0?
+ ora c
+ jz endrel
+;
+; not end of the relocation, may be into next byte of bit map
+ dcx b ;count length down
+ mov a,e
+ ani 111b ;0 causes fetch of next byte
+ jnz rel1
+; fetch bit map from stacked address
+ xthl
+ mov a,m ;next 8 bits of map
+ inx h
+ xthl ;base address goes back to stack
+ mov l,a ;l holds the map as we process 8 locations
+rel1: mov a,l
+ ral ;cy set to 1 if relocation necessary
+ mov l,a ;back to l for next time around
+ jnc rel2 ;skip relocation if cy=0
+;
+; current address requires relocation
+ ldax d
+ add h ;apply bias in h
+ stax d
+rel2: inx d ;to next address
+ jmp rel0 ;for another byte to relocate
+;
+endrel: ;end of relocation
+ pop d ;clear stacked address
+; h has the high order 8-bits of relocated module address
+ mvi l,0
+ pchl ;go to relocated program
+xsubcon:
+ db 'xsub'
+ end
+
\ No newline at end of file
diff --git a/cpm/pcpm/XSUB1.ASM b/cpm/pcpm/XSUB1.ASM
new file mode 100644
index 0000000..26c203b
--- /dev/null
+++ b/cpm/pcpm/XSUB1.ASM
@@ -0,0 +1,232 @@
+; xsub 'Extended Submit Facility' version 2.2
+;
+;
+;
+; xsub loads below ccp, and feeds command lines to
+; programs which read buffered input
+;
+bias equ 0000h ;bias for relocation
+base equ 0ffffh ;no intercepts below here
+wboot equ 0000h
+bdos equ 0005h
+bdosl equ bdos+1
+dbuff equ 0080h
+;
+cr equ 0dh ;carriage return
+lf equ 0ah ;line feed
+modnum equ 14 ;module number position
+pbuff equ 9 ;print buffer
+rbuff equ 10 ;read buffer
+openf equ 15 ;open file
+closef equ 16 ;close file
+delf equ 19 ;delete file
+dreadf equ 20 ;disk read
+dmaf equ 26 ;set dma function
+;
+;
+ org 0000h+bias
+; initialize jmps to include xsub module
+ jmp start
+ ds 3
+trapjmp:
+ jmp trap
+ db 'xsub'
+start:
+ lhld wboot+1
+ shld savboot
+ lxi h,wstart
+ shld wboot+1
+ lhld bdosl
+ shld rbdos+1 ;real bdos entry
+ lxi h,trapjmp ;address to fill
+ shld bdosl ;jmp @0005 leads to trap
+ pop h ;ccp return address
+ shld ccpret
+ pchl ;back to ccp
+;
+savboot:
+ ds 2 ;warm boot saved and restored at end
+ ;of submit file
+;
+wstart:
+ lxi sp,stack
+ mvi c,pbuff ;print message
+ CALL GET$SUBADDR
+ lxi d,actmsg
Š CNZ rbdos
+ lxi h,dbuff ;restore default buffer
+ shld udma
+ call rsetdma
+ lxi h,trapjmp
+ shld bdosl ;fixup low jump address
+ lhld ccpret ;back to ccp
+ pchl
+
+actmsg: db cr,lf,'(xsub active)$'
+;
+trap: ;arrive here at each bdos call
+ pop h ;return address
+ push h ;back to stack
+ mov a,h ;high address
+ cpi base shr 8
+ jnc rbdos ;skip calls on bdos above here
+ mov a,c ;function number
+ cpi rbuff
+ jz rnbuff ;read next buffer
+ cpi dmaf ;set dma address?
+ jnz rbdos ;skip if not
+ xchg ;dma to hl
+ shld udma ;save it
+ xchg
+rbdos: jmp 0000h ;filled in at initialization
+;
+setdma:
+ lxi d,combuf
+SETDMA1:
+ mvi c,dmaf
+ JMP RBDOS
+;
+rsetdma:
+ lhld udma
+ xchg
+ JMP SETDMA1
+;
+GET$SUBADDR:
+ LHLD RBDOS+1
+ MVI L,09H
+ MOV E,M
+ INX H
+ MOV D,M
+ XCHG
+ MOV A,M
+ ORA A
+ RET
+;
+DELETE$SUB:
+ CALL GET$SUBADDR
+ MVI M,0
+ MVI C,DELF
+ LXI D,SUBFCB
+;
Šfbdos:
+ push b
+ push d
+ call setdma
+ pop d
+ pop b
+ call rbdos
+ push psw
+ call rsetdma
+ pop psw
+ ret
+;
+cksub: ;check for sub file present
+ CALL GET$SUBADDR
+ RZ
+ INX H
+ LXI D,SUBS1
+ MVI C,20
+;
+MOVE:
+ INR C
+MOVE1:
+ ORA C
+ DCR C
+ RZ
+ MOV A,M
+ STAX D
+ INX H
+ INX D
+ JMP MOVE1
+;
+rnbuff:
+ push d ;command address
+ call cksub ;sub file present?
+ pop d
+ mvi c,rbuff
+ ORA A
+ jz restor ;no sub file
+;
+ push d
+ lda subrc ;length of file
+ ora a ;zero?
+ jz rbdos ;skip if so
+ dcr a ;length - 1
+ sta subcr ;next to read
+ mvi c,dreadf
+ lxi d,subfcb
+ call fbdos ;read record
+ ORA A
+ JZ READOK
+
+ CALL DELETE$SUB
+ MVI C,0
+restor:
+ lhld savboot
Š shld wboot+1
+ jmp rbdos
+
+READOK:
+; now print the buffer with cr,lf
+
+ lxi h,combuf
+ mov e,m ;length
+ mvi d,0 ;high order 00
+ dad d ;to last character position
+ inx h
+ mvi m,cr
+ inx h
+ mvi m,lf
+ inx h
+ mvi m,'$'
+ mvi c,pbuff
+ lxi d,combuf+1
+ LDAX D
+ CPI 3
+ CNZ rbdos ;to print it
+ pop h ;.max length
+ lxi d,combuf
+ ldax d ;how long?
+ cmp m ;cy if ok
+ jc movlin
+ mov a,m ;max length
+ stax d ;truncate length
+movlin:
+ mov c,a ;length to c
+ inr c ;+1
+ inx h ;to length of line
+ XCHG
+ CALL MOVE
+ CALL GET$SUBADDR
+
+ PUSH H ;.SUBFLAG
+ INX H ;.FCB(S1)
+ INX H ;.FCB(S2)
+ INX H ;.FCB(RC)
+ DCR M
+ POP H
+ CZ DELETE$SUB
+ LDA COMBUF+1 ;^C?
+ CPI 3
+ RNZ
+ MVI C,PBUFF
+ LXI D,CTLCMSG
+ CALL RBDOS
+ JMP WBOOT
+;
+subfcb:
+ db 1 ;a:
+ db '$$$ '
+ db 'SUB'
Š db 0
+SUBS1:
+ DB 0,0
+subrc:
+ ds 1
+ ds 16 ;map
+subcr: ds 1
+;
+CTLCMSG:DB '^C$'
+combuf: ds 131
+udma: dw dbuff
+ccpret: ds 2 ;ccp return address
+ ds 24 ;12 level stack
+stack:
+ end
+
\ No newline at end of file
diff --git a/emu/c++ b/emu/c++
new file mode 160000
index 0000000..7ca2a9e
--- /dev/null
+++ b/emu/c++
@@ -0,0 +1 @@
+Subproject commit 7ca2a9e1c0d04b3823fe7d785a9a097720a68709
diff --git a/emu/yaze/.yazerc b/emu/yaze/.yazerc
new file mode 100644
index 0000000..995977c
--- /dev/null
+++ b/emu/yaze/.yazerc
@@ -0,0 +1,4 @@
+mount a transfer
+mount b disk
+mount c COBOL
+go
diff --git a/emu/yaze/COBOL/CALL.ASM b/emu/yaze/COBOL/CALL.ASM
new file mode 100644
index 0000000..3300152
--- /dev/null
+++ b/emu/yaze/COBOL/CALL.ASM
@@ -0,0 +1,23 @@
+; Program "Call" called by "Testcall"; this is assembler version;
+; compare with functionally equivalent COBOL version.
+
+ cseg
+
+ ldax b ; read first param: A = text length
+loop:
+ dcr a ; count down length
+ rm ; finished
+ push psw
+ ldax d ; next byte from second param = text
+ inx d
+ push d
+ mov e,a
+ mvi c,6 ; CP/M function code
+ call 5 ; call CP/M to send character
+ pop d
+ pop psw
+ jmp loop
+
+; End of demonstration program "Call"
+
+end
diff --git a/emu/yaze/COBOL/CALL.CBL b/emu/yaze/COBOL/CALL.CBL
new file mode 100644
index 0000000..b452a83
--- /dev/null
+++ b/emu/yaze/COBOL/CALL.CBL
@@ -0,0 +1,26 @@
+000000******************************************************************
+000000*
+000000* Program "Call" called by "Testcall"; this is COBOL version;
+000000* compare with functionally equivalent assembler version.
+000000*
+000000******************************************************************
+000000 Working-storage section.
+000000 01 temp pic 9(2) comp.
+000000 01 text-buffer value space.
+000000 02 tbuf-table pic x occurs 80.
+000000 Linkage section.
+000000 01 mess-text.
+000000 02 mtex-table pic x occurs 80.
+000000 01 mess-size pic 9(2) comp.
+000000 Procedure division using mess-size,mess-text.
+000000 l.
+000000 move 0 to temp perform move-byte until temp = mess-size.
+000000 display text-buffer.
+000000 exit program.
+000000 move-byte.
+000000 add 1 to temp move mtex-table (temp) to tbuf-table (temp).
+000000******************************************************************
+000000*
+000000* End of demonstration program "Call"
+000000*
+000000******************************************************************
diff --git a/emu/yaze/COBOL/CALL.INT b/emu/yaze/COBOL/CALL.INT
new file mode 100644
index 0000000..68c2a20
Binary files /dev/null and b/emu/yaze/COBOL/CALL.INT differ
diff --git a/emu/yaze/COBOL/CALL.PRL b/emu/yaze/COBOL/CALL.PRL
new file mode 100644
index 0000000..a877d42
Binary files /dev/null and b/emu/yaze/COBOL/CALL.PRL differ
diff --git a/emu/yaze/COBOL/CLI b/emu/yaze/COBOL/CLI
new file mode 100644
index 0000000..d382802
Binary files /dev/null and b/emu/yaze/COBOL/CLI differ
diff --git a/emu/yaze/COBOL/CLI.CBL b/emu/yaze/COBOL/CLI.CBL
new file mode 100644
index 0000000..fc39ba3
--- /dev/null
+++ b/emu/yaze/COBOL/CLI.CBL
@@ -0,0 +1,240 @@
+000000 IDENTIFICATION DIVISION.
+000000******************************************************************
+000000* *
+000000* COPYRIGHT (C) 1982,1982 MICRO FOCUS LTD. *
+000000* *
+000000* MICRO FOCUS LTD. *
+000000* 58, ACACIA ROAD, *
+000000* ST. JOHNS WOOD, *
+000000* LONDON NW8 6AG. *
+000000* *
+000000* TEL. 01 722 8843/4/5/6/7 *
+000000* TELEX 28536 MICROF G *
+000000* *
+000000******************************************************************
+000000*
+000000 PROGRAM-ID. COMMAND LINE INTERPRETOR.
+000000 AUTHOR. MICRO FOCUS LTD.
+000000 INSTALLATION. MICRO FOCUS - SWINDON.
+000000 DATE-WRITTEN. 6TH DECEMBER 1982.
+000000 DATE-COMPILED. 6TH DECEMBER 1982.
+000000*
+000000 ENVIRONMENT DIVISION.
+000000 SOURCE-COMPUTER. 8080.
+000000 OBJECT-COMPUTER. 8080.
+000000 SPECIAL-NAMES. CONSOLE IS CRT.
+000000/*****************************************************************
+000000* *
+000000* DATA USED BY THE CLI TO STORE THE USER'S INSTRUCTIONS. *
+000000* *
+000000******************************************************************
+000000*
+000000 DATA DIVISION.
+000000 WORKING-STORAGE SECTION.
+000000*
+000000 01 TEMP PIC 9(2) COMP.
+000000 01 SUB1 PIC 9(2) COMP.
+000000 01 SUB2 PIC 9(2) COMP.
+000000 01 SUB2-SAV PIC 9(2) COMP.
+000000 01 TMAX PIC 9(2) COMP.
+000000 01 CHOICE PIC X.
+000000*
+000000 01 RTS-ROUTINES.
+000000 02 POKE-CLI PIC X VALUE X"91".
+000000 02 CHAIN PIC X VALUE X"84".
+000000 02 GET-CHAR PIC X VALUE X"D8".
+000000 02 SOUND-ALARM PIC X VALUE X"E5".
+000000*
+000000* DISPLAY LINES
+000000*
+000000 01 INIT-LINE.
+000000 02 INIT-LINE-1 PIC X(68) VALUE "COBOL: A(nimate) C(ompile) D(
+000000- "rive) F(orms2) Q(uit) R(un) S(witches)".
+000000 02 FILLER PIC X(4).
+000000 02 INIT-CHOICE PIC X.
+000000*
+000000 01 FILE-QUESTION-LINE.
+000000 02 FQL-1 PIC X(22) VALUE "Enter name of file to ".
+000000 02 VERB PIC X(8).
+000000*
+000000* COMMAND-LINE COMPONENTS
+000000*
+000000 01 SWITCH-AREA.
+000000 02 FILLER PIC X VALUE "(".
+000000 02 SWITCHES PIC X(40) VALUE SPACE.
+000000*
+000000 01 FILE-NAME PIC X(16).
+000000*
+000000 01 CLI-REST PIC X(80).
+000000*
+000000 01 WORK-AREA.
+000000 02 WORK-BYTE PIC 9(2) OCCURS 80 COMP.
+000000*
+000000 01 OUTPUT-CLI VALUE SPACE.
+000000 02 OUT-BYTE PIC 9(2) OCCURS 128 COMP.
+000000*
+000000 01 PROG-AREA.
+000000 02 DRIVE PIC X VALUE SPACE.
+000000 02 FILLER PIC X VALUE ":".
+000000 02 PROG-NAME PIC X(16).
+000000*
+000000/*****************************************************************
+000000* *
+000000* MAIN ENTRY TO CLI PROGRAM. IS USED BY ORDINARY ENTRY TO *
+000000* COMMAND LINE INTERPRETOR, AS WELL AS BY PROGRAMS WHICH ARE *
+000000* RETURNING CONTROL TO THE CLI FOR CONTINUATION COMMANDS. *
+000000* *
+000000******************************************************************
+000000*
+000000 PROCEDURE DIVISION.
+000000 MAIN-ENTRY.
+000000*
+000000* TEST IF SCREEN SHOULD BE CLEARED. IF "X" ON COMMAND LINE, THEN
+000000* THIS IS A SECOND OR SUBSEQUENT ENTRY, AND THE SCREEN SHOULD
+000000* NOT BE CLEARED.
+000000*
+000000 ACCEPT WORK-AREA FROM CONSOLE.
+000000 IF WORK-AREA NOT = "X"
+000000 DISPLAY SPACE.
+000000 CALL SOUND-ALARM.
+000000*
+000000 LOOP.
+000000 MOVE SPACE TO INIT-CHOICE.
+000000 DISPLAY INIT-LINE.
+000000 DISPLAY LOW-VALUE AT 0170.
+000000 CALL GET-CHAR USING CHOICE.
+000000 DISPLAY SPACE.
+000000 MOVE CHOICE TO INIT-CHOICE.
+000000 DISPLAY INIT-LINE.
+000000*
+000000 IF CHOICE = "A" OR "a"
+000000 MOVE "ANIMATE:" TO VERB
+000000 MOVE "ANIMATE.COM" TO PROG-NAME
+000000 GO TO FILE-QUESTION.
+000000 IF CHOICE = "C" OR "c"
+000000 MOVE "COMPILE:" TO VERB
+000000 MOVE "COBOL.COM" TO PROG-NAME
+000000 GO TO FILE-QUESTION.
+000000 IF CHOICE = "D" OR "d"
+000000 GO TO DRIVE-SET.
+000000 IF CHOICE = "F" OR "f"
+000000 MOVE "FORMS2.COM" TO PROG-NAME
+000000 MOVE 0 TO SUB2
+000000 GO TO LOADER.
+000000 IF CHOICE = "Q" OR "q"
+000000 GO TO EXITING.
+000000 IF CHOICE = "R" OR "r"
+000000 MOVE "RUN:" TO VERB
+000000 MOVE "RUN.COM" TO PROG-NAME
+000000 GO TO FILE-QUESTION.
+000000 IF CHOICE = "S" OR "s"
+000000 GO TO SWITCH-SET.
+000000 CALL SOUND-ALARM.
+000000 GO TO LOOP.
+000000*
+000000/*****************************************************************
+000000* *
+000000* CODE TO HANDLE FILENAME OF PROGRAM TO BE COMPILED, ANIMATED *
+000000* OR EXECUTED. *
+000000* *
+000000******************************************************************
+000000*
+000000 FILE-QUESTION.
+000000 MOVE SPACE TO FILE-NAME.
+000000 DISPLAY FILE-QUESTION-LINE AT 0201.
+000000 ACCEPT FILE-NAME AT 0232.
+000000 IF FILE-NAME = SPACES
+000000 GO TO LOOP.
+000000*
+000000 PERFORM CLEAR-LINES.
+000000 MOVE SPACE TO CLI-REST.
+000000 DISPLAY "Any further command line ?" AT 0201.
+000000 ACCEPT CLI-REST AT 0301.
+000000*
+000000 MOVE 0 TO SUB2.
+000000 IF "RUN.COM" = PROG-NAME
+000000 IF SPACE NOT = SWITCHES
+000000 MOVE SWITCH-AREA TO WORK-AREA
+000000 MOVE 41 TO TMAX
+000000 MOVE 0 TO SUB1
+000000 PERFORM TRANSFER-BUFFER
+000000 ADD 1 TO SUB2
+000000 MOVE 41 TO OUT-BYTE (SUB2).
+000000 MOVE FILE-NAME TO WORK-AREA.
+000000 MOVE 0 TO SUB1.
+000000 MOVE 16 TO TMAX.
+000000 PERFORM TRANSFER-BUFFER.
+000000 MOVE CLI-REST TO WORK-AREA.
+000000 MOVE 0 TO SUB1.
+000000 MOVE 80 TO TMAX.
+000000 PERFORM TRANSFER-BUFFER.
+000000 IF SUB2 > 80
+000000 GO TO CLI-OVF.
+000000*
+000000* COMMAND LINE NOW CREATED, CHAIN TO THE NEXT PROGRAM. THIS
+000000* IS DONE BY SETTING A COMMAND LINE FOR THE RTS TO EXECUTE.
+000000*
+000000 LOADER.
+000000 CALL POKE-CLI USING SUB2, OUTPUT-CLI.
+000000 PERFORM CLEAR-LINES.
+000000 DISPLAY "Loading ..." at 0201.
+000000 DISPLAY LOW-VALUE AT 0301.
+000000 IF DRIVE = SPACE
+000000 CALL CHAIN USING PROG-NAME
+000000 ELSE
+000000 CALL CHAIN USING PROG-AREA.
+000000*
+000000/*****************************************************************
+000000* *
+000000* SUPPORT CLI ROUTINES, USED TO MANIPULATE THE FIELDS BEFORE *
+000000* CONTROL IS TRANSFERRED TO A SUPPORT PROGRAM. *
+000000* *
+000000******************************************************************
+000000*
+000000 SWITCH-SET.
+000000 MOVE SPACE TO SWITCHES.
+000000 DISPLAY "Switches:" AT 0201.
+000000 ACCEPT SWITCHES AT 0211.
+000000 INSPECT SWITCHES REPLACING
+000000 ALL "(" BY SPACE
+000000 ALL ")" BY SPACE.
+000000 GO TO LOOP.
+000000*
+000000 DRIVE-SET.
+000000 DISPLAY "Enter Drive:" AT 0201.
+000000 ACCEPT DRIVE AT 0214.
+000000 GO TO LOOP.
+000000*
+000000 EXITING.
+000000 DISPLAY "Returning to CP/M" AT 0201.
+000000 DISPLAY LOW-VALUE AT 0301.
+000000 STOP RUN.
+000000*
+000000/*****************************************************************
+000000* *
+000000* WORK ROUTINES USED TO MANIPULATE THE SCREEN. *
+000000* *
+000000******************************************************************
+000000*
+000000 CLI-OVF.
+000000 PERFORM CLEAR-LINES.
+000000 DISPLAY "Command buffer overflow" AT 0301.
+000000 GO TO LOOP.
+000000*
+000000 CLEAR-LINES.
+000000 MOVE SPACE TO WORK-AREA.
+000000 DISPLAY WORK-AREA AT 0201.
+000000 DISPLAY WORK-AREA AT 0301.
+000000*
+000000 TRANSFER-BUFFER.
+000000 ADD 1 TO SUB1.
+000000 ADD 1 TO SUB2.
+000000 MOVE WORK-BYTE (SUB1) TO TEMP.
+000000 IF TEMP NOT = 32
+000000 MOVE SUB2 TO SUB2-SAV
+000000 MOVE TEMP TO OUT-BYTE (SUB2).
+000000 IF SUB1 < TMAX
+000000 GO TO TRANSFER-BUFFER.
+000000 MOVE SUB2-SAV TO SUB2.
+000000 ADD 1 TO SUB2.
+000000*
diff --git a/emu/yaze/COBOL/CLI.COM b/emu/yaze/COBOL/CLI.COM
new file mode 100644
index 0000000..08e83e6
Binary files /dev/null and b/emu/yaze/COBOL/CLI.COM differ
diff --git a/emu/yaze/COBOL/COBOL b/emu/yaze/COBOL/COBOL
new file mode 100644
index 0000000..c0d5fcc
Binary files /dev/null and b/emu/yaze/COBOL/COBOL differ
diff --git a/emu/yaze/COBOL/COBOL.COM b/emu/yaze/COBOL/COBOL.COM
new file mode 100644
index 0000000..f9e131b
Binary files /dev/null and b/emu/yaze/COBOL/COBOL.COM differ
diff --git a/emu/yaze/COBOL/COBOL.ERR b/emu/yaze/COBOL/COBOL.ERR
new file mode 100644
index 0000000..890d40e
--- /dev/null
+++ b/emu/yaze/COBOL/COBOL.ERR
@@ -0,0 +1,160 @@
+Compiler error; consult Technical Support
+Illegal format : Data-name
+Illegal format : Literal, or invalid use of ALL
+Illegal format : Character
+Data-name not unique
+Too many data or procedure names declared
+Illegal character in column 7 or continuation error
+Nested COPY statement or unknown COPY file specified
+'.' missing
+Statement starts in wrong area of source line
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+'.' missing
+DIVISION missing
+SECTION missing
+IDENTIFICATION missing
+PROGRAM-ID missing
+AUTHOR missing
+INSTALLATION missing
+DATE-WRITTEN missing
+SECURITY missing
+ENVIRONMENT missing
+CONFIGURATION missing
+SOURCE-COMPUTER missing
+OBJECT-COMPUTER/SPECIAL-NAMES clause error
+OBJECT-COMPUTER missing
+Compiler error; consult Technical Support
+SPECIAL-NAMES missing
+SWITCH clause error or system name/mnemonic name error
+DECIMAL-POINT clause error
+CONSOLE clause error
+Illegal currency symbol
+'.' missing
+DIVISION missing
+SECTION missing
+INPUT-OUTPUT missing
+FILE-CONTROL missing
+ASSIGN missing
+SEQUENTIAL or RELATIVE or INDEXED missing
+ACCESS missing on indexed/relative file
+SEQUENTIAL or DYNAMIC missing or > 64 alternate keys
+Illegal ORGANIZATION/ACCESS/KEY combination
+Unrecognized phrase in SELECT clause
+RERUN clause syntax error
+SAME AREA clause syntax error
+Missing or illegal file-name
+DATA DIVISION missing
+PROCEDURE DIVISION missing or unknown statement
+Program collating sequence not defined
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+'.' missing
+DIVISION missing
+SECTION missing
+File-name not specified in SELECT stmt or invalid CD name
+RECORD SIZE integer missing or line sequential rec > 1024 bytes
+Illegal level no (01-49),01 level reqd,or level hierarachy wrong
+FD, CD or SD qualification syntax error
+WORKING-STORAGE missing
+PROCEDURE DIVISION missing or unknown statement
+Data description qualifier or '.' missing
+Incompatible PICTURE clause and qualifiers
+BLANK illegal with non-numeric data-item
+PICTURE clause too long
+VALUE with non-elementary item,wrong data-type or value truncated
+VALUE in error or illegal for PICTURE type
+Non-elementary item has FILLER/SYNC/JUST/BLANK clause
+Preceding item at this level has > 8192 bytes or 0 bytes
+REDEFINES of unequal fields or different levels
+Data storage exceeds 64K bytes
+Compiler error; consult Technical Support
+Data description qualifier inappropriate or repeated
+REDEFINES data-name not declared
+USAGE must be COMP,DISPLAY or INDEX
+SIGN must be LEADING or TRAILING
+SYNCHRONIZED must be LEFT or RIGHT
+JUSTIFIED must be RIGHT
+BLANK must be ZERO
+OCCURS must be numeric, non-zero, unsigned or DEPENDING
+VALUE must be literal, numeric literal or figurative constant
+PICTURE string has illegal precedence or illegal char
+INDEXED data-name missing or already declared
+Numeric-edited PICTURE string is too large
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Unrecognized verb
+IF....ELSE mismatch
+Operand has wrong data-type, is not declared or '.' missing
+Procedure not unique
+Procedure name same as data-name
+Name required
+Wrong combination of data-types
+Conditional statement not allowed in this context
+Malformed subscript
+ACCEPT/DISPLAY wrong or Communications syntax incorrect
+Illegal syntax used with I-O verb
+Invalid arithmetic statement
+Invalid arithmetic expression
+Compiler error; consult Technical Support
+Invalid conditional expression
+IF stmts nested too deep, or too many AFTERs in PERFORM stmt
+Incorrect structure of PROCEDURE DIVISION
+Reserved word missing or incorrectly used
+Too many subscripts in one statement (internal buffer overflow)
+Too many operands in one statement
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Inter-segment procedure name duplication
+Unterminated condition at end of source
+Operand has wrong data-type or not declared
+Procedure name undeclared
+INDEX data-name declared twice
+Bad cursor control : illegal AT clause
+KEY declaration missing or illegal
+STATUS declaration missing
+Bad STATUS record
+Undefined inter-segment reference or error in ALTERed para
+PROCEDURE DIVISION in error
+USING parameter not declared in LINKAGE SECTION
+USING parameter not level 01 or 77
+USING parameter used twice in parameter list
+FD missing
+Compiler error; consult Technical Support
+Incorrect structure of PROCEDURE DIVISION
+Compiler error; consult Technical Support
+Compiler error; consult Technical Support
+Too many operands in one statement
diff --git a/emu/yaze/COBOL/COBOL.I51 b/emu/yaze/COBOL/COBOL.I51
new file mode 100644
index 0000000..c7bf8fb
Binary files /dev/null and b/emu/yaze/COBOL/COBOL.I51 differ
diff --git a/emu/yaze/COBOL/COBOL.I52 b/emu/yaze/COBOL/COBOL.I52
new file mode 100644
index 0000000..07953e3
Binary files /dev/null and b/emu/yaze/COBOL/COBOL.I52 differ
diff --git a/emu/yaze/COBOL/COBOL.I53 b/emu/yaze/COBOL/COBOL.I53
new file mode 100644
index 0000000..2506bd7
Binary files /dev/null and b/emu/yaze/COBOL/COBOL.I53 differ
diff --git a/emu/yaze/COBOL/COBOL.I56 b/emu/yaze/COBOL/COBOL.I56
new file mode 100644
index 0000000..4f1be47
Binary files /dev/null and b/emu/yaze/COBOL/COBOL.I56 differ
diff --git a/emu/yaze/COBOL/COBOL.I59 b/emu/yaze/COBOL/COBOL.I59
new file mode 100644
index 0000000..2566943
Binary files /dev/null and b/emu/yaze/COBOL/COBOL.I59 differ
diff --git a/emu/yaze/COBOL/COBOL.ISR b/emu/yaze/COBOL/COBOL.ISR
new file mode 100644
index 0000000..6ad3a50
Binary files /dev/null and b/emu/yaze/COBOL/COBOL.ISR differ
diff --git a/emu/yaze/COBOL/CONFIG b/emu/yaze/COBOL/CONFIG
new file mode 100644
index 0000000..ea03942
Binary files /dev/null and b/emu/yaze/COBOL/CONFIG differ
diff --git a/emu/yaze/COBOL/IXSIO.INT b/emu/yaze/COBOL/IXSIO.INT
new file mode 100644
index 0000000..38fc577
Binary files /dev/null and b/emu/yaze/COBOL/IXSIO.INT differ
diff --git a/emu/yaze/COBOL/PI.CBL b/emu/yaze/COBOL/PI.CBL
new file mode 100644
index 0000000..4a952fb
--- /dev/null
+++ b/emu/yaze/COBOL/PI.CBL
@@ -0,0 +1,83 @@
+ IDENTIFICATION DIVISION.
+ PROGRAM-ID. PI-CALC.
+ AUTHOR. PF/TR.
+ *
+ ENVIRONMENT DIVISION.
+ CONFIGURATION SECTION.
+ OBJECT-COMPUTER. MDS-800.
+ SPECIAL-NAMES. CONSOLE IS CRT.
+ *
+ DATA DIVISION.
+ WORKING-STORAGE SECTION.
+ *
+ 01 SCREEN PIC X(1920).
+ *
+ 01 DI-1 REDEFINES SCREEN.
+ 02 FILLER PIC X(160).
+ 02 DI-TX1 PIC X(160).
+ 02 DI-TX2 PIC X(13).
+ 02 DI-TERM PIC X(15).
+ 02 FILLER PIC X(136).
+ 02 DI-TX3 PIC X(6).
+ 02 DI-PI PIC X(15).
+ 02 FILLER PIC X(1415).
+ *
+ 01 DI-2 REDEFINES SCREEN.
+ 02 FILLER PIC X(333).
+ 02 DI-TERM2 PIC X(15).
+ 02 FILLER PIC X(142).
+ 02 DI-PI2 PIC X(15).
+ 02 FILLER PIC X(1415).
+ *
+ 01 WORK-AREA.
+ 02 PI PIC S9V9(14).
+ 02 TERM PIC S9V9(14).
+ 02 W PIC S9V9(14).
+ 02 N PIC 9999.
+ 02 N1 PIC 9999.
+ 02 N2 PIC 9999.
+ 02 ED PIC -9.9(12).
+ *
+ 01 CONSTANTS.
+ 02 TX1 PIC X(17) VALUE "CALCULATION OF PI".
+ 02 TX2 PIC X(12) VALUE "NEXT TERM IS".
+ 02 TX3 PIC X(5) VALUE "PI IS".
+ *
+ PROCEDURE DIVISION.
+ LA-START.
+ DISPLAY SPACE.
+ MOVE SPACE TO SCREEN.
+ MOVE TX1 TO DI-TX1.
+ MOVE TX2 TO DI-TX2.
+ MOVE TX3 TO DI-TX3.
+ MOVE 0.5 TO ED.
+ MOVE ED TO DI-TERM.
+ MOVE 3 TO ED.
+ MOVE ED TO DI-PI.
+ DISPLAY DI-1.
+ MOVE 0.5 TO PI.
+ MOVE 0.5 TO TERM.
+ MOVE 3 TO N.
+ LOOP.
+ MOVE N TO N2.
+ SUBTRACT 2 FROM N2.
+ MULTIPLY N2 BY N2.
+ MULTIPLY N2 BY TERM.
+ MOVE N TO N1.
+ SUBTRACT 1 FROM N1.
+ MULTIPLY N BY N1.
+ MULTIPLY 4 BY N1.
+ DIVIDE N1 INTO TERM.
+ IF TERM < 0.0000000000001 THEN GO TO HALT.
+ ADD TERM TO PI.
+ MOVE PI TO W.
+ MULTIPLY 6 BY W.
+ MOVE W TO ED.
+ MOVE ED TO DI-PI2.
+ MOVE TERM TO ED.
+ MOVE ED TO DI-TERM2.
+ DISPLAY DI-2.
+ ADD 2 TO N.
+ IF N < 100 GO TO LOOP.
+ HALT.
+ STOP RUN.
diff --git a/emu/yaze/COBOL/RUN.COM b/emu/yaze/COBOL/RUN.COM
new file mode 100644
index 0000000..5a7d240
Binary files /dev/null and b/emu/yaze/COBOL/RUN.COM differ
diff --git a/emu/yaze/COBOL/STOCK1.CBL b/emu/yaze/COBOL/STOCK1.CBL
new file mode 100644
index 0000000..3a73fd3
--- /dev/null
+++ b/emu/yaze/COBOL/STOCK1.CBL
@@ -0,0 +1,59 @@
+000010 IDENTIFICATION DIVISION.
+000020 PROGRAM-ID. STOCK-FILE-SET-UP.
+000030 AUTHOR. MICRO FOCUS LTD.
+000040 ENVIRONMENT DIVISION.
+000050 CONFIGURATION SECTION.
+000060 SOURCE-COMPUTER. MDS-800.
+000070 OBJECT-COMPUTER. MDS-800.
+000075 SPECIAL-NAMES. CONSOLE IS CRT.
+000080 INPUT-OUTPUT SECTION.
+000090 FILE-CONTROL.
+000100 SELECT STOCK-FILE ASSIGN "STOCK.IT"
+000110 ORGANIZATION INDEXED
+000120 ACCESS DYNAMIC
+000130 RECORD KEY STOCK-CODE.
+000140 DATA DIVISION.
+000150 FILE SECTION.
+000160 FD STOCK-FILE; RECORD 32.
+000170 01 STOCK-ITEM.
+000180 02 STOCK-CODE PIC X(4).
+000190 02 PRODUCT-DESC PIC X(24).
+000200 02 UNIT-SIZE PIC 9(4).
+000210 WORKING-STORAGE SECTION.
+000220 01 SCREEN-HEADINGS.
+000230 02 ASK-CODE PIC X(21) VALUE "STOCK CODE < >".
+000240 02 FILLER PIC X(59).
+000250 02 ASK-DESC PIC X(16) VALUE "DESCRIPTION <".
+000260 02 SI-DESC PIC X(25) VALUE " >".
+000270 02 FILLER PIC X(39).
+000280 02 ASK-SIZE PIC X(21) VALUE "UNIT SIZE < >".
+000290 01 ENTER-IT REDEFINES SCREEN-HEADINGS.
+000300 02 FILLER PIC X(16).
+000310 02 CRT-STOCK-CODE PIC X(4).
+000320 02 FILLER PIC X(76).
+000330 02 CRT-PROD-DESC PIC X(24).
+000340 02 FILLER PIC X(56).
+000350 02 CRT-UNIT-SIZE PIC 9(4).
+000360 02 FILLER PIC X.
+000370 PROCEDURE DIVISION.
+000380 SR1.
+000390 DISPLAY SPACE.
+000400 OPEN I-O STOCK-FILE.
+000410 DISPLAY SCREEN-HEADINGS.
+000420 NORMAL-INPUT.
+000430 MOVE SPACE TO ENTER-IT.
+000440 DISPLAY ENTER-IT.
+000450 CORRECT-ERROR.
+000460 ACCEPT ENTER-IT.
+000470 IF CRT-STOCK-CODE = SPACE GO TO END-IT.
+000480 IF CRT-UNIT-SIZE NOT NUMERIC GO TO CORRECT-ERROR.
+000490 MOVE CRT-PROD-DESC TO PRODUCT-DESC.
+000500 MOVE CRT-UNIT-SIZE TO UNIT-SIZE.
+000510 MOVE CRT-STOCK-CODE TO STOCK-CODE.
+000520 WRITE STOCK-ITEM; INVALID GO TO CORRECT-ERROR.
+000530 GO TO NORMAL-INPUT.
+000540 END-IT.
+000550 CLOSE STOCK-FILE.
+000560 DISPLAY SPACE.
+000570 DISPLAY "END OF PROGRAM".
+000580 STOP RUN.
diff --git a/emu/yaze/COBOL/STOCK2.CBL b/emu/yaze/COBOL/STOCK2.CBL
new file mode 100644
index 0000000..46c1097
--- /dev/null
+++ b/emu/yaze/COBOL/STOCK2.CBL
@@ -0,0 +1,119 @@
+ IDENTIFICATION DIVISION.
+ PROGRAM-ID. GOODS-IN.
+ AUTHOR. MICRO FOCUS LTD.
+ ENVIRONMENT DIVISION.
+ CONFIGURATION SECTION.
+ SOURCE-COMPUTER. MDS-800.
+ OBJECT-COMPUTER. MDS-800.
+ SPECIAL-NAMES. CONSOLE IS CRT.
+ INPUT-OUTPUT SECTION.
+ FILE-CONTROL.
+ SELECT STOCK-FILE ASSIGN "STOCK.IT"
+ ORGANIZATION INDEXED
+ ACCESS DYNAMIC
+ RECORD KEY STOCK-CODE.
+ SELECT TRANS-FILE
+ ASSIGN "STOCK.TRS"
+ ORGANIZATION SEQUENTIAL.
+ /
+ DATA DIVISION.
+ FILE SECTION.
+ FD STOCK-FILE; RECORD 32.
+ 01 STOCK-ITEM.
+ 02 STOCK-CODE PIC X(4).
+ 02 STOCK-DESCRIPT PIC X(24).
+ 02 UNIT-SIZE PIC 9(4).
+ FD TRANS-FILE; RECORD 30.
+ 01 TRANS-RECORD.
+ 02 TRAN-NO PIC 9(4).
+ 02 TF-STOCK-CODE PIC X(4).
+ 02 TF-QUANTITY PIC 9(8).
+ 02 TF-ORDER-NO PIC X(6).
+ 02 TF-DATE PIC X(8).
+ WORKING-STORAGE SECTION.
+ 01 STOCK-INWARD-FORM.
+ 02 PRG-TITLE PIC X(20) VALUE " GOODS INWARD".
+ 02 FILLER PIC X(140).
+ 02 CODE-HDNG PIC X(23) VALUE "STOCK CODE < >".
+ 02 FILLER PIC X(57).
+ 02 ORDER-NO-HDNG PIC X(23) VALUE "ORDER NO < >".
+ 02 FILLER PIC X(57).
+ 02 DATE-HDNG PIC X(24) VALUE "DELIVERY DATE MM/DD/YY".
+ 02 FILLER PIC X(56).
+ 02 UNITS-HDNG PIC X(23) VALUE "NO OF UNITS < >".
+ 01 STOCK-RECEIPT REDEFINES STOCK-INWARD-FORM.
+ 02 FILLER PIC X(178).
+ 02 SR-STOCK-CODE PIC X(4).
+ 02 FILLER PIC X(74).
+ 02 SR-ORDER-NO PIC X(6).
+ 02 FILLER PIC X(73).
+ 02 SR-DATE.
+ 04 SR-MM PIC 99.
+ 04 FILLER PIC X.
+ 04 SR-DD PIC 99.
+ 04 FILLER PIC X.
+ 04 SR-YY PIC 99.
+ 02 FILLER PIC X(75).
+ 02 SR-NO-OF-UNITS PIC 9(4).
+ 01 CONFIRM-MSG REDEFINES STOCK-INWARD-FORM.
+ 02 FILLER PIC X(184).
+ 02 CM-STOCK-DESCRIPT PIC X(24).
+ 02 FILLER PIC X(352).
+ 02 UNIT-SIZE-HDNG PIC X(18).
+ 02 CM-UNIT-SIZE PIC 9(4).
+ 02 FILLER PIC X(58).
+ 02 QUANTITY-HDNG PIC X(14).
+ 02 CM-QUANTITY PIC 9(8).
+ 02 FILLER PIC X(58).
+ 02 OK-HDNG PIC X(3).
+ 02 CM-Y-OR-N PIC X.
+ /
+ PROCEDURE DIVISION.
+ START-PROC.
+ OPEN I-O STOCK-FILE.
+ OPEN OUTPUT TRANS-FILE.
+ DISPLAY SPACE.
+ MOVE 0 TO TRAN-NO.
+ DISPLAY STOCK-INWARD-FORM.
+ GET-INPUT.
+ ACCEPT STOCK-RECEIPT.
+ IF SR-STOCK-CODE = SPACE GO TO END-IT.
+ IF SR-NO-OF-UNITS NOT NUMERIC GO TO INVALID-ENTRY.
+ MOVE SR-STOCK-CODE TO STOCK-CODE.
+ READ STOCK-FILE; INVALID GO TO INVALID-CODE.
+ *VALID ENTRY, CALCULATE AND DISPLAY TOTAL QUANTITY IN TO CONFIRM
+ MOVE STOCK-DESCRIPT TO CM-STOCK-DESCRIPT.
+ MOVE "UNIT SIZE" TO UNIT-SIZE-HDNG.
+ MOVE UNIT-SIZE TO CM-UNIT-SIZE.
+ MOVE "QUANTITY IN" TO QUANTITY-HDNG.
+ MOVE UNIT-SIZE TO TF-QUANTITY.
+ MULTIPLY SR-NO-OF-UNITS BY TF-QUANTITY.
+ MOVE TF-QUANTITY TO CM-QUANTITY.
+ MOVE "OK?" TO OK-HDNG.
+ DISPLAY CONFIRM-MSG.
+ ACCEPT CM-Y-OR-N AT 1004.
+ IF CM-Y-OR-N = "Y" PERFORM WRITE-TRANS.
+ *CLEAR INPUT DATA ON SCREEN
+ MOVE SPACE TO CONFIRM-MSG.
+ MOVE "MM/DD/YY" TO SR-DATE.
+ DISPLAY STOCK-RECEIPT.
+ DISPLAY CONFIRM-MSG.
+ GO TO GET-INPUT.
+ WRITE-TRANS.
+ ADD 1 TO TRAN-NO.
+ MOVE STOCK-CODE TO TF-STOCK-CODE.
+ MOVE SR-ORDER-NO TO TF-ORDER-NO.
+ MOVE GET-INPUT TO TF-DATE.
+ WRITE TRANS-RECORD.
+ INVALID-ENTRY.
+ DISPLAY "NON-NUMERIC NO OF UNITS" AT 0325.
+ GO TO GET-INPUT.
+ INVALID-CODE.
+ DISPLAY "INVALID CODE " AT 0325.
+ GO TO GET-INPUT.
+ END-IT.
+ CLOSE STOCK-FILE.
+ CLOSE TRANS-FILE.
+ DISPLAY SPACE.
+ DISPLAY "END OF PROGRAM".
+ STOP RUN.
diff --git a/emu/yaze/COBOL/TESTCALL.CBL b/emu/yaze/COBOL/TESTCALL.CBL
new file mode 100644
index 0000000..ddc74b8
--- /dev/null
+++ b/emu/yaze/COBOL/TESTCALL.CBL
@@ -0,0 +1,19 @@
+000000******************************************************************
+000000*
+000000* Program "Testcall" to demonstrate L/II COBOL calling mechanism
+000000*
+000000******************************************************************
+000000 Working-storage section.
+000000 01 progname pic x(4).
+000000 01 message-size pic 9(2) comp value 60.
+000000 01 message-text pic x(60) value
+000000 "This message is sent via a called program to the screen.".
+000000 Procedure division.
+000000 move "call" to progname.
+000000 call progname using message-size,message-text
+000000 overflow display "call overflowed".
+000000******************************************************************
+000000*
+000000* End of demonstration program "Testcall"
+000000*
+000000******************************************************************
diff --git a/emu/yaze/COBOL/TESTCALL.INT b/emu/yaze/COBOL/TESTCALL.INT
new file mode 100644
index 0000000..83e25e3
Binary files /dev/null and b/emu/yaze/COBOL/TESTCALL.INT differ
diff --git a/emu/yaze/disk b/emu/yaze/disk
new file mode 100644
index 0000000..eb25f82
Binary files /dev/null and b/emu/yaze/disk differ
diff --git a/emu/yaze/transfer/DDT.COM b/emu/yaze/transfer/DDT.COM
new file mode 100644
index 0000000..70e4ebf
Binary files /dev/null and b/emu/yaze/transfer/DDT.COM differ
diff --git a/emu/yaze/transfer/DUMP.COM b/emu/yaze/transfer/DUMP.COM
new file mode 100644
index 0000000..03a77c3
Binary files /dev/null and b/emu/yaze/transfer/DUMP.COM differ
diff --git a/emu/yaze/transfer/PIP.COM b/emu/yaze/transfer/PIP.COM
new file mode 100644
index 0000000..4b2ce4b
Binary files /dev/null and b/emu/yaze/transfer/PIP.COM differ
diff --git a/emu/yaze/transfer/STAT.COM b/emu/yaze/transfer/STAT.COM
new file mode 100644
index 0000000..1de359f
Binary files /dev/null and b/emu/yaze/transfer/STAT.COM differ
diff --git a/emu/yaze/transfer/SUBMIT.COM b/emu/yaze/transfer/SUBMIT.COM
new file mode 100644
index 0000000..2e78882
Binary files /dev/null and b/emu/yaze/transfer/SUBMIT.COM differ
diff --git a/emu/yaze/transfer/SYS.COM b/emu/yaze/transfer/SYS.COM
new file mode 100644
index 0000000..b56e650
Binary files /dev/null and b/emu/yaze/transfer/SYS.COM differ
diff --git a/emu/yaze/yaze.sh b/emu/yaze/yaze.sh
new file mode 100755
index 0000000..665be95
--- /dev/null
+++ b/emu/yaze/yaze.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+yaze -v
\ No newline at end of file
diff --git a/emu/yaze/yaze_test.sh b/emu/yaze/yaze_test.sh
new file mode 100755
index 0000000..0bf8838
--- /dev/null
+++ b/emu/yaze/yaze_test.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+cd /usr/local/src/yaze-1.14/
+yaze -v
\ No newline at end of file
diff --git a/emu/z80pack-1.9/cpmsim/cpm2 b/emu/z80pack-1.9/cpmsim/cpm2
new file mode 100755
index 0000000..a394240
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/cpm2
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+rm -f disks/drive[ab].cpm
+ln disks/library/cpm2-1.dsk disks/drivea.cpm
+ln disks/library/cpm2-2.dsk disks/driveb.cpm
+cpmsim
diff --git a/emu/z80pack-1.9/cpmsim/cpm3 b/emu/z80pack-1.9/cpmsim/cpm3
new file mode 100755
index 0000000..7ffc0c3
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/cpm3
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+rm -f disks/drive[ab].cpm
+ln disks/library/cpm3-1.dsk disks/drivea.cpm
+ln disks/library/cpm3-2.dsk disks/driveb.cpm
+cpmsim
diff --git a/emu/z80pack-1.9/cpmsim/disks/drivea.cpm b/emu/z80pack-1.9/cpmsim/disks/drivea.cpm
new file mode 100644
index 0000000..290f30b
Binary files /dev/null and b/emu/z80pack-1.9/cpmsim/disks/drivea.cpm differ
diff --git a/emu/z80pack-1.9/cpmsim/disks/driveb.cpm b/emu/z80pack-1.9/cpmsim/disks/driveb.cpm
new file mode 100644
index 0000000..f7ad273
Binary files /dev/null and b/emu/z80pack-1.9/cpmsim/disks/driveb.cpm differ
diff --git a/emu/z80pack-1.9/cpmsim/disks/drivei.cpm b/emu/z80pack-1.9/cpmsim/disks/drivei.cpm
new file mode 100644
index 0000000..b8c067d
Binary files /dev/null and b/emu/z80pack-1.9/cpmsim/disks/drivei.cpm differ
diff --git a/emu/z80pack-1.9/cpmsim/disks/library/cpm2-1.dsk b/emu/z80pack-1.9/cpmsim/disks/library/cpm2-1.dsk
new file mode 100644
index 0000000..290f30b
Binary files /dev/null and b/emu/z80pack-1.9/cpmsim/disks/library/cpm2-1.dsk differ
diff --git a/emu/z80pack-1.9/cpmsim/disks/library/cpm2-2.dsk b/emu/z80pack-1.9/cpmsim/disks/library/cpm2-2.dsk
new file mode 100644
index 0000000..f7ad273
Binary files /dev/null and b/emu/z80pack-1.9/cpmsim/disks/library/cpm2-2.dsk differ
diff --git a/emu/z80pack-1.9/cpmsim/disks/library/cpm3-1.dsk b/emu/z80pack-1.9/cpmsim/disks/library/cpm3-1.dsk
new file mode 100644
index 0000000..aac653d
Binary files /dev/null and b/emu/z80pack-1.9/cpmsim/disks/library/cpm3-1.dsk differ
diff --git a/emu/z80pack-1.9/cpmsim/disks/library/cpm3-2.dsk b/emu/z80pack-1.9/cpmsim/disks/library/cpm3-2.dsk
new file mode 100644
index 0000000..8a23d92
Binary files /dev/null and b/emu/z80pack-1.9/cpmsim/disks/library/cpm3-2.dsk differ
diff --git a/emu/z80pack-1.9/cpmsim/disks/library/hd-tools.dsk b/emu/z80pack-1.9/cpmsim/disks/library/hd-tools.dsk
new file mode 100644
index 0000000..b8c067d
Binary files /dev/null and b/emu/z80pack-1.9/cpmsim/disks/library/hd-tools.dsk differ
diff --git a/emu/z80pack-1.9/cpmsim/disks/library/mpm-1.dsk b/emu/z80pack-1.9/cpmsim/disks/library/mpm-1.dsk
new file mode 100644
index 0000000..6a6a8e6
Binary files /dev/null and b/emu/z80pack-1.9/cpmsim/disks/library/mpm-1.dsk differ
diff --git a/emu/z80pack-1.9/cpmsim/disks/library/mpm-2.dsk b/emu/z80pack-1.9/cpmsim/disks/library/mpm-2.dsk
new file mode 100644
index 0000000..af98507
Binary files /dev/null and b/emu/z80pack-1.9/cpmsim/disks/library/mpm-2.dsk differ
diff --git a/emu/z80pack-1.9/cpmsim/mpm b/emu/z80pack-1.9/cpmsim/mpm
new file mode 100755
index 0000000..9735291
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/mpm
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+rm -f disks/drive[ab].cpm
+ln disks/library/mpm-1.dsk disks/drivea.cpm
+ln disks/library/mpm-2.dsk disks/driveb.cpm
+cpmsim -h
diff --git a/emu/z80pack-1.9/cpmsim/srccpm2/Makefile b/emu/z80pack-1.9/cpmsim/srccpm2/Makefile
new file mode 100644
index 0000000..057f4f1
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srccpm2/Makefile
@@ -0,0 +1,32 @@
+CFLAGS= -O -s
+
+all: format putsys bin2hex send receive bios.bin boot.bin
+ @echo "done"
+
+format: format.c
+ cc $(CFLAGS) -o format format.c
+ cp format ..
+
+putsys: putsys.c
+ cc $(CFLAGS) -o putsys putsys.c
+
+bin2hex: bin2hex.c
+ cc $(CFLAGS) -o bin2hex bin2hex.c
+ cp bin2hex ..
+
+send: send.c
+ cc $(CFLAGS) -o send send.c
+ cp send ..
+
+receive: receive.c
+ cc $(CFLAGS) -o receive receive.c
+ cp receive ..
+
+bios.bin: bios.asm
+ z80asm -vl -sn -x bios.asm
+
+boot.bin: boot.asm
+ z80asm -vl -sn boot.asm
+
+clean:
+ rm -f *.lis bios.bin boot.bin format putsys bin2hex receive send
diff --git a/emu/z80pack-1.9/cpmsim/srccpm2/bin2hex.c b/emu/z80pack-1.9/cpmsim/srccpm2/bin2hex.c
new file mode 100644
index 0000000..e0ba19c
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srccpm2/bin2hex.c
@@ -0,0 +1,161 @@
+#include
+#include
+#include
+#include
+#include
+#include
+
+void help(char *name)
+{
+ printf("%s - BINARY to Intel HEX file convertor version 1.00\n"\
+ "(c)BCL Vysoke Myto 2001 (benedikt@lphard.cz)\n\n",name);
+ printf("Usage: %s [-option] binfile hexfile\n"\
+ " -l Bytes to read from binary file\n"\
+ " -i Binary file starting offset\n"\
+ " -o Output file offset (where HEX data starts)\n"\
+ " -t Exclude EOF record\n"\
+ " -a Append to end of existing HEX file\n"\
+ " -q Quiet mode (no statistics are printed)\n", name);
+}
+
+int main(int argc,char *argv[])/*Main routine*/
+{
+ char *ifile = NULL;
+ char *ofile = NULL;
+ char c;
+ FILE *inp, *outp;
+ int ch,csum;
+ int ofsa = 0;
+ int cnt = 0;
+ struct stat statbuf;
+ long int foffset = 0;
+ long int fsize = 0;
+ long int fsub;
+ long int fpoint = 0;
+ long int adrs = 0;
+ unsigned char quiet = 0;
+ unsigned char eofrec = 0;
+ unsigned char append = 0;
+
+ opterr = 0; //print error message if unknown option
+
+ while ((c = getopt (argc, argv, "l:i:o:taqv")) != -1)
+ switch (c) {
+ case 'l':
+ fsize = atol(optarg);
+ break;
+ case 'i':
+ foffset = atol(optarg);
+ break;
+ case 'o':
+ adrs = atol(optarg);
+ break;
+ case 't':
+ eofrec = 1;
+ break;
+ case 'a':
+ append = 1;
+ break;
+ case 'q':
+ quiet = 1;
+ break;
+ case 'v':
+ printf("%s - BINARY to Intel HEX file convertor version 1.00\n"\
+ "(c)BCL Vysoke Myto 2001 (benedikt@lphard.cz)\n",argv[0]);
+ return 0;
+ case '?':
+ help (argv[0]);
+ return 1;
+ }
+
+ if ((argc - optind) != 2) {
+ printf("ERROR: Missing input/output file.\n");
+ help(argv[0]);
+ return 1;
+ }
+ ifile = argv[optind];
+ ofile = argv[optind+1];
+
+ /*Open file check*/
+ if((inp = fopen(ifile, "rb")) == NULL){
+ printf("ERROR: Cannot open input file.\n");
+ return 1;
+ }
+ fseek (inp, foffset, SEEK_SET);
+
+ if (append == 0) {
+ if((outp = fopen(ofile, "wt")) == NULL){
+ printf("ERROR: Cannot open output file.\n");
+ return 1;
+ }
+ } else {
+ if((outp = fopen(ofile, "at")) == NULL){
+ printf("ERROR: Cannot re-open output file.\n");
+ return 1;
+ }
+ fseek (outp, 0, SEEK_END);
+ }
+
+ fstat(fileno(inp), &statbuf);
+ if (quiet == 0) printf("Input file size=%ld\n",statbuf.st_size);
+ if (foffset > statbuf.st_size) {
+ printf("ERROR: Input offset > input file length\n");
+ }
+ if ((fsize == 0) || (fsize > (statbuf.st_size - foffset)))
+ fsize = statbuf.st_size - foffset;
+
+// fprintf(outp,":020000020000FC\n");/*Start Header*/
+ fsub = fsize - fpoint;
+ if (fsub > 0x20) {
+ fprintf(outp,":20%04X00",adrs);/*Hex line Header*/
+ csum = 0x20 + (adrs>>8) + (adrs & 0xFF);
+ adrs += 0x20;
+ }
+ else {
+ fprintf(outp, ":%02X%04X00", fsub,adrs);/*Hex line Header*/
+ csum = fsub + (adrs>>8) + (adrs & 0xFF);
+ adrs += fsub;
+ }
+ while (fsub > 0){
+ ch = fgetc(inp);
+ fprintf(outp,"%02X",ch);/*Put data*/
+ cnt++; fpoint++;
+ fsub = fsize - fpoint;
+ csum = ch + csum;
+ if((fsub == 0)||(cnt == 0x20)){
+ cnt = 0; csum = 0xFF & (~csum + 1);
+ fprintf(outp,"%02X\n",csum);/*Put checksum*/
+ if(fsub == 0) break;
+ if(adrs > 0xFFFF){
+ ofsa = 0x1000 + ofsa;
+ adrs = 0;
+ fprintf(outp,":02000002%04X",ofsa);/*Change offset address*/
+ csum = 0x02 + 0x02 + (ofsa>>8) + (ofsa & 0xFF);
+ csum = 0xFF & (~csum + 1);
+ fprintf(outp,"%02X\n", csum);
+ }
+ adrs = 0xFFFF & adrs;
+ if (fsub > 0x20) {
+ fprintf(outp,":20%04X00",adrs);/*Next Hex line Header*/
+ csum = 0x20 + (adrs>>8) + (adrs & 0xFF);
+ adrs += 0x20;
+ }
+ else {
+ if(fsub > 0){
+ fprintf(outp, ":%02X%04X00", fsub,adrs);/*Next Hex line Header*/
+ csum = fsub + (adrs>>8) + (adrs & 0xFF);
+ adrs += fsub;
+ }
+ }
+ }
+ }
+ if (eofrec == 0) fprintf(outp,":00000001FF\n");/*End footer*/
+ fflush (outp);
+
+ fstat(fileno(outp), &statbuf);
+ if (quiet == 0) printf("Output file size=%ld\n",statbuf.st_size);
+
+ fclose(inp);
+ fclose(outp);
+ return 0;
+}
diff --git a/emu/z80pack-1.9/cpmsim/srccpm2/bios.asm b/emu/z80pack-1.9/cpmsim/srccpm2/bios.asm
new file mode 100644
index 0000000..2ef7bfa
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srccpm2/bios.asm
@@ -0,0 +1,375 @@
+; CBIOS for Z80-Simulator
+;
+; Copyright (C) 1988-2006 by Udo Munk
+;
+MSIZE EQU 64 ;cp/m version memory size in kilobytes
+;
+; "bias" is address offset from 3400H for memory systems
+; than 16K (referred to as "b" throughout the text).
+;
+BIAS EQU (MSIZE-20)*1024
+CCP EQU 3400H+BIAS ;base of ccp
+BDOS EQU CCP+806H ;base of bdos
+BIOS EQU CCP+1600H ;base of bios
+CDISK EQU 0004H ;current disk number 0=A,...,15=P
+IOBYTE EQU 0003H ;intel i/o byte
+;
+; I/O ports
+;
+CONSTA EQU 0 ;console status port
+CONDAT EQU 1 ;console data port
+PRTSTA EQU 2 ;printer status port
+PRTDAT EQU 3 ;printer data port
+AUXDAT EQU 5 ;auxiliary data port
+FDCD EQU 10 ;fdc-port: # of drive
+FDCT EQU 11 ;fdc-port: # of track
+FDCS EQU 12 ;fdc-port: # of sector
+FDCOP EQU 13 ;fdc-port: command
+FDCST EQU 14 ;fdc-port: status
+DMAL EQU 15 ;dma-port: dma address low
+DMAH EQU 16 ;dma-port: dma address high
+;
+ ORG BIOS ;origin of this program
+NSECTS EQU (BIOS-CCP)/128 ;warm start sector count
+;
+; jump vector for individual subroutines
+;
+ JP BOOT ;cold start
+WBOOTE: JP WBOOT ;warm start
+ JP CONST ;console status
+ JP CONIN ;console character in
+ JP CONOUT ;console character out
+ JP LIST ;list character out
+ JP PUNCH ;punch character out
+ JP READER ;reader character out
+ JP HOME ;move head to home position
+ JP SELDSK ;select disk
+ JP SETTRK ;set track number
+ JP SETSEC ;set sector number
+ JP SETDMA ;set dma address
+ JP READ ;read disk
+ JP WRITE ;write disk
+ JP LISTST ;return list status
+ JP SECTRAN ;sector translate
+;
+; fixed data tables for four-drive standard
+; IBM-compatible 8" disks
+;
+; disk parameter header for disk 00
+DPBASE: DEFW TRANS,0000H
+ DEFW 0000H,0000H
+ DEFW DIRBF,DPBLK
+ DEFW CHK00,ALL00
+; disk parameter header for disk 01
+ DEFW TRANS,0000H
+ DEFW 0000H,0000H
+ DEFW DIRBF,DPBLK
+ DEFW CHK01,ALL01
+; disk parameter header for disk 02
+ DEFW TRANS,0000H
+ DEFW 0000H,0000H
+ DEFW DIRBF,DPBLK
+ DEFW CHK02,ALL02
+; disk parameter header for disk 03
+ DEFW TRANS,0000H
+ DEFW 0000H,0000H
+ DEFW DIRBF,DPBLK
+ DEFW CHK03,ALL03
+;
+; sector translate vector for the IBM 8" disks
+;
+TRANS: DEFB 1,7,13,19 ;sectors 1,2,3,4
+ DEFB 25,5,11,17 ;sectors 5,6,7,8
+ DEFB 23,3,9,15 ;sectors 9,10,11,12
+ DEFB 21,2,8,14 ;sectors 13,14,15,16
+ DEFB 20,26,6,12 ;sectors 17,18,19,20
+ DEFB 18,24,4,10 ;sectors 21,22,23,24
+ DEFB 16,22 ;sectors 25,26
+;
+; disk parameter block, common to all IBM 8" disks
+;
+DPBLK: DEFW 26 ;sectors per track
+ DEFB 3 ;block shift factor
+ DEFB 7 ;block mask
+ DEFB 0 ;extent mask
+ DEFW 242 ;disk size-1
+ DEFW 63 ;directory max
+ DEFB 192 ;alloc 0
+ DEFB 0 ;alloc 1
+ DEFW 16 ;check size
+ DEFW 2 ;track offset
+;
+; fixed data tables for 4MB harddisk
+;
+; disk parameter header
+HDBASE: DEFW HDTRA,0000H
+ DEFW 0000H,0000H
+ DEFW DIRBF,HDBLK
+ DEFW CHKHD,ALLHD
+;
+; sector translate vector for the hardisk
+;
+HDTRA: DEFB 1,2,3,4,5,6,7,8,9,10
+ DEFB 11,12,13,14,15,16,17,18,19,20
+ DEFB 21,22,23,24,25,26,27,28,29,30
+ DEFB 31,32,33,34,35,36,37,38,39,40
+ DEFB 41,42,43,44,45,46,47,48,49,50
+ DEFB 51,52,53,54,55,56,57,58,59,60
+ DEFB 61,62,63,64,65,66,67,68,69,70
+ DEFB 71,72,73,74,75,76,77,78,79,80
+ DEFB 81,82,83,84,85,86,87,88,89,90
+ DEFB 91,92,93,94,95,96,97,98,99,100
+ DEFB 101,102,103,104,105,106,107,108,109,110
+ DEFB 111,112,113,114,115,116,117,118,119,120
+ DEFB 121,122,123,124,125,126,127,128
+;
+; disk parameter block for harddisk
+;
+HDBLK: DEFW 128 ;sectors per track
+ DEFB 4 ;block shift factor
+ DEFB 15 ;block mask
+ DEFB 0 ;extent mask
+ DEFW 2039 ;disk size-1
+ DEFW 1023 ;directory max
+ DEFB 255 ;alloc 0
+ DEFB 255 ;alloc 1
+ DEFW 0 ;check size
+ DEFW 0 ;track offset
+;
+; signon message
+;
+SIGNON: DEFM '64K CP/M Vers. 2.2 (CBIOS V1.1 for Z80SIM, '
+ DEFM 'Copyright 1988-2006 by Udo Munk)'
+ DEFB 13,10,0
+;
+; end of fixed tables
+;
+; individual subroutines to perform each function
+; simplest case is to just perform parameter initialization
+;
+BOOT: LD SP,80H ;use space below buffer for stack
+ LD HL,SIGNON ;print message
+BOOTL: LD A,(HL)
+ OR A
+ JP Z,BOOTC
+ LD C,A
+ CALL CONOUT
+ INC HL
+ JP BOOTL
+BOOTC: XOR A ;zero in the accum
+ LD (IOBYTE),A ;clear the iobyte
+ LD (CDISK),A ;select disk zero
+ JP GOCPM ;initialize and go to cp/m
+;
+; simplest case is to read the disk until all sectors loaded
+;
+WBOOT: LD SP,80H ;use space below buffer for stack
+ LD C,0 ;select disk 0
+ CALL SELDSK
+ CALL HOME ;go to track 00
+;
+ LD B,NSECTS ;b counts # of sectors to load
+ LD C,0 ;c has the current track number
+ LD D,2 ;d has the next sector to read
+; note that we begin by reading track 0, sector 2 since sector 1
+; contains the cold start loader, which is skipped in a warm start
+ LD HL,CCP ;base of cp/m (initial load point)
+LOAD1: ;load one more sector
+ PUSH BC ;save sector count, current track
+ PUSH DE ;save next sector to read
+ PUSH HL ;save dma address
+ LD C,D ;get sector address to register c
+ CALL SETSEC ;set sector address from register c
+ POP BC ;recall dma address to b,c
+ PUSH BC ;replace on stack for later recall
+ CALL SETDMA ;set dma address from b,c
+; drive set to 0, track set, sector set, dma address set
+ CALL READ
+ CP 00H ;any errors?
+ JP NZ,WBOOT ;retry the entire boot if an error occurs
+; no error, move to next sector
+ POP HL ;recall dma address
+ LD DE,128 ;dma=dma+128
+ ADD HL,DE ;new dma address is in h,l
+ POP DE ;recall sector address
+ POP BC ;recall number of sectors remaining, and current trk
+ DEC B ;sectors=sectors-1
+ JP Z,GOCPM ;transfer to cp/m if all have been loaded
+; more sectors remain to load, check for track change
+ INC D
+ LD A,D ;sector=27?, if so, change tracks
+ CP 27
+ JP C,LOAD1 ;carry generated if sector<27
+; end of current track, go to next track
+ LD D,1 ;begin with first sector of next track
+ INC C ;track=track+1
+; save register state, and change tracks
+ CALL SETTRK ;track address set from register c
+ JP LOAD1 ;for another sector
+; end of load operation, set parameters and go to cp/m
+GOCPM:
+ LD A,0C3H ;c3 is a jmp instruction
+ LD (0),A ;for jmp to wboot
+ LD HL,WBOOTE ;wboot entry point
+ LD (1),HL ;set address field for jmp at 0
+;
+ LD (5),A ;for jmp to bdos
+ LD HL,BDOS ;bdos entry point
+ LD (6),HL ;address field of jump at 5 to bdos
+;
+ LD BC,80H ;default dma address is 80h
+ CALL SETDMA
+;
+ EI ;enable the interrupt system
+ LD A,(CDISK) ;get current disk number
+ LD C,A ;send to the ccp
+ JP CCP ;go to cp/m for further processing
+;
+;
+; simple i/o handlers
+;
+; console status, return 0ffh if character ready, 00h if not
+;
+CONST: IN A,(CONSTA) ;get console status
+ RET
+;
+; console character into register a
+;
+CONIN: IN A,(CONDAT) ;get character from console
+ RET
+;
+; console character output from register c
+;
+CONOUT: LD A,C ;get to accumulator
+ OUT (CONDAT),A ;send character to console
+ RET
+;
+; list character from register c
+;
+LIST: LD A,C ;character to register a
+ OUT (PRTDAT),A
+ RET
+;
+; return list status (0 if not ready, 0xff if ready)
+;
+LISTST: IN A,(PRTSTA)
+ RET
+;
+; punch character from register c
+;
+PUNCH: LD A,C ;character to register a
+ OUT (AUXDAT),A
+ RET
+;
+; read character into register a from reader device
+;
+READER: IN A,(AUXDAT)
+ RET
+;
+;
+; i/o drivers for the disk follow
+;
+; move to the track 00 position of current drive
+; translate this call into a settrk call with parameter 00
+;
+HOME: LD C,0 ;select track 0
+ JP SETTRK ;we will move to 00 on first read/write
+;
+; select disk given by register C
+;
+SELDSK: LD HL,0000H ;error return code
+ LD A,C
+ CP 4 ;must be between 0 and 3
+ JR NC,SELHD ;no carry if 4,5,...
+; disk number is in the proper range
+; compute proper disk parameter header address
+ OUT (FDCD),A ;selekt disk drive
+ LD L,A ;L=disk number 0,1,2,3
+ ADD HL,HL ;*2
+ ADD HL,HL ;*4
+ ADD HL,HL ;*8
+ ADD HL,HL ;*16 (size of each header)
+ LD DE,DPBASE
+ ADD HL,DE ;HL=.dpbase(diskno*16)
+ RET
+SELHD: CP 8 ;select the harddisk?
+ RET NZ ;no, error
+ OUT (FDCD),A ;select disk drive
+ LD HL,HDBASE ;HL=hdbase for harddisk
+ RET
+;
+; set track given by register c
+;
+SETTRK: LD A,C
+ OUT (FDCT),A
+ RET
+;
+; set sector given by register c
+;
+SETSEC: LD A,C
+ OUT (FDCS),A
+ RET
+;
+; translate the sector given by BC using the
+; translate table given by DE
+;
+SECTRAN:
+ EX DE,HL ;HL=.trans
+ ADD HL,BC ;HL=.trans(sector)
+ LD L,(HL) ;L = trans(sector)
+ LD H,0 ;HL= trans(sector)
+ RET ;with value in HL
+;
+; set dma address given by registers b and c
+;
+SETDMA: LD A,C ;low order address
+ OUT (DMAL),A
+ LD A,B ;high order address
+ OUT (DMAH),A ;in dma
+ RET
+;
+; perform read operation
+;
+READ: XOR A ;read command -> A
+ JP WAITIO ;to perform the actual i/o
+;
+; perform a write operation
+;
+WRITE: LD A,1 ;write command -> A
+;
+; enter here from read and write to perform the actual i/o
+; operation. return a 00h in register a if the operation completes
+; properly, and 01h if an error occurs during the read or write
+;
+; in this case, we have saved the disk number in 'diskno' (0-3)
+; the track number in 'track' (0-76)
+; the sector number in 'sector' (1-26)
+; the dma address in 'dmaad' (0-65535)
+;
+WAITIO: OUT (FDCOP),A ;start i/o operation
+ IN A,(FDCST) ;status of i/o operation -> A
+ RET
+;
+; the remainder of the CBIOS is reserved uninitialized
+; data area, and does not need to be a part of the
+; system memory image (the space must be available,
+; however, between "begdat" and "enddat").
+;
+; scratch ram area for BDOS use
+;
+BEGDAT EQU $ ;beginning of data area
+DIRBF: DEFS 128 ;scratch directory area
+ALL00: DEFS 31 ;allocation vector 0
+ALL01: DEFS 31 ;allocation vector 1
+ALL02: DEFS 31 ;allocation vector 2
+ALL03: DEFS 31 ;allocation vector 3
+ALLHD: DEFS 255 ;allocation vector harddisk
+CHK00: DEFS 16 ;check vector 0
+CHK01: DEFS 16 ;check vector 1
+CHK02: DEFS 16 ;check vector 2
+CHK03: DEFS 16 ;check vector 3
+CHKHD: DEFS 0 ;check vector harddisk
+;
+ENDDAT EQU $ ;end of data area
+DATSIZ EQU $-BEGDAT ;size of data area
+ END ;of BIOS
diff --git a/emu/z80pack-1.9/cpmsim/srccpm2/boot.asm b/emu/z80pack-1.9/cpmsim/srccpm2/boot.asm
new file mode 100644
index 0000000..50b6a6b
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srccpm2/boot.asm
@@ -0,0 +1,74 @@
+; CP/M 2.2 boot-loader for Z80-Simulator
+;
+; Copyright (C) 1988 by Udo Munk
+;
+ ORG 0 ; mem base of boot
+;
+MSIZE EQU 64 ; mem size in kbytes
+;
+BIAS EQU (MSIZE-20)*1024 ; offset from 20k system
+CCP EQU 3400H+BIAS ; base of the ccp
+BIOS EQU CCP+1600H ; base of the bios
+BIOSL EQU 0300H ; length of the bios
+BOOT EQU BIOS
+SIZE EQU BIOS+BIOSL-CCP ; size of cp/m system
+SECTS EQU SIZE/128 ; # of sectors to load
+;
+; I/O ports
+;
+DRIVE EQU 10 ; fdc-port: # of drive
+TRACK EQU 11 ; fdc-port: # of track
+SECTOR EQU 12 ; fdc-port: # of sector
+FDCOP EQU 13 ; fdc-port: command
+FDCST EQU 14 ; fdc-port: status
+DMAL EQU 15 ; dma-port: dma address low
+DMAH EQU 16 ; dma-port: dma address high
+;
+; begin the load operation
+;
+COLD: LD BC,2 ; b=track 0, c=sector 2
+ LD D,SECTS ; d=# sectors to load
+ LD HL,CCP ; base transfer address
+ LD A,0 ; select drive A
+ OUT (DRIVE),A
+;
+; load the next sector
+;
+LSECT: LD A,B ; set track
+ OUT (TRACK),A
+ LD A,C ; set sector
+ OUT (SECTOR),A
+ LD A,L ; set dma address low
+ OUT (DMAL),A
+ LD A,H ; set dma adress high
+ OUT (DMAH),A
+ XOR A ; read sector
+ OUT (FDCOP),A
+ IN A,(FDCST) ; get status of fdc
+ CP 0 ; read successful ?
+ JP Z,CONT ; yes, continue
+ HALT ; no, halt cpu
+CONT:
+ ; go to next sector if load is incomplete
+ DEC D ; sects=sects-1
+ JP Z,BOOT ; head for the bios
+;
+; more sectors to load
+;
+; we aren't using a stack, so use as scratch register
+; to hold the load address increment
+;
+ LD SP,128 ; 128 bytes per sector
+ ADD HL,SP ; = + 128
+;
+ INC C ; sector = sector + 1
+ LD A,C
+ CP 27 ; last sector of track ?
+ JP C,LSECT ; no, go read another
+;
+; end of track, increment to next track
+;
+ LD C,1 ; sector = 1
+ INC B ; track = track + 1
+ JP LSECT ; for another group
+ END ; of boot loader
diff --git a/emu/z80pack-1.9/cpmsim/srccpm2/cpm.bin b/emu/z80pack-1.9/cpmsim/srccpm2/cpm.bin
new file mode 100644
index 0000000..e18110d
Binary files /dev/null and b/emu/z80pack-1.9/cpmsim/srccpm2/cpm.bin differ
diff --git a/emu/z80pack-1.9/cpmsim/srccpm2/format.c b/emu/z80pack-1.9/cpmsim/srccpm2/format.c
new file mode 100644
index 0000000..d118e89
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srccpm2/format.c
@@ -0,0 +1,69 @@
+/*
+ * CP/M 2.2 Formats a simulated Disk Drive
+ *
+ * Copyright (C) 1988-2006 by Udo Munk
+ *
+ * History:
+ * 29-APR-88 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-MAR-93 comments in english
+ * 01-OCT-06 modified to compile on modern POSIX OS's
+ * 18-NOV-06 added a second harddisk
+ */
+
+#include
+#include
+#include
+#include
+#include
+
+#define TRACK 77
+#define SECTOR 26
+#define HDTRACK 255
+#define HDSECTOR 128
+
+/*
+ * This program is able to format the following disk formats:
+ *
+ * drive A: 8" IBM SS,SD
+ * drive B: 8" IBM SS,SD
+ * drive C: 8" IBM SS,SD
+ * drive D: 8" IBM SS,SD
+ * drive I: 4MB harddisk
+ * drive J: 4MB harddisk
+ */
+int main(int argc, char *argv[])
+{
+ register int i;
+ int fd;
+ char drive;
+ static unsigned char sector[128];
+ static char fn[] = "disks/drive?.cpm";
+ static char usage[] = "usage: format a | b | c | d | i | j";
+
+ if (argc != 2) {
+ puts(usage);
+ exit(1);
+ }
+ i = *argv[1];
+ if (argc != 2 ||
+ (i != 'a' && i != 'b' && i != 'c' && i != 'd' && i != 'i'
+ && i != 'j')) {
+ puts(usage);
+ exit(1);
+ }
+ fn[11] = drive = (char) i;
+ memset((char *) sector, 0xe5, 128);
+ if ((fd = creat(fn, 0644)) == -1) {
+ perror("disk file");
+ exit(1);
+ }
+ if (drive != 'i' && drive != 'j') {
+ for (i = 0; i < TRACK * SECTOR; i++)
+ write(fd, (char *) sector, 128);
+ } else {
+ for (i = 0; i < HDTRACK * HDSECTOR; i++)
+ write(fd, (char *) sector, 128);
+ }
+ close(fd);
+ return(0);
+}
diff --git a/emu/z80pack-1.9/cpmsim/srccpm2/putsys.c b/emu/z80pack-1.9/cpmsim/srccpm2/putsys.c
new file mode 100644
index 0000000..a9df513
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srccpm2/putsys.c
@@ -0,0 +1,106 @@
+/*
+ * Write the CP/M systemfiles to system tracks of drive A
+ *
+ * Copyright (C) 1988-2006 by Udo Munk
+ *
+ * History:
+ * 29-APR-88 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-MAR-93 comments in english and ported to COHERENT 4.0
+ * 02-OCT-06 modified to compile on modern POSIX OS's
+ */
+
+#include
+#include
+#include
+#include
+#include
+
+/*
+ * This program writes the CP/M 2.2 OS from the following files
+ * onto the system tracks of the boot disk (drivea.cpm):
+ *
+ * boot loader boot.bin (Mostek binary format)
+ * CCP cpm.bin (binary format)
+ * BDOS cpm.bin (binary format)
+ * BIOS bios.bin (Mostek binary format)
+ */
+int main(void)
+{
+ unsigned char header[3];
+ unsigned char sector[128];
+ register int i;
+ int fd, drivea, readed;
+
+ /* open drive A for writing */
+ if ((drivea = open("../disks/drivea.cpm", O_WRONLY)) == -1) {
+ perror("file ../disks/drivea.cpm");
+ exit(1);
+ }
+ /* open boot loader (boot.bin) for reading */
+ if ((fd = open("boot.bin", O_RDONLY)) == -1) {
+ perror("file boot.bin");
+ exit(1);
+ }
+ /* read and check 3 byte header */
+ if ((readed = read(fd, (char *) header, 3)) != 3) {
+ perror("file boot.bin");
+ exit(1);
+ }
+ if (header[0] != 0xff || header[1] != 0 || header[2] != 0) {
+ puts("start adress of boot.bin <> 0");
+ exit(0);
+ }
+ /* read boot loader */
+ memset((char *) sector, 0, 128);
+ read(fd, (char *) sector, 128);
+ close(fd);
+ /* and write it to disk in drive A */
+ write(drivea, (char *) sector, 128);
+ /* open CP/M system file (cpm.bin) for reading */
+ if ((fd = open("cpm.bin", O_RDONLY)) == -1) {
+ perror("file cpm.bin");
+ exit(1);
+ }
+ /* position to CCP in cpm.bin, needed if created with SAVE or similar */
+ lseek(fd, (long) 17 * 128, 0);
+ /* read CCP and BDOS from cpm.bin and write them to disk in drive A */
+ for (i = 0; i < 44; i++) {
+ if ((readed = read(fd, (char *) sector, 128)) != 128) {
+ perror("file cpm.bin");
+ exit(1);
+ }
+ write(drivea, (char *) sector, 128);
+ }
+ close(fd);
+ /* open BIOS (bios.bin) for reading */
+ if ((fd = open("bios.bin", O_RDONLY)) == -1) {
+ perror("file bios.bin");
+ exit(1);
+ }
+ /* read and check 3 byte header */
+ if ((readed = read(fd, (char *) header, 3)) != 3) {
+ perror("file bios.bin");
+ exit(1);
+ }
+ if (header[0] != 0xff) {
+ puts("unknown format of bios.bin");
+ exit(0);
+ }
+ /* read BIOS from bios.bin and write it to disk in drive A */
+ i = 0;
+ while ((readed = read(fd, (char *) sector, 128)) == 128) {
+ write(drivea, (char *) sector, 128);
+ i++;
+ if (i == 6) {
+ puts("6 sectors written, can't write any more!");
+ goto stop;
+ }
+ }
+ if (readed > 0) {
+ write(drivea, (char *) sector, 128);
+ }
+stop:
+ close(fd);
+ close(drivea);
+ return(0);
+}
diff --git a/emu/z80pack-1.9/cpmsim/srccpm2/receive.c b/emu/z80pack-1.9/cpmsim/srccpm2/receive.c
new file mode 100644
index 0000000..96dcbba
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srccpm2/receive.c
@@ -0,0 +1,56 @@
+/*
+ * Receive a file out of the named pipe "auxout" from CP/M simulation
+ *
+ * Copyright (C) 1988-2006 by Udo Munk
+ *
+ * History:
+ * 05-OKT-88 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-MAR-93 comments in english and ported to COHERENT 4.0
+ * 01-OCT-06 modified to compile on modern POSIX OS's
+ */
+
+#include
+#include
+#include
+#include
+#include
+
+int fdin, fdout;
+
+int main(int argc, char *argv[])
+{
+ char c;
+ void int_handler(void);
+
+ if (argc != 2) {
+ puts("usage: receive filname &");
+ exit(1);
+ }
+ if ((fdin = open("auxout", O_RDONLY)) == -1) {
+ perror("pipe auxout");
+ exit(1);
+ }
+ if ((fdout = creat(argv[1], 0644)) == -1) {
+ perror(argv[1]);
+ exit(1);
+ }
+
+ signal(SIGINT, SIG_IGN);
+ signal(SIGQUIT, SIG_IGN);
+ signal(SIGHUP, int_handler);
+
+ for (;;) {
+ if (read(fdin, &c, 1) == 1)
+ if (c != '\r')
+ write(fdout, &c, 1);
+ }
+
+ return(0);
+}
+
+void int_handler(void)
+{
+ close(fdin);
+ close(fdout);
+ exit(0);
+}
diff --git a/emu/z80pack-1.9/cpmsim/srccpm2/send.c b/emu/z80pack-1.9/cpmsim/srccpm2/send.c
new file mode 100644
index 0000000..e110f6c
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srccpm2/send.c
@@ -0,0 +1,57 @@
+/*
+ * Sends a file through named pipe "auxin" to the CP/M simulation
+ *
+ * Copyright (C) 1988-2006 by Udo Munk
+ *
+ * History:
+ * 05-OKT-88 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-MAR-93 comments in english and ported to COHERENT 4.0
+ * 01-OCT-06 modified to compile on modern POSIX OS's
+ */
+
+#include
+#include
+#include
+#include
+
+void sendbuf(int);
+
+char buf[BUFSIZ];
+char cr = '\r';
+int fdout, fdin;
+
+int main(int argc,char *argv[])
+{
+ register int readed;
+
+ if (argc != 2) {
+ puts("usage: send filname &");
+ exit(1);
+ }
+ if ((fdin = open(argv[1], O_RDONLY)) == -1) {
+ perror(argv[1]);
+ exit(1);
+ }
+ if ((fdout = open("auxin", O_WRONLY)) == -1) {
+ perror("pipe auxin");
+ exit(1);
+ }
+ while ((readed = read(fdin, buf, BUFSIZ)) == BUFSIZ)
+ sendbuf(BUFSIZ);
+ if (readed)
+ sendbuf(readed);
+ close(fdin);
+ close(fdout);
+ return(0);
+}
+
+void sendbuf(int size)
+{
+ register char *s = buf;
+
+ while (s - buf < size) {
+ if (*s == '\n')
+ write(fdout, (char *) &cr, 1);
+ write(fdout, s++, 1);
+ }
+}
diff --git a/emu/z80pack-1.9/cpmsim/srccpm3/Makefile b/emu/z80pack-1.9/cpmsim/srccpm3/Makefile
new file mode 100644
index 0000000..337d0f2
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srccpm3/Makefile
@@ -0,0 +1,13 @@
+CFLAGS= -O -s
+
+all: putsys boot.bin
+ echo done
+
+putsys: putsys.c
+ cc $(CFLAGS) -o putsys putsys.c
+
+boot.bin: boot.asm
+ z80asm -vl -sn -fb boot.asm
+
+clean:
+ rm -f *.lis putsys boot.bin
diff --git a/emu/z80pack-1.9/cpmsim/srccpm3/bios3.mac b/emu/z80pack-1.9/cpmsim/srccpm3/bios3.mac
new file mode 100644
index 0000000..c9c6d8b
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srccpm3/bios3.mac
@@ -0,0 +1,582 @@
+; CP/M 3 BIOS for Z80-Simulator
+;
+; Copyright (C) 1989-2006 by Udo Munk
+;
+ .Z80
+;
+; bdos functions
+;
+WARM EQU 0
+BDOS EQU 5
+PRINT EQU 9
+OPEN EQU 15
+READS EQU 20
+DMA EQU 26
+MULTI EQU 44
+;
+; i/o ports
+;
+CONSTA EQU 0 ;console status port
+CONDAT EQU 1 ;console data port
+PRTSTA EQU 2 ;printer status port
+PRTDAT EQU 3 ;printer data port
+AUXSTA EQU 4 ;auxilary status port
+AUXDAT EQU 5 ;auxilary data port
+FDCD EQU 10 ;fdc-port: # of drive
+FDCT EQU 11 ;fdc-port: # of track
+FDCS EQU 12 ;fdc-port: # of sector
+FDCOP EQU 13 ;fdc-port: command
+FDCST EQU 14 ;fdc-port: status
+DMAL EQU 15 ;dma-port: dma address low
+DMAH EQU 16 ;dma-port: dma address high
+MMUINI EQU 20 ;initialize mmu
+MMUSEL EQU 21 ;bank select mmu
+CLKCMD EQU 25 ;clock command
+CLKDAT EQU 26 ;clock data
+;
+; clock commands
+;
+GETSEC EQU 0 ;get seconds
+GETMIN EQU 1 ;get minutes
+GETHOU EQU 2 ;get hours
+GETDAL EQU 3 ;get days low
+GETDAH EQU 4 ;get days high
+;
+; character device mode byte fields
+;
+mb$input EQU 00000001B ;device may do input
+mb$output EQU 00000010B ;device may do output
+mb$in$out EQU mb$input+mb$output ;device may do both
+baud$none EQU 0
+;
+; external references in scb
+;
+ EXTRN @civec, @covec, @aovec, @aivec, @lovec, @bnkbf
+ EXTRN @crdma, @crdsk, @fx, @resel, @vinfo, @usrcd
+ EXTRN @ermde, @date, @hour, @min, @sec, @mxtpa
+;
+ CSEG
+;
+; cp/m 3 jump vector for individual subroutines
+;
+ JP BOOT ;perform cold start initialization
+WBOOTE: JP WBOOT ;perform warm start initialization
+ JP CONST ;check for console input char ready
+ JP CONIN ;read console character in
+ JP CONOUT ;write console character out
+ JP LIST ;write list character out
+ JP AUXOUT ;write auxiliary output char
+ JP AUXIN ;read auxiliary input char
+ JP HOME ;move head to track 0 on selcted disk
+ JP SELDSK ;select disk drive
+ JP SETTRK ;set track number
+ JP SETSEC ;set sector number
+ JP SETDMA ;set dma address
+ JP READ ;read specified sector
+ JP WRITE ;write specified sector
+ JP LISTST ;return list status
+ JP SECTRAN ;translate logical to physical sector
+ JP CONOST ;return output status of console
+ JP AUXIST ;return input status of aux. port
+ JP AUXOST ;return output status of aux. port
+ JP DEVTBL ;return address of character i/o table
+ JP DEVINI ;initialize character i/o devices
+ JP DRVTBL ;return address of disk drive table
+ JP MULTIO ;set number of sectors to read/write
+ JP FLUSH ;flush deblocking buffers
+ JP MOVE ;memory to memory move
+ JP TIME ;time set/get signal
+ JP SELMEM ;select bank of memory
+ JP SETBNK ;specify bank for dma operation
+ JP XMOVE ;set bank for memory dma transfer
+ JP 0 ;reserved for system implementor
+ JP 0 ;reserved for future use
+ JP 0 ;reserved for future use
+;
+; drive table
+;
+DRIVES: DW DPH0
+ DW DPH1
+ DW DPH2
+ DW DPH3
+ DW 0
+ DW 0
+ DW 0
+ DW 0
+ DW DPH8
+ DW DPH9
+ DW 0
+ DW 0
+ DW 0
+ DW 0
+ DW 0
+ DW 0
+;
+; fixed data tables for IBM-compatible 8" disks
+;
+; disk parameter header
+;
+DPH0: DEFW TRANS ;sector translation table
+ DB 0,0,0,0,0,0,0,0,0 ;bdos scratch area
+ DB 0 ;media flag
+ DEFW DPB0 ;disk parameter block
+ DEFW 0FFFEH ;checksum vector
+ DEFW 0FFFEH ;allocation vector
+ DEFW 0FFFEH ;directory buffer control block
+ DEFW 0FFFFH ;dtabcb not used
+ DEFW 0FFFEH ;hashing
+ DEFB 0 ;hash bank
+DPH1: DEFW TRANS ;sector translation table
+ DB 0,0,0,0,0,0,0,0,0 ;bdos scratch area
+ DB 0 ;media flag
+ DEFW DPB0 ;disk parameter block
+ DEFW 0FFFEH ;checksum vector
+ DEFW 0FFFEH ;allocation vector
+ DEFW 0FFFEH ;directory buffer control block
+ DEFW 0FFFFH ;dtabcb not used
+ DEFW 0FFFEH ;hashing
+ DEFB 0 ;hash bank
+DPH2: DEFW TRANS ;sector translation table
+ DB 0,0,0,0,0,0,0,0,0 ;bdos scratch area
+ DB 0 ;media flag
+ DEFW DPB0 ;disk parameter block
+ DEFW 0FFFEH ;checksum vector
+ DEFW 0FFFEH ;allocation vector
+ DEFW 0FFFEH ;directory buffer control block
+ DEFW 0FFFFH ;dtabcb not used
+ DEFW 0FFFEH ;hashing
+ DEFB 0 ;hash bank
+DPH3: DEFW TRANS ;sector translation table
+ DB 0,0,0,0,0,0,0,0,0 ;bdos scratch area
+ DB 0 ;media flag
+ DEFW DPB0 ;disk parameter block
+ DEFW 0FFFEH ;checksum vector
+ DEFW 0FFFEH ;allocation vector
+ DEFW 0FFFEH ;directory buffer control block
+ DEFW 0FFFFH ;dtabcb not used
+ DEFW 0FFFEH ;hashing
+ DEFB 0 ;hash bank
+;
+; sector translate vector for the IBM 8" disk
+;
+TRANS: DEFB 1,7,13,19 ;sectors 1,2,3,4
+ DEFB 25,5,11,17 ;sectors 5,6,7,8
+ DEFB 23,3,9,15 ;sectors 9,10,11,12
+ DEFB 21,2,8,14 ;sectors 13,14,15,16
+ DEFB 20,26,6,12 ;sectors 17,18,19,20
+ DEFB 18,24,4,10 ;sectors 21,22,23,24
+ DEFB 16,22 ;sectors 25,26
+;
+; disk parameter block for the IBM 8" disk
+;
+DPB0: DEFW 26 ;sectors per track
+ DEFB 3 ;block shift factor
+ DEFB 7 ;block mask
+ DEFB 0 ;extent mask
+ DEFW 242 ;disk size-1
+ DEFW 63 ;directory max
+ DEFB 192 ;alloc 0
+ DEFB 0 ;alloc 1
+ DEFW 16 ;check size
+ DEFW 2 ;track offset
+ DEFB 0,0 ;physical sector size and shift
+;
+; fixed data tables for 4mb harddisks
+;
+; disk parameter header
+;
+DPH8: DEFW HDTRA ;sector translation table
+ DB 0,0,0,0,0,0,0,0,0 ;bdos scratch area
+ DB 0 ;media flag
+ DEFW DPB1 ;disk parameter block
+ DEFW 0FFFEH ;checksum vector
+ DEFW 0FFFEH ;allocation vector
+ DEFW 0FFFEH ;directory buffer control block
+ DEFW 0FFFFH ;dtabcb not used
+ DEFW 0FFFEH ;hashing
+ DEFB 0 ;hash bank
+DPH9: DEFW HDTRA ;sector translation table
+ DB 0,0,0,0,0,0,0,0,0 ;bdos scratch area
+ DB 0 ;media flag
+ DEFW DPB1 ;disk parameter block
+ DEFW 0FFFEH ;checksum vector
+ DEFW 0FFFEH ;allocation vector
+ DEFW 0FFFEH ;directory buffer control block
+ DEFW 0FFFFH ;dtabcb not used
+ DEFW 0FFFEH ;hashing
+ DEFB 0 ;hash bank
+;
+; sector translate vector for 4mb harddisk
+;
+HDTRA: DEFB 1,2,3,4,5,6,7,8,9,10
+ DEFB 11,12,13,14,15,16,17,18,19,20
+ DEFB 21,22,23,24,25,26,27,28,29,30
+ DEFB 31,32,33,34,35,36,37,38,39,40
+ DEFB 41,42,43,44,45,46,47,48,49,50
+ DEFB 51,52,53,54,55,56,57,58,59,60
+ DEFB 61,62,63,64,65,66,67,68,69,70
+ DEFB 71,72,73,74,75,76,77,78,79,80
+ DEFB 81,82,83,84,85,86,87,88,89,90
+ DEFB 91,92,93,94,95,96,97,98,99,100
+ DEFB 101,102,103,104,105,106,107,108,109,110
+ DEFB 111,112,113,114,115,116,117,118,119,120
+ DEFB 121,122,123,124,125,126,127,128
+;
+; disk parameter block for 4mb harddisk
+;
+DPB1: DEFW 128 ;sectors per track
+ DEFB 4 ;block shift factor
+ DEFB 15 ;block mask
+ DEFB 0 ;extent mask
+ DEFW 2039 ;disk size-1
+ DEFW 1023 ;directory max
+ DEFB 255 ;alloc 0
+ DEFB 255 ;alloc 1
+ DEFW 0 ;check size
+ DEFW 0 ;track offset
+ DEFB 0,0 ;physical sector size and shift
+;
+; character device table
+;
+CHRTBL: DEFB 'CRT '
+ DEFB mb$in$out
+ DEFB baud$none
+ DEFB 'LPT '
+ DEFB mb$output
+ DEFB baud$none
+ DEFB 'PTP '
+ DEFB mb$output
+ DEFB baud$none
+ DEFB 'PTR '
+ DEFB mb$input
+ DEFB baud$none
+ DEFB 0
+;
+; signon message
+;
+SIGNON: DEFB 13,10
+ DEFM 'BANKED BIOS3 V1.4 for Z80SIM, '
+ DEFM 'Copyright 1989-2006 by Udo Munk'
+ DEFB 13,10
+ DEFB 0
+;
+; small stack
+;
+ DS 8
+STACK:
+;
+; fcb for loading ccp
+;
+CCPFCB: DEFB 1,'CCP COM',0,0,0,0
+ DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+CCPREC: DEFB 0,0,0
+;
+ DSEG
+;
+; bios error messages
+;
+CCPOER: DEFB 13,10,'BIOS ERROR: cannot open CCP.COM',13,10,'$'
+CCPIOE: DEFB 13,10,'BIOS ERROR: reading CCP.COM',13,10,'$'
+;
+ CSEG
+;
+DRIVE: DEFB 0 ;drive to select
+BANK: DEFB 0 ;bank to select for dma
+;
+; end of fixed tables
+;
+; individual subroutines to perform each function
+;
+ DSEG
+;
+BOOT: LD B,1 ;indicate cold boot
+;
+ LD HL,8000H
+ LD (@civec),HL ;CONSOLE:=CON for input
+ LD (@covec),HL ;CONSOLE:=CON for output
+ LD HL,4000H
+ LD (@lovec),HL ;LST:=LPT
+ LD HL,2000H
+ LD (@aovec),HL ;AUXOUT:=PTP
+ LD HL,1000H
+ LD (@aivec),HL ;AUXIN:=PTR
+;
+ LD A,3 ;initialize 3 memory banks
+ OUT (MMUINI),A
+ JP WBOOT1
+;
+ CSEG
+;
+WBOOT: LD B,0 ;indicate warm boot
+WBOOT1: LD SP,STACK
+;
+; initialize low memory jumps in bank 1
+;
+ LD A,1
+ CALL SELMEM
+;
+ LD A,0C3H ;jmp instruction
+ LD (WARM),A
+ LD HL,WBOOTE ;warm boot enty point
+ LD (WARM+1),HL
+ LD (BDOS),A
+ LD HL,(@mxtpa) ;bdos entry point
+ LD (BDOS+1),HL
+;
+; print message on cold boot
+;
+ LD A,B
+ OR A
+ JP Z,LDCCP
+ LD HL,SIGNON ;print message
+WBOOT2: LD A,(HL)
+ OR A
+ JP Z,LDCCP
+ LD C,A
+ CALL CONOUT
+ INC HL
+ JP WBOOT2
+;
+; load ccp.com into tpa
+;
+LDCCP: XOR A ;initialize fcb
+ LD (CCPFCB+15),A
+ LD HL,0
+ LD (CCPREC),HL
+ LD DE,CCPFCB ;open file ccp.com
+ LD C,OPEN
+ CALL BDOS
+ LD DE,CCPOER
+ INC A
+ JP Z,CCPERR ;print error if file not found
+ LD DE,0100H ;setup DMA to tpa
+ LD C,DMA
+ CALL BDOS
+ LD DE,128 ;read up to 16KB
+ LD C,MULTI
+ CALL BDOS
+ LD DE,CCPFCB ;read the ccp into memory
+ LD C,READS
+ CALL BDOS
+ LD DE,CCPIOE
+ INC A
+ JP NZ,0100H ;start ccp
+CCPERR: LD C,PRINT ;print error message
+ CALL BDOS
+ HALT
+;
+; character i/o drivers
+;
+DEVTBL: LD HL,CHRTBL
+ RET
+;
+; character device initialization
+;
+DEVINI: RET
+;
+; console in status, return 0ffh if character ready, 00h if not
+;
+CONST: IN A,(CONSTA)
+ RET
+;
+; console character input from register a
+;
+CONIN: IN A,(CONDAT)
+ RET
+;
+; console out status, return 0ffh if ready, 00h if not
+CONOST: LD A,0FFH ;console out always ready
+ RET
+;
+; console character output from register c
+;
+CONOUT: LD A,C ;get to accumulator
+ OUT (CONDAT),A ;send character to console
+ RET
+;
+; list out status, return 0ffh if ready, 00h if not
+;
+LISTST: LD A,0FFH ;list out always ready
+ RET
+;
+; list character output from register C
+;
+LIST: LD A,C
+ OUT (PRTDAT),A
+ RET
+;
+; auxilary input status, 0ffh if ready, 00h if not
+;
+AUXIST: XOR A ;never ready, hardware not available yet
+ RET
+;
+; auxilary output status, 0ffh if ready, 00h if not
+;
+AUXOST: XOR A ;never ready, hadware not available yet
+ RET
+;
+; auxilary input
+;
+AUXIN: IN A,(AUXDAT)
+ RET
+;
+; auxilary output from register c
+;
+AUXOUT: LD A,C
+ OUT (AUXDAT),A
+ RET
+;
+;
+; i/o drivers for the disks
+;
+DRVTBL: LD HL,DRIVES
+ RET
+;
+ DSEG
+;
+; move to the track 00 position of current drive
+; translate this call into a settrk call with parameter 00
+;
+HOME: LD C,0 ;select track 0
+ JP SETTRK ;we will move to 00 on first read/write
+;
+; select disk given by register C
+;
+SELDSK: LD HL,0000H ;error return code
+ LD A,C
+ LD (DRIVE),A
+ CP 4 ;disk drive 1-4?
+ JP C,SEL1 ;go
+ CP 8 ;harddisk 1?
+ JP Z,SEL1 ;go
+ CP 9 ;harddisk 2?
+ RET NZ ;no, error
+; disk number is in the proper range
+; return proper disk parameter header address
+SEL1: LD L,C
+ LD H,0
+ ADD HL,HL ;drive index in hl
+ LD BC,DRIVES
+ ADD HL,BC ;get pointer to dph
+ LD A,(HL)
+ INC HL
+ LD H,(HL)
+ LD L,A
+ LD A,(DRIVE)
+ OUT (FDCD),A ;selekt disk drive
+ RET
+;
+; set track given by register c
+;
+SETTRK: LD A,C
+ OUT (FDCT),A
+ RET
+;
+; set sector given by register c
+;
+SETSEC: LD A,C
+ OUT (FDCS),A
+ RET
+;
+; translate the sector given by bc using the
+; translate table given by de
+;
+SECTRAN:
+ EX DE,HL ;hl=.trans
+ ADD HL,BC ;hl=.trans(sector)
+ LD L,(HL) ;l = trans(sector)
+ LD H,0 ;hl= trans(sector)
+ RET ;with value in HL
+;
+; set dma address given by registers b and c
+;
+SETDMA: LD A,C ;low order address
+ OUT (DMAL),A
+ LD A,B ;high order address
+ OUT (DMAH),A
+ RET
+;
+ CSEG
+;
+; perform read operation
+;
+READ: LD A,(BANK) ;switch to saved bank
+ OUT (MMUSEL),A
+ XOR A ;read command -> A
+ JP WAITIO ;to perform the actual i/o
+;
+; perform write operation
+;
+WRITE: LD A,(BANK) ;switch to saved bank
+ OUT (MMUSEL),A
+ LD A,1 ;write command -> A
+;
+; enter here from read and write to perform the actual i/o
+; operation. return 00h in register a if the operation completes
+; properly, and 01h if an error occurs during the read or write
+;
+WAITIO: OUT (FDCOP),A ;start i/o operation
+ XOR A ;reselect bank 0
+ OUT (MMUSEL),A
+ IN A,(FDCST) ;status of i/o operation -> A
+ RET
+;
+; nothing to do
+;
+MULTIO: XOR A
+ RET
+;
+; nothing to do
+;
+FLUSH: XOR A
+ RET
+;
+; memory move
+;
+MOVE: EX DE,HL
+ LDIR
+ EX DE,HL
+ RET
+;
+; select memory bank
+SELMEM: OUT (MMUSEL),A
+ RET
+;
+; specify memory bank for dma operation
+SETBNK: LD (BANK),A
+ RET
+;
+; xmove not implemented yet, hardware missing
+;
+XMOVE: RET
+;
+; get/set time
+;
+TIME:
+ LD A,C
+ CP 0FFH
+ RET Z ;we cannot set the UNIX time from here
+ LD A,GETSEC ;get seconds
+ OUT (CLKCMD),A
+ IN A,(CLKDAT)
+ LD (@sec),A
+ LD A,GETMIN ;get minutes
+ OUT (CLKCMD),A
+ IN A,(CLKDAT)
+ LD (@min),A
+ LD A,GETHOU ;get hours
+ OUT (CLKCMD),A
+ IN A,(CLKDAT)
+ LD (@hour),A
+ LD A,GETDAL ;get day
+ OUT (CLKCMD),A
+ IN A,(CLKDAT)
+ LD (@date),A
+ LD A,GETDAH
+ OUT (CLKCMD),A
+ IN A,(CLKDAT)
+ LD (@date+1),A
+ RET
+;
+ENDDAT EQU $ ;end
+ END ;of BIOS
diff --git a/emu/z80pack-1.9/cpmsim/srccpm3/boot.asm b/emu/z80pack-1.9/cpmsim/srccpm3/boot.asm
new file mode 100644
index 0000000..43241be
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srccpm3/boot.asm
@@ -0,0 +1,67 @@
+; CP/M 3 boot-loader for Z80-Simulator
+;
+; Copyright (C) 1989-2006 by Udo Munk
+;
+ ORG 0 ; mem base of boot
+;
+BOOT EQU 0100H ; cpmldr runs at 0100H
+SECTS EQU 51 ; # of sectors to load (26 * 2 - 1)
+;
+; I/O ports
+;
+DRIVE EQU 10 ; fdc-port: # of drive
+TRACK EQU 11 ; fdc-port: # of track
+SECTOR EQU 12 ; fdc-port: # of sector
+FDCOP EQU 13 ; fdc-port: command
+FDCST EQU 14 ; fdc-port: status
+DMAL EQU 15 ; dma-port: dma address low
+DMAH EQU 16 ; dma-port: dma address high
+;
+; begin the load operation
+;
+COLD: LD BC,2 ; b=track 0, c=sector 2
+ LD D,SECTS ; d=# sectors to load
+ LD HL,BOOT ; base transfer address
+ LD A,0 ; select drive A
+ OUT (DRIVE),A
+;
+; load the next sector
+;
+LSECT: LD A,B ; set track
+ OUT (TRACK),A
+ LD A,C ; set sector
+ OUT (SECTOR),A
+ LD A,L ; set dma address low
+ OUT (DMAL),A
+ LD A,H ; set dma adress high
+ OUT (DMAH),A
+ XOR A ; read sector
+ OUT (FDCOP),A
+ IN A,(FDCST) ; get status of fdc
+ CP 0 ; read successful ?
+ JP Z,CONT ; yes, continue
+ HALT ; no, halt cpu
+CONT:
+ ; go to next sector if load is incomplete
+ DEC D ; sects=sects-1
+ JP Z,BOOT ; head for the bios
+;
+; more sectors to load
+;
+; we aren't using a stack, so use as scratch register
+; to hold the load address increment
+;
+ LD SP,128 ; 128 bytes per sector
+ ADD HL,SP ; = + 128
+;
+ INC C ; sector = sector + 1
+ LD A,C
+ CP 27 ; last sector of track ?
+ JP C,LSECT ; no, go read another
+;
+; end of track, increment to next track
+;
+ LD C,1 ; sector = 1
+ INC B ; track = track + 1
+ JP LSECT ; for another group
+ END ; of boot loader
diff --git a/emu/z80pack-1.9/cpmsim/srccpm3/cpmldr.bin b/emu/z80pack-1.9/cpmsim/srccpm3/cpmldr.bin
new file mode 100644
index 0000000..8def05a
Binary files /dev/null and b/emu/z80pack-1.9/cpmsim/srccpm3/cpmldr.bin differ
diff --git a/emu/z80pack-1.9/cpmsim/srccpm3/ldrbios3.mac b/emu/z80pack-1.9/cpmsim/srccpm3/ldrbios3.mac
new file mode 100644
index 0000000..1ae671d
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srccpm3/ldrbios3.mac
@@ -0,0 +1,212 @@
+; CP/M 3 LDRBIOS for Z80-Simulator
+;
+; Copyright (C) 1989-2006 by Udo Munk
+;
+ .Z80
+;
+; I/O ports
+;
+CONSTA EQU 0 ;console status port
+CONDAT EQU 1 ;console data port
+FDCD EQU 10 ;fdc-port: # of drive
+FDCT EQU 11 ;fdc-port: # of track
+FDCS EQU 12 ;fdc-port: # of sector
+FDCOP EQU 13 ;fdc-port: command
+FDCST EQU 14 ;fdc-port: status
+DMAL EQU 15 ;dma-port: dma address low
+DMAH EQU 16 ;dma-port: dma address high
+;
+ CSEG
+;
+; jump vector for individual subroutines
+; * needs to be implemented
+;
+ JP BOOT ; * perform cold start initialization
+ JP WBOOT ; perform warm start initialization
+ JP CONST ; check for console input char ready
+ JP CONIN ; read console character in
+ JP CONOUT ; * write console character out
+ JP LIST ; write list character out
+ JP AUXOUT ; write auxiliary output char
+ JP AUXIN ; read auxiliary input char
+ JP HOME ; * move head to track 0 on selcted disk
+ JP SELDSK ; * select disk drive
+ JP SETTRK ; * set track number
+ JP SETSEC ; * set sector number
+ JP SETDMA ; * set dma address
+ JP READ ; * read specified sector
+ JP WRITE ; write specified sector
+ JP LISTST ; return list status
+ JP SECTRAN ; * translate logical to physical sector
+ JP CONOST ; return output status of console
+ JP AUXIST ; return input status of aux. port
+ JP AUXOST ; return output status of aux. port
+ JP DEVTBL ; return address of character i/o table
+ JP DEVINI ; initialize character i/o devices
+ JP DRVTBL ; return address of disk drive table
+ JP MULTIO ; set number of sectors to read/write
+ JP FLUSH ; flush deblocking buffers
+ JP MOVE ; * memory to memory move
+ JP TIME ; time set/get signal
+ JP SELMEM ; select bank of memory
+ JP SETBNK ; specify bank for dma operation
+ JP XMOVE ; set bank for memory dma transfer
+ JP 0 ; reserved for system implementor
+ JP 0 ; reserved for future use
+ JP 0 ; reserved for future use
+;
+; fixed data tables for a IBM-compatible 8" disk
+;
+; disk parameter header
+;
+DPH0: DEFW TRANS ;sector translation table
+ DB 0,0,0,0,0,0,0,0,0 ;bdos scratch area
+ DB 0 ;media flag
+ DEFW DPB0 ;disk parameter block
+ DEFW 0FFFEH ;checksum vector
+ DEFW 0FFFEH ;allocation vector
+ DEFW 0FFFEH ;directory buffer control block
+ DEFW 0FFFFH ;dtabcb not used
+ DEFW 0FFFFH ;hashing not used
+ DEFB 0 ;hash bank
+;
+; sector translate vector for the IBM 8" disk
+;
+TRANS: DEFB 1,7,13,19 ;sectors 1,2,3,4
+ DEFB 25,5,11,17 ;sectors 5,6,7,8
+ DEFB 23,3,9,15 ;sectors 9,10,11,12
+ DEFB 21,2,8,14 ;sectors 13,14,15,16
+ DEFB 20,26,6,12 ;sectors 17,18,19,20
+ DEFB 18,24,4,10 ;sectors 21,22,23,24
+ DEFB 16,22 ;sectors 25,26
+;
+; disk parameter block for the IBM 8" disk
+;
+DPB0: DEFW 26 ;sectors per track
+ DEFB 3 ;block shift factor
+ DEFB 7 ;block mask
+ DEFB 0 ;extent mask
+ DEFW 242 ;disk size-1
+ DEFW 63 ;directory max
+ DEFB 192 ;alloc 0
+ DEFB 0 ;alloc 1
+ DEFW 16 ;check size
+ DEFW 2 ;track offset
+ DEFB 0,0 ;physical sector size and shift
+;
+; signon message
+;
+SIGNON: DEFB 13,10
+ DEFM 'LDRBIOS3 V1.1 for Z80SIM, '
+ DEFM 'Copyright 1989-2006 by Udo Munk'
+ DEFB 13,10,0
+;
+; end of fixed tables
+;
+; individual subroutines to perform each function
+;
+BOOT: LD HL,SIGNON ;print message
+BOOTL: LD A,(HL)
+ OR A
+ JP Z,WBOOT
+ LD C,A
+ CALL CONOUT
+ INC HL
+ JP BOOTL
+;
+; those are not implemented in loader bios
+;
+WBOOT:
+CONST:
+CONIN:
+LIST:
+AUXOUT:
+AUXIN:
+WRITE:
+LISTST:
+CONOST:
+AUXIST:
+AUXOST:
+DEVTBL:
+DEVINI:
+DRVTBL:
+MULTIO:
+FLUSH:
+TIME:
+SELMEM:
+SETBNK:
+XMOVE: RET
+;
+; console character output from register c
+;
+CONOUT: LD A,C ;get to accumulator
+ OUT (CONDAT),A ;send character to console
+ RET
+;
+;
+; i/o drivers for the disk follow
+;
+; move to the track 00 position of current drive
+; translate this call into a settrk call with parameter 00
+;
+HOME: LD C,0 ;select track 0
+ JP SETTRK ;we will move to 00 on first read/write
+;
+; select disk given by register C
+;
+SELDSK: LD HL,0000H ;error return code
+ LD A,C
+ CP 0 ;we boot from drive 0 only
+ RET NZ ;return error
+; disk number is in the proper range
+; return proper disk parameter header address
+ OUT (FDCD),A ;selekt disk drive
+ LD HL,DPH0
+ RET
+;
+; set track given by register c
+;
+SETTRK: LD A,C
+ OUT (FDCT),A
+ RET
+;
+; set sector given by register c
+;
+SETSEC: LD A,C
+ OUT (FDCS),A
+ RET
+;
+; translate the sector given by BC using the
+; translate table given by DE
+;
+SECTRAN:
+ EX DE,HL ;hl=.trans
+ ADD HL,BC ;hl=.trans(sector)
+ LD L,(HL) ;l = trans(sector)
+ LD H,0 ;hl= trans(sector)
+ RET ;with value in hl
+;
+; set dma address given by registers b and c
+;
+SETDMA: LD A,C ;low order address
+ OUT (DMAL),A
+ LD A,B ;high order address
+ OUT (DMAH),A ;in dma
+ RET
+;
+; perform read operation
+;
+READ: XOR A ;read command -> a
+ OUT (FDCOP),A ;start i/o operation
+ IN A,(FDCST) ;status of i/o operation -> a
+ RET
+;
+; memory move
+;
+MOVE: EX DE,HL
+ LDIR
+ EX DE,HL
+ RET
+;
+ENDDAT EQU $ ;end
+ END ;of bios
diff --git a/emu/z80pack-1.9/cpmsim/srccpm3/putsys.c b/emu/z80pack-1.9/cpmsim/srccpm3/putsys.c
new file mode 100644
index 0000000..7589932
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srccpm3/putsys.c
@@ -0,0 +1,59 @@
+/*
+ * Write the CP/M 3 systemfiles to system tracks of drive A
+ *
+ * Copyright (C) 1988-2006 by Udo Munk
+ *
+ * History:
+ * 29-APR-88 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-MAR-93 comments in english and ported to COHERENT 4.0
+ * 02-OCT-06 modified to compile on modern POSIX OS's
+ */
+
+#include
+#include
+#include
+#include
+#include
+
+/*
+ * This program writes the CP/M 3 OS from the following files
+ * onto the system tracks of the boot disk (drivea.cpm):
+ *
+ * boot loader boot.bin
+ * cpmldr cpmldr.bin
+ */
+int main(void)
+{
+ unsigned char sector[128];
+ register int i;
+ int fd, drivea, readed;
+
+ /* open drive A for writing */
+ if ((drivea = open("../disks/drivea.cpm", O_WRONLY)) == -1) {
+ perror("file ../disks/drivea.cpm");
+ exit(1);
+ }
+ /* open boot loader (boot.bin) for reading */
+ if ((fd = open("boot.bin", O_RDONLY)) == -1) {
+ perror("file boot.bin");
+ exit(1);
+ }
+ /* read boot loader */
+ memset((char *) sector, 0, 128);
+ read(fd, (char *) sector, 128);
+ close(fd);
+ /* and write it to disk in drive A */
+ write(drivea, (char *) sector, 128);
+ /* open CP/M 3 cpmldr file (cpmldr.bin) for reading */
+ if ((fd = open("cpmldr.bin", O_RDONLY)) == -1) {
+ perror("file cpmldr.bin");
+ exit(1);
+ }
+ /* read from cpmldr.bin and write to disk in drive A */
+ while ((readed = read(fd, (char *) sector, 128)) == 128)
+ write(drivea, (char *) sector, 128);
+ write(drivea, (char *) sector, 128);
+ close(fd);
+ close(drivea);
+ return(0);
+}
diff --git a/emu/z80pack-1.9/cpmsim/srcmpm/bnkxios.mac b/emu/z80pack-1.9/cpmsim/srcmpm/bnkxios.mac
new file mode 100644
index 0000000..325ec3c
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srcmpm/bnkxios.mac
@@ -0,0 +1,503 @@
+; MP/M 2 XIOS for Z80-Simulator
+;
+; Copyright (C) 1989-2006 by Udo Munk
+;
+ .Z80
+ CSEG
+;
+; i/o ports
+;
+CONSTA EQU 0 ;console status port
+CONDAT EQU 1 ;console data port
+PRTSTA EQU 2 ;printer status port
+PRTDAT EQU 3 ;printer data port
+AUXSTA EQU 4 ;auxilary status port
+AUXDAT EQU 5 ;auxilary data port
+FDCD EQU 10 ;fdc-port: # of drive
+FDCT EQU 11 ;fdc-port: # of track
+FDCS EQU 12 ;fdc-port: # of sector
+FDCOP EQU 13 ;fdc-port: command
+FDCST EQU 14 ;fdc-port: status
+DMAL EQU 15 ;dma-port: dma address low
+DMAH EQU 16 ;dma-port: dma address high
+MMUINI EQU 20 ;initialize mmu
+MMUSEL EQU 21 ;bank select mmu
+CLKCMD EQU 25 ;clock command
+CLKDAT EQU 26 ;clock data
+TIMER EQU 27 ;interrupt timer
+;
+; clock commands
+;
+GETSEC EQU 0 ;get seconds
+GETMIN EQU 1 ;get minutes
+GETHOU EQU 2 ;get hours
+GETDAL EQU 3 ;get days low
+GETDAH EQU 4 ;get days high
+;
+BDOS EQU 5 ;bdos calls
+SETTD EQU 104 ;bdos set time and date
+;
+POLL EQU 131 ;xdos poll function
+PLCI0 EQU 0 ;poll console in #0
+FLAGSET EQU 133 ;xdos flag set function
+SYSDATA EQU 154 ;xdos syste data address
+;
+; jump vector for individual subroutines
+;
+ JP COMMONBASE ;commonbase
+ JP WARMSTART ;warm start
+ JP CONST ;console status
+ JP CONIN ;console character in
+ JP CONOUT ;console character out
+ JP LIST ;list character out
+ JP PUNCH ;not used by MP/M 2
+ JP READER ;not used by MP/M 2
+ JP HOME ;move head to home
+ JP SELDSK ;select disk
+ JP SETTRK ;set track numer
+ JP SETSEC ;set sector number
+ JP SETDMA ;set dma address
+ JP READ ;read disk
+ JP WRITE ;write disk
+ JP LISTST ;not used by MP/M 2
+ JP SECTRAN ;sector translate
+ JP SELMEMORY ;select memory
+ JP POLLDEVICE ;poll device
+ JP STARTCLOCK ;start clock
+ JP STOPCLOCK ;stop clock
+ JP EXITREGION ;exit region
+ JP MAXCONSOLE ;maximum console number
+ JP SYSTEMINIT ;system initialization
+ JP IDLE ;idle prozedure
+;
+COMMONBASE:
+ JP COLDSTART
+SWTUSER:
+ JP $-$
+SWTSYS: JP $-$
+PDISP: JP $-$
+XDOS: JP $-$
+SYSDAT: DEFW $-$
+;
+COLDSTART:
+WARMSTART:
+ LD C,0
+ JP XDOS ;system reset, terminate prozess
+;
+; MP/M II V2.0 Console Bios
+;
+CONST:
+ CALL PTBLJMP ;compute and jump to handler
+ DW PTSTI0
+;
+CONIN:
+ CALL PTBLJMP ;compute and jump to handle
+ DW PTIN0
+;
+CONOUT:
+ CALL PTBLJMP ;compute and jump to handler
+ DW PTOUT0
+;
+PTSTI0: IN A,(CONSTA) ;console 0 input
+ RET
+;
+PTIN0: LD C,POLL ;poll console 0 status in
+ LD E,PLCI0
+ CALL XDOS ;poll console 0
+ IN A,(CONDAT) ;read character
+ AND 7FH ;strip parity
+ RET
+;
+PTOUT0: LD A,C ;console 0 output
+ OUT (CONDAT),A
+ RET
+;
+PTBLJMP: ;compute and jump to handler
+ LD A,D
+ ADD A,A ;double table index for adress offset
+ POP HL ;return adress of jump table
+ LD E,A
+ LD D,0
+ ADD HL,DE ;table index * 2 + table base
+ LD E,(HL) ;get handler address
+ INC HL
+ LD D,(HL)
+ EX DE,HL
+ JP (HL) ;jump to computed handler
+;
+LIST:
+ LD A,C
+ OUT (PRTDAT),A
+ RET
+;
+; not used by MP/M 2
+PUNCH:
+READER:
+LISTST:
+ RET
+;
+; MP/M II V2.0 Xios
+;
+; select/protect memory
+; BC = address of memory descriptor
+SELMEMORY:
+ LD HL,3 ;offset memory bank in memory descriptor
+ ADD HL,BC
+ LD A,(HL) ;get bank
+ OUT (MMUSEL),A ;and select it
+ RET
+;
+; poll character devices
+;
+POLLDEVICE:
+ JP PTSTI0 ;poll console 0 status in
+;
+; start clock
+;
+STARTCLOCK:
+ LD A,0FFH
+ LD (TICKN),A
+ RET
+;
+; stop clock
+;
+STOPCLOCK:
+ XOR A
+ LD (TICKN),A
+ RET
+;
+; exit region:
+; enable interrupt if not preempted or in dispatcher
+;
+EXITREGION:
+ LD A,(PREEMP)
+ OR A
+ RET NZ
+ EI
+ RET
+;
+; maximum console number
+;
+MAXCONSOLE:
+ LD A,1
+ RET
+;
+; system initialization
+; C MP/M debugger restart #
+; DE MP/M entry point for debugger
+; HL BIOS jump table address
+;
+SYSTEMINIT:
+;
+ ;doesn't work
+ PUSH HL
+ LD C,SYSDATA ;get system data page address
+ CALL XDOS
+ CALL SETTOD ;set tod from hardware clock
+ POP HL
+;
+ LD A,8 ;initialize banked memory
+ OUT (MMUINI),A
+ LD B,A
+;
+SYS1: DEC B
+ LD A,B
+ OUT (MMUSEL),A ;select every bank and initialize
+ LD A,0C3H ;jp instruction
+ LD (0),A
+ LD (38H),A
+ LD (1),HL
+ PUSH HL
+ LD HL,INTHND
+ LD (39H),HL
+ POP HL
+ JP NZ,SYS1
+;
+ LD HL,SIGNON ;print message
+SYS2: LD A,(HL)
+ OR A
+ JP Z,SYS3
+ OUT (CONDAT),A
+ INC HL
+ JP SYS2
+;
+SYS3: IM 1
+ LD A,1 ;enable 20ms interrupt timer
+ OUT (TIMER),A
+ EI
+ RET
+;
+; set mp/m tod from hardware clock
+; hl = tod address
+;
+SETTOD: LD A,GETDAL
+ OUT (CLKCMD),A
+ IN A,(CLKDAT)
+ LD (HL),A
+ INC HL
+ LD A,GETDAH
+ OUT (CLKCMD),A
+ IN A,(CLKDAT)
+ LD (HL),A
+ INC HL
+ LD A,GETHOU
+ OUT (CLKCMD),A
+ IN A,(CLKDAT)
+ LD (HL),A
+ INC HL
+ LD A,GETMIN
+ OUT (CLKCMD),A
+ IN A,(CLKDAT)
+ LD (HL),A
+ RET
+;
+; idle
+;
+IDLE: EI
+ HALT
+ RET
+;
+; interrupt handler
+;
+INTHND: LD (SVDHL),HL ;save registers
+ POP HL
+ LD (SVDRET),HL
+ PUSH AF
+ LD HL,0
+ ADD HL,SP
+ LD (SVDSP),HL
+ LD SP,INTSTK
+ PUSH DE
+ PUSH BC
+ LD A,0FFH ;set preempted flag
+ LD (PREEMP),A
+ LD A,(TICKN)
+ OR A ;test tick, indicates delayed process
+ JP Z,INTHND1
+ LD C,FLAGSET ;set flag #1 each tick
+ LD E,1
+ CALL XDOS
+INTHND1:
+ LD HL,CNT50 ;decrement tick counter
+ DEC (HL)
+ JP NZ,INTDONE
+ LD (HL),50 ;set flag #2 each second
+ LD C,FLAGSET
+ LD E,2
+ CALL XDOS
+INTDONE:
+ XOR A ;clear preempted flag
+ LD (PREEMP),A
+ POP BC ;restore registers
+ POP DE
+ LD HL,(SVDSP)
+ LD SP,HL
+ POP AF
+ LD HL,(SVDRET)
+ PUSH HL
+ LD HL,(PDISP+1) ;dispatch processes
+ PUSH HL
+ LD HL,(SVDHL)
+ RETI
+;
+; i/o drivers for disks
+;
+; move to the track 00 position of current drive
+; translate this call into a settrk call with parameter 00
+;
+HOME: LD C,0 ;select track 0
+ JP SETTRK ;we will move to 00 on first read/write
+;
+; select disk given by register C
+;
+SELDSK: LD HL,0000H ;error return code
+ LD A,C
+ CP 4 ;must be between 0 and 3
+ JR NC,SELHD ;no carry if 4,5,...
+; disk number is in the proper range
+; compute proper disk parameter header address
+ OUT (FDCD),A ;selekt disk drive
+ LD L,A ;L=disk number 0,1,2,3
+ ADD HL,HL ;*2
+ ADD HL,HL ;*4
+ ADD HL,HL ;*8
+ ADD HL,HL ;*16 (size of each header)
+ LD DE,DPBASE
+ ADD HL,DE ;HL=.dpbase(diskno*16)
+ RET
+SELHD: CP 8 ;select the harddisk?
+ RET NZ ;no, error
+ OUT (FDCD),A ;select disk drive
+ LD HL,HDBASE ;HL=hdbase for harddisk
+ RET
+;
+; set track given by register c
+;
+SETTRK: LD A,C
+ OUT (FDCT),A
+ RET
+;
+; set sector given by register c
+;
+SETSEC: LD A,C
+ OUT (FDCS),A
+ RET
+;
+; translate the sector given by BC using the
+; translate table given by DE
+;
+SECTRAN:
+ EX DE,HL ;HL=.trans
+ ADD HL,BC ;HL=.trans(sector)
+ LD L,(HL) ;L = trans(sector)
+ LD H,0 ;HL= trans(sector)
+ RET ;with value in HL
+;
+; set dma address given by registers b and c
+;
+SETDMA: LD A,C ;low order address
+ OUT (DMAL),A
+ LD A,B ;high order address
+ OUT (DMAH),A ;in dma
+ RET
+;
+; perform read operation
+;
+READ: XOR A ;read command -> A
+ JP WAITIO ;to perform the actual i/o
+;
+; perform a write operation
+;
+WRITE: LD A,1 ;write command -> A
+;
+; enter here from read and write to perform the actual i/o
+; operation. return a 00h in register a if the operation completes
+; properly, and 01h if an error occurs during the read or write
+;
+; in this case, we have saved the disk number in 'diskno' (0-3)
+; the track number in 'track' (0-76)
+; the sector number in 'sector' (1-26)
+; the dma address in 'dmaad' (0-65535)
+;
+WAITIO: OUT (FDCOP),A ;start i/o operation
+ IN A,(FDCST) ;status of i/o operation -> A
+ RET
+;
+; XIOS data segment
+;
+SIGNON: DEFB 13,10
+ DEFM 'MP/M 2 XIOS V1.1 for Z80SIM, '
+ DEFM 'Copyright 1989-2006 by Udo Munk'
+ DEFB 13,10,0
+;
+TICKN: DEFB 0 ;flag for tick
+PREEMP: DEFB 0 ;preempted flag
+TOD: DEFS 4 ;time of day
+SVDHL: DEFS 2 ;save hl during interrupt
+SVDRET: DEFS 2 ;save return address during interrupt
+SVDSP: DEFS 2 ;save sp during interrupt
+CNT50: DEFB 50 ;50 ticks a 20ms = 1 second
+ ;interrupt stack
+ DEFW 0C7C7H,0C7C7H,0C7C7H,0C7C7H
+ DEFW 0C7C7H,0C7C7H,0C7C7H,0C7C7H
+ DEFW 0C7C7H,0C7C7H,0C7C7H,0C7C7H
+ DEFW 0C7C7H,0C7C7H,0C7C7H,0C7C7H
+INTSTK:
+;
+; fixed data tables for four-drive standard
+; IBM-compatible 8" disks
+;
+; disk parameter header for disk 00
+DPBASE: DEFW TRANS,0000H
+ DEFW 0000H,0000H
+ DEFW DIRBF,DPBLK
+ DEFW CHK00,ALL00
+; disk parameter header for disk 01
+ DEFW TRANS,0000H
+ DEFW 0000H,0000H
+ DEFW DIRBF,DPBLK
+ DEFW CHK01,ALL01
+; disk parameter header for disk 02
+ DEFW TRANS,0000H
+ DEFW 0000H,0000H
+ DEFW DIRBF,DPBLK
+ DEFW CHK02,ALL02
+; disk parameter header for disk 03
+ DEFW TRANS,0000H
+ DEFW 0000H,0000H
+ DEFW DIRBF,DPBLK
+ DEFW CHK03,ALL03
+;
+; sector translate vector for the IBM 8" disks
+;
+TRANS: DEFB 1,7,13,19 ;sectors 1,2,3,4
+ DEFB 25,5,11,17 ;sectors 5,6,7,8
+ DEFB 23,3,9,15 ;sectors 9,10,11,12
+ DEFB 21,2,8,14 ;sectors 13,14,15,16
+ DEFB 20,26,6,12 ;sectors 17,18,19,20
+ DEFB 18,24,4,10 ;sectors 21,22,23,24
+ DEFB 16,22 ;sectors 25,26
+;
+; disk parameter block, common to all IBM 8" disks
+;
+DPBLK: DEFW 26 ;sectors per track
+ DEFB 3 ;block shift factor
+ DEFB 7 ;block mask
+ DEFB 0 ;extent mask
+ DEFW 242 ;disk size-1
+ DEFW 63 ;directory max
+ DEFB 192 ;alloc 0
+ DEFB 0 ;alloc 1
+ DEFW 16 ;check size
+ DEFW 2 ;track offset
+;
+; fixed data tables for 4MB harddisk
+;
+; disk parameter header
+HDBASE: DEFW HDTRA,0000H
+ DEFW 0000H,0000H
+ DEFW DIRBF,HDBLK
+ DEFW CHKHD,ALLHD
+;
+; sector translate vector for the hardisk
+;
+HDTRA: DEFB 1,2,3,4,5,6,7,8,9,10
+ DEFB 11,12,13,14,15,16,17,18,19,20
+ DEFB 21,22,23,24,25,26,27,28,29,30
+ DEFB 31,32,33,34,35,36,37,38,39,40
+ DEFB 41,42,43,44,45,46,47,48,49,50
+ DEFB 51,52,53,54,55,56,57,58,59,60
+ DEFB 61,62,63,64,65,66,67,68,69,70
+ DEFB 71,72,73,74,75,76,77,78,79,80
+ DEFB 81,82,83,84,85,86,87,88,89,90
+ DEFB 91,92,93,94,95,96,97,98,99,100
+ DEFB 101,102,103,104,105,106,107,108,109,110
+ DEFB 111,112,113,114,115,116,117,118,119,120
+ DEFB 121,122,123,124,125,126,127,128
+;
+; disk parameter block for harddisk
+;
+HDBLK: DEFW 128 ;sectors per track
+ DEFB 4 ;block shift factor
+ DEFB 15 ;block mask
+ DEFB 0 ;extent mask
+ DEFW 2039 ;disk size-1
+ DEFW 1023 ;directory max
+ DEFB 255 ;alloc 0
+ DEFB 255 ;alloc 1
+ DEFW 0 ;check size
+ DEFW 0 ;track offset
+;
+DIRBF: DEFS 128 ;scratch directory area
+ALL00: DEFS 31 ;allocation vector 0
+ALL01: DEFS 31 ;allocation vector 1
+ALL02: DEFS 31 ;allocation vector 2
+ALL03: DEFS 31 ;allocation vector 3
+ALLHD: DEFS 255 ;allocation vector harddisk
+CHK00: DEFS 16 ;check vector 0
+CHK01: DEFS 16 ;check vector 1
+CHK02: DEFS 16 ;check vector 2
+CHK03: DEFS 16 ;check vector 3
+CHKHD: DEFS 0 ;check vector harddisk
+;
+ END
diff --git a/emu/z80pack-1.9/cpmsim/srcmpm/ldrbios.mac b/emu/z80pack-1.9/cpmsim/srcmpm/ldrbios.mac
new file mode 100644
index 0000000..495a4d6
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srcmpm/ldrbios.mac
@@ -0,0 +1,177 @@
+; MP/M 2 LDRBIOS for Z80-Simulator
+;
+; Copyright (C) 1989-2006 by Udo Munk
+;
+ ORG 1700H
+;
+; I/O ports
+;
+CONSTA EQU 0 ;console status port
+CONDAT EQU 1 ;console data port
+FDCD EQU 10 ;fdc-port: # of drive
+FDCT EQU 11 ;fdc-port: # of track
+FDCS EQU 12 ;fdc-port: # of sector
+FDCOP EQU 13 ;fdc-port: command
+FDCST EQU 14 ;fdc-port: status
+DMAL EQU 15 ;dma-port: dma address low
+DMAH EQU 16 ;dma-port: dma address high
+;
+; jump vector for individual subroutines
+;
+ JP BOOT ;perform cold start initialization
+ JP WBOOT ;perform warm start initialization
+ JP CONST ;check for console input char ready
+ JP CONIN ;read console character in
+ JP CONOUT ;write console character out
+ JP LIST ;write list character out
+ JP AUXOUT ;write auxiliary output char
+ JP AUXIN ;read auxiliary input char
+ JP HOME ;move head to track 0 on selcted disk
+ JP SELDSK ;select disk drive
+ JP SETTRK ;set track number
+ JP SETSEC ;set sector number
+ JP SETDMA ;set dma address
+ JP READ ;read specified sector
+ JP WRITE ;write specified sector
+ JP LISTST ;return list status
+ JP SECTRAN ;translate logical to physical sector
+;
+; fixed data tables for a IBM-compatible 8" disk
+;
+; disk parameter header
+;
+DPH: DEFW TRANS,0000H
+ DEFW 0000H,0000H
+ DEFW DIRBF,DPBLK
+ DEFW CHK00,ALL00
+;
+; sector translate vector for the IBM 8" disk
+;
+TRANS: DEFB 1,7,13,19 ;sectors 1,2,3,4
+ DEFB 25,5,11,17 ;sectors 5,6,7,8
+ DEFB 23,3,9,15 ;sectors 9,10,11,12
+ DEFB 21,2,8,14 ;sectors 13,14,15,16
+ DEFB 20,26,6,12 ;sectors 17,18,19,20
+ DEFB 18,24,4,10 ;sectors 21,22,23,24
+ DEFB 16,22 ;sectors 25,26
+;
+; disk parameter block for the IBM 8" disk
+;
+DPBLK: DEFW 26 ;sectors per track
+ DEFB 3 ;block shift factor
+ DEFB 7 ;block mask
+ DEFB 0 ;extent mask
+ DEFW 242 ;disk size-1
+ DEFW 63 ;directory max
+ DEFB 192 ;alloc 0
+ DEFB 0 ;alloc 1
+ DEFW 16 ;check size
+ DEFW 2 ;track offset
+;
+; signon message
+;
+SIGNON: DEFB 13,10
+ DEFM 'LDRBIOS V1.0 for Z80SIM, '
+ DEFM 'Copyright 1989-2006 by Udo Munk'
+ DEFB 13,10,0
+;
+; end of fixed tables
+;
+; individual subroutines to perform each function
+;
+BOOT: LD HL,SIGNON ;print message
+BOOTL: LD A,(HL)
+ OR A
+ JP Z,WBOOT
+ LD C,A
+ CALL CONOUT
+ INC HL
+ JP BOOTL
+;
+; those are not implemented in loader bios
+;
+WBOOT:
+CONST:
+CONIN:
+LIST:
+AUXOUT:
+AUXIN:
+WRITE:
+LISTST:
+ RET
+;
+; console character output from register c
+;
+CONOUT: LD A,C ;get to accumulator
+ OUT (CONDAT),A ;send character to console
+ RET
+;
+;
+; i/o drivers for the disk follow
+;
+; move to the track 00 position of current drive
+; translate this call into a settrk call with parameter 00
+;
+HOME: LD C,0 ;select track 0
+ JP SETTRK ;we will move to 00 on first read/write
+;
+; select disk given by register C
+;
+SELDSK: PUSH BC
+ CALL BOOT ;signon message
+ POP BC
+ LD HL,0000H ;error return code
+ LD A,C
+ CP 0 ;we boot from drive 0 only
+ RET NZ ;return error
+; disk number is in the proper range
+; return proper disk parameter header address
+ OUT (FDCD),A ;selekt disk drive
+ LD HL,DPH
+ RET
+;
+; set track given by register c
+;
+SETTRK: LD A,C
+ OUT (FDCT),A
+ RET
+;
+; set sector given by register c
+;
+SETSEC: LD A,C
+ OUT (FDCS),A
+ RET
+;
+; translate the sector given by BC using the
+; translate table given by DE
+;
+SECTRAN:
+ EX DE,HL ;hl=.trans
+ ADD HL,BC ;hl=.trans(sector)
+ LD L,(HL) ;l = trans(sector)
+ LD H,0 ;hl= trans(sector)
+ RET ;with value in hl
+;
+; set dma address given by registers b and c
+;
+SETDMA: LD A,C ;low order address
+ OUT (DMAL),A
+ LD A,B ;high order address
+ OUT (DMAH),A ;in dma
+ RET
+;
+; perform read operation
+;
+READ: XOR A ;read command -> a
+ OUT (FDCOP),A ;start i/o operation
+ IN A,(FDCST) ;status of i/o operation -> a
+ RET
+;
+BEGDAT EQU $
+DIRBF: DEFS 128 ;scratch directory area
+ALL00: DEFS 31 ;allocation vector
+CHK00: DEFS 16 ;check vector
+;
+ENDDAT EQU $ ;end
+DATSIZ EQU $-BEGDAT ;size of data area
+ END ;of bios
diff --git a/emu/z80pack-1.9/cpmsim/srcsim/Makefile b/emu/z80pack-1.9/cpmsim/srcsim/Makefile
new file mode 100644
index 0000000..5cd9216
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srcsim/Makefile
@@ -0,0 +1,74 @@
+CFLAGS= -O -c -Wall
+LFLAGS= -s
+
+OBJ = sim0.o \
+ sim1.o \
+ sim2.o \
+ sim3.o \
+ sim4.o \
+ sim5.o \
+ sim6.o \
+ sim7.o \
+ simctl.o \
+ simint.o \
+ iosim.o \
+ simfun.o \
+ simglb.o
+
+all: ../auxin ../auxout ../cpmsim
+ @echo "done."
+
+../auxin:
+ test -f ../auxin || mknod ../auxin p
+
+../auxout:
+ test -f ../auxout || mknod ../auxout p
+
+../cpmsim : $(OBJ)
+ cc $(OBJ) $(LFLAGS) -o ../cpmsim
+
+sim0.c:
+ lnsrc
+
+sim0.o : sim0.c sim.h simglb.h
+ cc $(CFLAGS) sim0.c
+
+sim1.o : sim1.c sim.h simglb.h
+ cc $(CFLAGS) sim1.c
+
+sim2.o : sim2.c sim.h simglb.h
+ cc $(CFLAGS) sim2.c
+
+sim3.o : sim3.c sim.h simglb.h
+ cc $(CFLAGS) sim3.c
+
+sim4.o : sim4.c sim.h simglb.h
+ cc $(CFLAGS) sim4.c
+
+sim5.o : sim5.c sim.h simglb.h
+ cc $(CFLAGS) sim5.c
+
+sim6.o : sim6.c sim.h simglb.h
+ cc $(CFLAGS) sim6.c
+
+sim7.o : sim7.c sim.h simglb.h
+ cc $(CFLAGS) sim7.c
+
+simctl.o : simctl.c sim.h simglb.h
+ cc $(CFLAGS) simctl.c
+
+simint.o : simint.c sim.h simglb.h
+ cc $(CFLAGS) simint.c
+
+iosim.o : iosim.c sim.h simglb.h
+ cc $(CFLAGS) iosim.c
+
+simfun.o : simfun.c sim.h
+ cc $(CFLAGS) simfun.c
+
+simglb.o : simglb.c sim.h
+ cc $(CFLAGS) simglb.c
+
+clean:
+ rm -f *.o
+ ulnsrc
diff --git a/emu/z80pack-1.9/cpmsim/srcsim/iosim.c b/emu/z80pack-1.9/cpmsim/srcsim/iosim.c
new file mode 100644
index 0000000..154d375
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srcsim/iosim.c
@@ -0,0 +1,868 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * This modul contains a complex I/O-simulation for running
+ * CP/M 2, CP/M 3, MP/M...
+ * Please note this this doesn't emulate any hardware which
+ * ever existed, we've got all virtual circuits in here!
+ *
+ * History:
+ * 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
+ * 19-MAY-89 Additions for CP/M 3.0 und MP/M
+ * 23-DEC-90 Ported to COHERENT 3.0
+ * 10-JUN-92 Some optimization done
+ * 25-JUN-92 Flush output of stdout only at every OUT to port 0
+ * 25-JUN-92 Comments in english and ported to COHERENT 4.0
+ * 05-OCT-06 modified to compile on modern POSIX OS's
+ * 18-NOV-06 added a second harddisk
+ */
+
+/*
+ * This module contains the I/O handlers for a simulation
+ * of the hardware required for a CP/M system.
+ *
+ * Used I/O ports:
+ *
+ * 0 - console status
+ * 1 - console data
+ *
+ * 2 - printer status
+ * 3 - printer data
+ *
+ * 4 - auxilary status
+ * 5 - auxilary data
+ *
+ * 10 - FDC drive
+ * 11 - FDC track
+ * 12 - FDC sector
+ * 13 - FDC command
+ * 14 - FDC status
+ *
+ * 15 - DMA destination address low
+ * 16 - DMA destination address high
+ *
+ * 20 - MMU initialization
+ * 21 - MMU bank select
+ *
+ * 25 - clock command
+ * 26 - clock data
+ * 27 - 20ms timer causing INT, only usable in IM 1
+ *
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include "sim.h"
+#include "simglb.h"
+
+/*
+ * Structure to describe a emulated floppy disk drive:
+ * pointer to filename
+ * pointer to file descriptor
+ * number of tracks
+ * number of sectors
+ */
+struct dskdef {
+ char *fn;
+ int *fd;
+ unsigned int tracks;
+ unsigned int sectors;
+};
+
+static BYTE drive; /* current drive A..P (0..15) */
+static BYTE track; /* current track (0..255) */
+static BYTE sector; /* current sektor (0..255) */
+static BYTE status; /* status of last I/O operation on FDC */
+static BYTE dmadl; /* current DMA adresse destination low */
+static BYTE dmadh; /* current DMA adresse destination high */
+static BYTE clkcmd; /* clock command */
+static BYTE timer; /* 20ms timer */
+static int drivea; /* fd for file "drivea.cpm" */
+static int driveb; /* fd for file "driveb.cpm" */
+static int drivec; /* fd for file "drivec.cpm" */
+static int drived; /* fd for file "drived.cpm" */
+static int drivee; /* fd for file "drivee.cpm" */
+static int drivef; /* fd for file "drivef.cpm" */
+static int driveg; /* fd for file "driveg.cpm" */
+static int driveh; /* fd for file "driveh.cpm" */
+static int drivei; /* fd for file "drivei.cpm" */
+static int drivej; /* fd for file "drivej.cpm" */
+static int drivek; /* fd for file "drivek.cpm" */
+static int drivel; /* fd for file "drivel.cpm" */
+static int drivem; /* fd for file "drivem.cpm" */
+static int driven; /* fd for file "driven.cpm" */
+static int driveo; /* fd for file "driveo.cpm" */
+static int drivep; /* fd for file "drivep.cpm" */
+static int printer; /* fd for file "printer.cpm" */
+static int auxin; /* fd for pipe "auxin" */
+static int auxout; /* fd for pipe "auxout" */
+static int aux_in_eof; /* status of pipe "auxin" (<>0 means EOF) */
+static int pid_rec; /* PID of the receiving process for auxiliary */
+static char last_char; /* buffer for 1 character (console status) */
+
+static struct dskdef disks[16] = {
+ { "disks/drivea.cpm", &drivea, 77, 26 },
+ { "disks/driveb.cpm", &driveb, 77, 26 },
+ { "disks/drivec.cpm", &drivec, 77, 26 },
+ { "disks/drived.cpm", &drived, 77, 26 },
+ { "disks/drivee.cpm", &drivee, -1, -1 },
+ { "disks/drivef.cpm", &drivef, -1, -1 },
+ { "disks/driveg.cpm", &driveg, -1, -1 },
+ { "disks/driveh.cpm", &driveh, -1, -1 },
+ { "disks/drivei.cpm", &drivei, 255, 128 },
+ { "disks/drivej.cpm", &drivej, 255, 128 },
+ { "disks/drivek.cpm", &drivek, -1, -1 },
+ { "disks/drivel.cpm", &drivel, -1, -1 },
+ { "disks/drivem.cpm", &drivem, -1, -1 },
+ { "disks/driven.cpm", &driven, -1, -1 },
+ { "disks/driveo.cpm", &driveo, -1, -1 },
+ { "disks/drivep.cpm", &drivep, -1, -1 }
+};
+
+/*
+ * MMU:
+ * ===
+ *
+ * +--------+
+ * 16KB | common |
+ * +--------+
+ * +--------+ +--------+ .......... +--------+
+ * | | | | | |
+ * 48KB | | | | .......... | |
+ * | bank 0 | | bank 1 | | bank n |
+ * +--------+ +--------+ .......... +--------+
+ */
+#define MAXSEG 16 /* max. number of memory banks */
+#define SEGSIZ 49152 /* size of one bank = 48KBytes */
+static char *mmu[MAXSEG]; /* MMU with pointers to the banks */
+static int selbnk; /* current bank */
+static int maxbnk; /* number of initialized banks */
+
+/*
+ * Forward declaration of the I/O handlers for all used ports
+ */
+static BYTE io_trap(void);
+static BYTE cond_in(void), cond_out(BYTE), cons_in(void), cons_out(BYTE);
+static BYTE prtd_in(void), prtd_out(BYTE), prts_in(void), prts_out(BYTE);
+static BYTE auxd_in(void), auxd_out(BYTE), auxs_in(void), auxs_out(BYTE);
+static BYTE fdcd_in(void), fdcd_out(BYTE);
+static BYTE fdct_in(void), fdct_out(BYTE);
+static BYTE fdcs_in(void), fdcs_out(BYTE);
+static BYTE fdco_in(void), fdco_out(BYTE);
+static BYTE fdcx_in(void), fdcx_out(BYTE);
+static BYTE dmal_in(void), dmal_out(BYTE);
+static BYTE dmah_in(void), dmah_out(BYTE);
+static BYTE mmui_in(void), mmui_out(BYTE), mmus_in(void), mmus_out(BYTE);
+static BYTE clkc_in(void), clkc_out(BYTE), clkd_in(void), clkd_out(BYTE);
+static BYTE time_in(void), time_out(BYTE);
+static void int_timer(int);
+
+static int to_bcd(int), get_date(struct tm *);
+
+/*
+ * This array contains two function pointer for every
+ * active port, one for input and one for output.
+ */
+static BYTE (*port[256][2]) () = {
+ { cons_in, cons_out }, /* port 0 */
+ { cond_in, cond_out }, /* port 1 */
+ { prts_in, prts_out }, /* port 2 */
+ { prtd_in, prtd_out }, /* port 3 */
+ { auxs_in, auxs_out }, /* port 4 */
+ { auxd_in, auxd_out }, /* port 5 */
+ { io_trap, io_trap }, /* port 6 */
+ { io_trap, io_trap }, /* port 7 */
+ { io_trap, io_trap }, /* port 8 */
+ { io_trap, io_trap }, /* port 9 */
+ { fdcd_in, fdcd_out }, /* port 10 */
+ { fdct_in, fdct_out }, /* port 11 */
+ { fdcs_in, fdcs_out }, /* port 12 */
+ { fdco_in, fdco_out }, /* port 13 */
+ { fdcx_in, fdcx_out }, /* port 14 */
+ { dmal_in, dmal_out }, /* port 15 */
+ { dmah_in, dmah_out }, /* port 16 */
+ { io_trap, io_trap }, /* port 17 */
+ { io_trap, io_trap }, /* port 18 */
+ { io_trap, io_trap }, /* port 19 */
+ { mmui_in, mmui_out }, /* port 20 */
+ { mmus_in, mmus_out }, /* port 21 */
+ { io_trap, io_trap }, /* port 22 */
+ { io_trap, io_trap }, /* port 23 */
+ { io_trap, io_trap }, /* port 24 */
+ { clkc_in, clkc_out }, /* port 25 */
+ { clkd_in, clkd_out }, /* port 26 */
+ { time_in, time_out } /* port 27 */
+};
+
+/*
+ * This function initializes the I/O handlers:
+ * 1. Initialize all unused ports with the I/O trap handler.
+ * 2. Initialize the MMU with NULL pointers.
+ * 3. Open the files which emulates the disk drives. The file
+ * for drive A must be opened, or CP/M can't be booted.
+ * Errors for opening one of the other 15 drives results
+ * in a NULL pointer for fd in the dskdef structure,
+ * so that this drive can't be used.
+ * 4. Create and open the file "printer.cpm" for emulation
+ * of a printer.
+ * 5. Fork the process for receiving from the serial port.
+ * 6. Open the named pipes "auxin" and "auxout" for simulation
+ * of a serial port.
+ */
+void init_io(void)
+{
+ register int i;
+
+ for (i = 28; i <= 255; i++) {
+ port[i][0] = io_trap;
+ port[i][1] = io_trap;
+ }
+ for (i = 0; i < MAXSEG; i++)
+ mmu[i] = NULL;
+ if ((*disks[0].fd = open(disks[0].fn, O_RDWR)) == -1) {
+ perror("file disks/drivea.cpm");
+ exit(1);
+ }
+ for (i = 1; i <= 15; i++)
+ if ((*disks[i].fd = open(disks[i].fn, O_RDWR)) == -1)
+ disks[i].fd = NULL;
+ if ((printer = creat("printer.cpm", 0644)) == -1) {
+ perror("file printer.cpm");
+ exit(1);
+ }
+ pid_rec = fork();
+ switch (pid_rec) {
+ case -1:
+ puts("can't fork");
+ exit(1);
+ case 0:
+ execlp("./receive", "receive", "auxiliary.cpm", (char *) NULL);
+ puts("can't exec receive process");
+ exit(1);
+ }
+ if ((auxin = open("auxin", O_RDONLY | O_NDELAY)) == -1) {
+ perror("pipe auxin");
+ exit(1);
+ }
+ if ((auxout = open("auxout", O_WRONLY)) == -1) {
+ perror("pipe auxout");
+ exit(1);
+ }
+}
+
+/*
+ * This function stops the I/O handlers:
+ *
+ * 1. The files emulating the disk drives are closed.
+ * 2. The file "printer.com" emulating a printer is closed.
+ * 3. The named pipes "auxin" and "auxout" are closed.
+ * 4. The receiving process for the serial port is stopped.
+ */
+void exit_io(void)
+{
+ register int i;
+
+ for (i = 0; i <= 15; i++)
+ if (disks[i].fd != NULL)
+ close(*disks[i].fd);
+ close(printer);
+ close(auxin);
+ close(auxout);
+ kill(pid_rec, SIGHUP);
+}
+
+/*
+ * This function is called for every IN opcode from the
+ * CPU emulation. It calls the right handler for the
+ * port, from which input is wanted.
+ */
+BYTE io_in(BYTE adr)
+{
+ return((*port[adr][0]) ());
+}
+
+/*
+ * This function is called for every OUT opcode from the
+ * CPU emulation. It calls the right handler for the port,
+ * to which output is wanted.
+ */
+BYTE io_out(BYTE adr, BYTE data)
+{
+ (*port[adr][1]) (data);
+ return((BYTE) 0);
+}
+
+/*
+ * I/O trap handler
+ */
+static BYTE io_trap(void)
+{
+ if (i_flag) {
+ cpu_error = IOTRAP;
+ cpu_state = STOPPED;
+ }
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for read console status:
+ * 0xff : input available
+ * 0x00 : no input available
+ */
+static BYTE cons_in(void)
+{
+ register int flags, readed;
+
+ if (last_char)
+ return((BYTE) 0xff);
+ if (cntl_c)
+ return((BYTE) 0xff);
+ if (cntl_bs)
+ return((BYTE) 0xff);
+ else {
+ flags = fcntl(0, F_GETFL, 0);
+ fcntl(0, F_SETFL, flags | O_NDELAY);
+ readed = read(0, &last_char, 1);
+ fcntl(0, F_SETFL, flags);
+ if (readed == 1)
+ return((BYTE) 0xff);
+ }
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for write console status:
+ * no reaction
+ */
+static BYTE cons_out(BYTE data)
+{
+ data = data;
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for read console data:
+ * read one character from the terminal without echo
+ * and character transformations
+ */
+static BYTE cond_in(void)
+{
+ char c;
+
+ aborted:
+ if (last_char) {
+ c = last_char;
+ last_char = '\0';
+ } else if (cntl_c) {
+ cntl_c--;
+ c = 0x03;
+ } else if (cntl_bs) {
+ cntl_bs--;
+ c = 0x1c;
+ } else if (read(0, &c, 1) != 1) {
+ goto aborted;
+ }
+ return((BYTE) c);
+}
+
+/*
+ * I/O handler for write console data:
+ * the output is written to the terminal
+ */
+static BYTE cond_out(BYTE data)
+{
+ while ((write(fileno(stdout), (char *) &data, 1)) != 1)
+ ;
+ fflush(stdout);
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for read printer status:
+ * the printer is ready all the time
+ */
+static BYTE prts_in(void)
+{
+ return((BYTE) 0xff);
+}
+
+/*
+ * I/O handler for write printer status:
+ * no reaction
+ */
+static BYTE prts_out(BYTE data)
+{
+ data = data;
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for read printer data:
+ * always read a 0 from the printer
+ */
+static BYTE prtd_in(void)
+{
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for write printer data:
+ * the output is written to file "printer.cpm"
+ */
+static BYTE prtd_out(BYTE data)
+{
+ if (data != '\r')
+ while ((write(printer, (char *) &data, 1)) != 1)
+ ;
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for read aux status:
+ * return EOF status of the aux device
+ */
+static BYTE auxs_in(void)
+{
+ return((BYTE) aux_in_eof);
+}
+
+/*
+ * I/O handler for write aux status:
+ * change EOF status of the aux device
+ */
+static BYTE auxs_out(BYTE data)
+{
+ aux_in_eof = data;
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for read aux data:
+ * read next byte from pipe "auxin"
+ */
+static BYTE auxd_in(void)
+{
+ char c;
+
+ if (read(auxin, &c, 1) == 1)
+ return((BYTE) c);
+ else {
+ aux_in_eof = 0xff;
+ return((BYTE) 0x1a); /* CP/M EOF */
+ }
+}
+
+/*
+ * I/O handler for write aux data:
+ * write output to pipe "auxout"
+ */
+static BYTE auxd_out(BYTE data)
+{
+ if (data != '\r')
+ write(auxout, (char *) &data, 1);
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for read FDC drive:
+ * return the current drive
+ */
+static BYTE fdcd_in(void)
+{
+ return((BYTE) drive);
+}
+
+/*
+ * I/O handler for write FDC drive:
+ * set the current drive
+ */
+static BYTE fdcd_out(BYTE data)
+{
+ drive = data;
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for read FDC track:
+ * return the current track
+ */
+static BYTE fdct_in(void)
+{
+ return((BYTE) track);
+}
+
+/*
+ * I/O handler for write FDC track:
+ * set the current track
+ */
+static BYTE fdct_out(BYTE data)
+{
+ track = data;
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for read FDC sector
+ * return the current sector
+ */
+static BYTE fdcs_in(void)
+{
+ return((BYTE) sector);
+}
+
+/*
+ * I/O handler for write FDC sector:
+ * set the current sector
+ */
+static BYTE fdcs_out(BYTE data)
+{
+ sector = data;
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for read FDC command:
+ * always returns 0
+ */
+static BYTE fdco_in(void)
+{
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for write FDC command:
+ * transfer one sector in the wanted direction,
+ * 0 = read, 1 = write
+ *
+ * The status byte of the FDC is set as follows:
+ * 0 - ok
+ * 1 - illegal drive
+ * 2 - illegal track
+ * 3 - illegal sector
+ * 4 - seek error
+ * 5 - read error
+ * 6 - write error
+ * 7 - illegal command to FDC
+ */
+static BYTE fdco_out(BYTE data)
+{
+ register long pos;
+ if (disks[drive].fd == NULL) {
+ status = 1;
+ return((BYTE) 0);
+ }
+ if (track > disks[drive].tracks) {
+ status = 2;
+ return((BYTE) 0);
+ }
+ if (sector > disks[drive].sectors) {
+ status = 3;
+ return((BYTE) 0);
+ }
+ pos = (((long)track) * ((long)disks[drive].sectors) + sector - 1) << 7;
+ if (lseek(*disks[drive].fd, pos, 0) == -1L) {
+ status = 4;
+ return((BYTE) 0);
+ }
+ switch (data) {
+ case 0: /* read */
+ if (read(*disks[drive].fd, (char *) ram + (dmadh << 8) +
+ dmadl, 128) != 128)
+ status = 5;
+ else
+ status = 0;
+ break;
+ case 1: /* write */
+ if (write(*disks[drive].fd, (char *) ram + (dmadh << 8) +
+ dmadl, 128) != 128)
+ status = 6;
+ else
+ status = 0;
+ break;
+ default: /* illegal command */
+ status = 7;
+ break;
+ }
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for read FDC status:
+ * returns status of last FDC operation,
+ * 0 = ok, else some error
+ */
+static BYTE fdcx_in(void)
+{
+ return((BYTE) status);
+}
+
+/*
+ * I/O handler for write FDC status:
+ * no reaction
+ */
+static BYTE fdcx_out(BYTE data)
+{
+ data = data;
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for read lower byte of DMA address:
+ * return lower byte of current DMA address
+ */
+static BYTE dmal_in(void)
+{
+ return((BYTE) dmadl);
+}
+
+/*
+ * I/O handler for write lower byte of DMA address:
+ * set lower byte of DMA address
+ */
+static BYTE dmal_out(BYTE data)
+{
+ dmadl = data;
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for read higher byte of DMA address:
+ * return higher byte of current DMA address
+ */
+static BYTE dmah_in(void)
+{
+ return((BYTE) dmadh);
+}
+
+/*
+ * I/O handler for write higher byte of DMA address:
+ * set higher byte of the DMA address
+ */
+static BYTE dmah_out(BYTE data)
+{
+ dmadh = data;
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for read MMU initialization:
+ * return number of initialized MMU banks
+ */
+static BYTE mmui_in(void)
+{
+ return((BYTE) maxbnk);
+}
+
+/*
+ * I/O handler for write MMU initialization:
+ * for the FIRST call the memory for the wanted number of banks
+ * is allocated and pointers to the memory is stored in the MMU array
+ */
+static BYTE mmui_out(BYTE data)
+{
+ register int i;
+
+ if (mmu[0] != NULL)
+ return((BYTE) 0);
+ if (data > MAXSEG) {
+ printf("Try to init %d banks, available %d banks\n",
+ data, MAXSEG);
+ exit(1);
+ }
+ for (i = 0; i < data; i++) {
+ if ((mmu[i] = malloc(SEGSIZ)) == NULL) {
+ printf("can't allocate memory for bank %d\n", i+1);
+ exit(1);
+ }
+ }
+ maxbnk = data;
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for read MMU bank select:
+ * return current selected MMU bank
+ */
+static BYTE mmus_in(void)
+{
+ return((BYTE) selbnk);
+}
+
+/*
+ * I/O handler for write MMU bank select:
+ * if the current selected bank is not equal the wanted bank,
+ * the current bank is saved. Then the memory of the wanted
+ * bank is copied into the CPU address space and this bank is
+ * set to be the current one now.
+ */
+static BYTE mmus_out(BYTE data)
+{
+ if (data > maxbnk) {
+ printf("Try to select unallocated bank %d\n", data);
+ exit(1);
+ }
+ if (data == selbnk)
+ return((BYTE) 0);
+ memcpy(mmu[selbnk], (char *) ram, SEGSIZ);
+ memcpy((char *) ram, mmu[data], SEGSIZ);
+ selbnk = data;
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for read clock command:
+ * return last clock command
+ */
+static BYTE clkc_in(void)
+{
+ return(clkcmd);
+}
+
+/*
+ * I/O handler for write clock command:
+ * set the wanted clock command
+ */
+static BYTE clkc_out(BYTE data)
+{
+ clkcmd = data;
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for read clock data:
+ * dependent from the last clock command the following
+ * informations are given from the system clock:
+ * 0 - seconds in BCD
+ * 1 - minutes in BCD
+ * 2 - hours in BCD
+ * 3 - low byte number of days since 1.1.1978
+ * 4 - high byte number of days since 1.1.1978
+ * for every other clock command a 0 is returned
+ */
+static BYTE clkd_in(void)
+{
+ register struct tm *t;
+ register int val;
+ time_t Time;
+
+ time(&Time);
+ t = localtime(&Time);
+ switch(clkcmd) {
+ case 0: /* seconds in BCD */
+ val = to_bcd(t->tm_sec);
+ break;
+ case 1: /* minutes in BCD */
+ val = to_bcd(t->tm_min);
+ break;
+ case 2: /* hours in BCD */
+ val = to_bcd(t->tm_hour);
+ break;
+ case 3: /* low byte days */
+ val = get_date(t) & 255;
+ break;
+ case 4: /* high byte days */
+ val = get_date(t) >> 8;
+ break;
+ default:
+ val = 0;
+ break;
+ }
+ return((BYTE) val);
+}
+
+/*
+ * I/O handler for write clock data:
+ * under UNIX the system clock only can be set by the
+ * super user, so we do nothing here
+ */
+static BYTE clkd_out(BYTE data)
+{
+ data = data;
+ return((BYTE) 0);
+}
+
+/*
+ * Convert an integer to BCD
+ */
+static int to_bcd(int val)
+{
+ register int i = 0;
+
+ while (val >= 10) {
+ i += val / 10;
+ i <<= 4;
+ val %= 10;
+ }
+ i += val;
+ return (i);
+}
+
+/*
+ * Calculate number of days since 1.1.1978
+ * The Y2K bug here is intentional, CP/M 3 has a Y2K bug fix
+ */
+static int get_date(struct tm *t)
+{
+ register int i;
+ register int val = 0;
+
+ for (i = 1978; i < 1900 + t->tm_year; i++) {
+ val += 365;
+ if (i % 4 == 0)
+ val++;
+ }
+ val += t->tm_yday + 1;
+ return(val);
+}
+
+/*
+ * I/O handler for write timer
+ */
+static BYTE time_out(BYTE data)
+{
+ static struct itimerval tim;
+ static struct sigaction newact;
+
+ if (data == 1) {
+ timer = 1;
+ newact.sa_handler = int_timer;
+ sigaction(SIGALRM, &newact, NULL);
+ tim.it_value.tv_sec = 0;
+ tim.it_value.tv_usec = 20000;
+ tim.it_interval.tv_sec = 0;
+ tim.it_interval.tv_usec = 20000;
+ setitimer(ITIMER_REAL, &tim, NULL);
+ } else {
+ timer = 0;
+ newact.sa_handler = SIG_IGN;
+ sigaction(SIGALRM, &newact, NULL);
+ tim.it_value.tv_sec = 0;
+ tim.it_value.tv_usec = 0;
+ setitimer(ITIMER_REAL, &tim, NULL);
+ }
+ return((BYTE) 0);
+}
+
+/*
+ * I/O handler for read timer
+ */
+static BYTE time_in(void)
+{
+ return(timer);
+}
+
+/*
+ * timer interrupt causes maskerable CPU interrupt
+ */
+static void int_timer(int sig)
+{
+ int_type = INT_INT;
+}
diff --git a/emu/z80pack-1.9/cpmsim/srcsim/lnsrc b/emu/z80pack-1.9/cpmsim/srcsim/lnsrc
new file mode 100755
index 0000000..682dfe4
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srcsim/lnsrc
@@ -0,0 +1,14 @@
+# use this to link the common parts of Z80 simulation
+
+ln ../../z80sim/sim0.c sim0.c
+ln ../../z80sim/sim1.c sim1.c
+ln ../../z80sim/sim2.c sim2.c
+ln ../../z80sim/sim3.c sim3.c
+ln ../../z80sim/sim4.c sim4.c
+ln ../../z80sim/sim5.c sim5.c
+ln ../../z80sim/sim6.c sim6.c
+ln ../../z80sim/sim7.c sim7.c
+ln ../../z80sim/simfun.c simfun.c
+ln ../../z80sim/simint.c simint.c
+ln ../../z80sim/simglb.c simglb.c
+ln ../../z80sim/simglb.h simglb.h
diff --git a/emu/z80pack-1.9/cpmsim/srcsim/sim.h b/emu/z80pack-1.9/cpmsim/srcsim/sim.h
new file mode 100644
index 0000000..48bcbb5
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srcsim/sim.h
@@ -0,0 +1,96 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 28-SEP-87 Develoment on TARGON/35 with AT&T Unix System V.3
+ * 11-JAN-89 Release 1.1
+ * 08-FEB-89 Release 1.2
+ * 13-MAR-89 Release 1.3
+ * 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
+ * 23-DEC-90 Release 1.5 Ported to COHERENT 3.0
+ * 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
+ * and some optimization
+ * 25-JUN-92 Release 1.7 comments in english
+ * 02-OCT-06 Release 1.8 modified to compile on modern POSIX OS's
+ */
+
+/*
+ * The following defines may be activated, commented or modified
+ * by user for her/his own purpose.
+ */
+#define WANT_INT /* interrupt for MP/M */
+/*#define WANT_SPC*/ /* CP/M doesn't work with SP over-/underrun */
+/*#define WANT_PCC*/ /* CP/M doesn't work with PC overrun */
+/*#define CNTL_C*/ /* don't abort simulation with cntl-c */
+#define CNTL_BS /* emergency exit with cntl-\ :-) */
+/*#define CNTL_Z*/ /* don't suspend simulation with cntl-z */
+#define WANT_TIM /* run length measurement needed to adjust CPU speed */
+/*#define HISIZE 1000*//* no history */
+/*#define SBSIZE 10*/ /* no breakpoints */
+
+/*
+ * The following lines of this file should not be modified by user
+ */
+#define COPYR "Copyright (C) 1987-2006 by Udo Munk"
+#define RELEASE "1.9"
+
+#define LENCMD 80 /* length of command buffers etc */
+
+#define S_FLAG 128 /* bit definitions of CPU flags */
+#define Z_FLAG 64
+#define N2_FLAG 32
+#define H_FLAG 16
+#define N1_FLAG 8
+#define P_FLAG 4
+#define N_FLAG 2
+#define C_FLAG 1
+
+ /* operation of simulated CPU */
+#define SINGLE_STEP 0 /* single step */
+#define CONTIN_RUN 1 /* continual run */
+#define STOPPED 0 /* stop CPU because of error */
+
+ /* causes of error */
+#define NONE 0 /* no error */
+#define OPHALT 1 /* HALT op-code trap */
+#define IOTRAP 2 /* IN/OUT trap */
+#define OPTRAP1 3 /* illegal 1 byte op-code trap */
+#define OPTRAP2 4 /* illegal 2 byte op-code trap */
+#define OPTRAP4 5 /* illegal 4 byte op-code trap */
+#define USERINT 6 /* user interrupt */
+
+ /* type of CPU interrupt */
+#define INT_NONE 0
+#define INT_NMI 1 /* non maskable interrupt */
+#define INT_INT 2 /* maskable interrupt */
+
+typedef unsigned short WORD; /* 16 bit unsigned */
+typedef unsigned char BYTE; /* 8 bit unsigned */
+
+#ifdef HISIZE
+struct history { /* structure of a history entry */
+ WORD h_adr; /* address of execution */
+ WORD h_af; /* register AF */
+ WORD h_bc; /* register BC */
+ WORD h_de; /* register DE */
+ WORD h_hl; /* register HL */
+ WORD h_ix; /* register IX */
+ WORD h_iy; /* register IY */
+ WORD h_sp; /* register SP */
+};
+#endif
+
+#ifdef SBSIZE
+struct softbreak { /* structure of a breakpoint */
+ WORD sb_adr; /* address of breakpoint */
+ BYTE sb_oldopc; /* op-code at address of breakpoint */
+ int sb_passcount; /* pass counter of breakpoint */
+ int sb_pass; /* no. of pass to break */
+};
+#endif
+
+#ifndef isxdigit
+#define isxdigit(c) ((c<='f'&&c>='a')||(c<='F'&&c>='A')||(c<='9'&&c>='0'))
+#endif
diff --git a/emu/z80pack-1.9/cpmsim/srcsim/simctl.c b/emu/z80pack-1.9/cpmsim/srcsim/simctl.c
new file mode 100644
index 0000000..d5d12b4
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srcsim/simctl.c
@@ -0,0 +1,92 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
+ * 14-MAR-89 new option -l
+ * 23-DEC-90 Ported to COHERENT 3.0
+ * 06-OCT-06 modified to compile on modern POSIX OS's
+ */
+
+#include
+#include
+#include
+#include
+#include "sim.h"
+#include "simglb.h"
+
+extern void cpu(void);
+
+struct termios old_term, new_term;
+
+/*
+ * This function gets the CP/M boot sector from first track/sector
+ * of disk drive A (file drivea.cpm) into memory started at 0.
+ * Then the Z80 CPU emulation is started and the system should boot.
+ */
+void mon(void)
+{
+ register int fd;
+
+ if (!l_flag) {
+ if ((fd = open("disks/drivea.cpm", O_RDONLY)) == -1) {
+ perror("file disks/drivea.cpm");
+ return;
+ }
+ if (read(fd, (char *) ram, 128) != 128) {
+ perror("file disks/drivea.cpm");
+ return;
+ }
+ close(fd);
+ }
+
+ tcgetattr(0, &old_term);
+ new_term = old_term;
+ new_term.c_lflag &= ~(ICANON | ECHO);
+ new_term.c_iflag &= ~(IXON | IXANY | IXOFF);
+ new_term.c_iflag &= ~(IGNCR | ICRNL | INLCR);
+ new_term.c_cc[VMIN] = 1;
+#ifndef CNTL_Z
+ new_term.c_cc[VSUSP] = 0;
+#endif
+ tcsetattr(0, TCSADRAIN, &new_term);
+
+ cpu_state = CONTIN_RUN;
+ cpu_error = NONE;
+ cpu();
+
+ tcsetattr(0, TCSADRAIN, &old_term);
+
+ switch (cpu_error) {
+ case NONE:
+ break;
+ case OPHALT:
+ printf("\nHALT Op-Code reached at %04x\n",
+ (unsigned int)(PC - ram - 1));
+ break;
+ case IOTRAP:
+ printf("\nI/O Trap at %04x\n", (unsigned int)(PC - ram));
+ break;
+ case OPTRAP1:
+ printf("\nOp-code trap at %04x %02x\n",
+ (unsigned int)(PC - 1 - ram), *(PC - 1));
+ break;
+ case OPTRAP2:
+ printf("\nOp-code trap at %04x %02x %02x\n",
+ (unsigned int)(PC - 2 - ram), *(PC - 2), *(PC - 1));
+ break;
+ case OPTRAP4:
+ printf("\nOp-code trap at %04x %02x %02x %02x %02x\n",
+ (unsigned int)(PC - 4 - ram), *(PC - 4), *(PC - 3),
+ *(PC - 2), *(PC - 1));
+ break;
+ case USERINT:
+ puts("\nUser Interrupt");
+ break;
+ default:
+ printf("\nUnknown error %d\n", cpu_error);
+ break;
+ }
+}
diff --git a/emu/z80pack-1.9/cpmsim/srcsim/ulnsrc b/emu/z80pack-1.9/cpmsim/srcsim/ulnsrc
new file mode 100755
index 0000000..fcbc250
--- /dev/null
+++ b/emu/z80pack-1.9/cpmsim/srcsim/ulnsrc
@@ -0,0 +1,6 @@
+# use this to unlink the common parts of Z80 simulation
+
+rm sim[0-7].c
+rm simfun.c
+rm simint.c
+rm simglb.[hc]
diff --git a/emu/z80pack-1.9/doc/COPYING b/emu/z80pack-1.9/doc/COPYING
new file mode 100644
index 0000000..71b3b85
--- /dev/null
+++ b/emu/z80pack-1.9/doc/COPYING
@@ -0,0 +1,22 @@
+Copyright (c) 1987-2006 Udo Munk
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/emu/z80pack-1.9/doc/README-asm.txt b/emu/z80pack-1.9/doc/README-asm.txt
new file mode 100644
index 0000000..705e13e
--- /dev/null
+++ b/emu/z80pack-1.9/doc/README-asm.txt
@@ -0,0 +1,85 @@
+Usage:
+
+z80asm -ofile -f[b|m|h] -l[file] -s[n|a] -x -v -dsymbol ... file ...
+
+A maximum of 512 source files is allowed. If the filename of a source
+doesn't have an extension the default extension ".asm" will be
+concated. Source file names may have a path, the maximum length of
+a full qualified filename is 2048 characters.
+For relative paths the extension must be used, because all characters
+after a "." would be used as extension!
+
+Option o:
+To override the default name of the output file. Without this option
+the name of the output file becomes the name of the input file,
+but with the extension ".bin". The output file may have a path,
+the maximum length is limited to 2048 characters.
+
+Option f:
+Format of the output file:
+
+ -fb -> binary file
+ -fm -> binary file with Mostek header
+ -fh -> Intel hex
+
+Option l:
+Without this option no list file will be generated. With -l a list
+file with the name of the source file but extension ".lis" will be
+generated. An optional file name with path (2048 characters maximum)
+may be added to this option.
+
+Option s:
+This option writes the unsorted symbol table (-s), sorted by name (-sn)
+or sorted by address (-sa) into the list file. This option only works
+together with option -l.
+
+Option x:
+Don't output data in pass 2 into object file for DEFS. This only works
+if unallocated data isn't followed by any code or initialized data!
+Usefull for CP/M BIOS's, where unallocated data doesn't need to be
+part of the system image, if the complete image won't fit on the system
+tracks.
+
+Option v:
+Verbose operation of the assembler.
+
+Option d:
+This option predefines symbols with a value of 0.
+The number of this option is not limited in the command line.
+
+Pseudo Operations:
+
+Definition of symbols and allocation of memory:
+
+ ORG - set program address
+ EQU - define constant symbol
+ DEFL - define variable symbol
+ DEFB - write bytes in memory
+ DEFW - write words (16 bits) in memory
+ DEFM <'string'> - write character string in memory
+ DEFS - reserve space in memory
+
+
+Conditional assembly:
+
+IFDEF - assemble if symbol defined
+IFNDEF - assemble if symbol not defined
+IFEQ - assemble if equal
+IFNEQ - assemble if not equal
+ELSE - else for all conditionals
+ENDIF - end of conditional assembly
+
+
+Manipulation of list file:
+
+PAGE - number of lines/page
+EJECT - skip to new page
+LIST - listing on
+NOLIST - listing off
+TITLE <'string'> - define title for page header
+
+
+Others:
+
+INCLUDE - include another source file
+PRINT <'string'> - print string to stdout in pass one
diff --git a/emu/z80pack-1.9/doc/README-cpm2.txt b/emu/z80pack-1.9/doc/README-cpm2.txt
new file mode 100644
index 0000000..6b8cb5b
--- /dev/null
+++ b/emu/z80pack-1.9/doc/README-cpm2.txt
@@ -0,0 +1,54 @@
+ Quickstart to run CP/M and MP/M on the Z80-CPU simulation
+
+1. Change to directory ~/z80pack/cpmsim/srcsim
+ make
+ make clean
+This compiles the CPU and hardware emulation needed to run CP/M and MP/M.
+
+2. Change to directory ~/z80pack/cpmsim/srccpm2
+ make
+ make clean
+This compiles support programs (see below), installs named pipes and so on.
+
+3. Make backup copies of your distribution disks!
+ cd ~/z80pack/cpmsim/disks/library
+ cp *.dsk ../backups
+
+4. Change to directory ~/z80pack/cpmsim
+ cpm2 - run CP/M 2.2
+ cpm3 - run CP/M 3.0
+ mpm - this boots CP/M 2, run command mpm to boot MP/M 2
+
+Usage of the support programs:
+
+format: to create an empty disk image for the CP/M simulation.
+ input: format
+ output: in directory disks files drivea.cpm, driveb.cpm,
+ drivec.cpm, drived.cpm, drivei.cpm and drivej.cpm
+
+bin2hex:converts binary files to Intel hex.
+
+receive:This is a process spawned by cpmsim. It reads from the named
+ pipe auxout and writes all input from the pipe to the file,
+ which is given as first argument. cpmsim spawns this process
+ with the output filename auxiliary.cpm. Inside the simulator
+ this pipe is connected to I/O-port 5, which is assigned
+ to the CP/M device PUN:. So everything you write from CP/M
+ to device PUN: goes into the file auxiliary.cpm on the
+ UNIX host.
+
+send: This process is to send a file from the UNIX host to the
+ simulator. Type send &, and then run cpmsim.
+ The process writes all data from file into the named pipe
+ auxin, which is also connected to I/O-port 5, which is
+ assigned to the CP/M device RDR:. You may use this to
+ transfer a file from the UNIX host to the simulator.
+ Under CP/M type pip file=RDR: to read the data send from
+ the process on the UNIX host.
+
+If you use PIP to transfer files between the UNIX host and the
+simulator, you can only use ASCII files, because pip uses cntl-z
+for EOF! To transfer a binary file from the UNIX host to the
+simulator convert it to Intel hex format with bin2hex. This
+can be converted back to a binary file under CP/M with the LOAD
+command.
diff --git a/emu/z80pack-1.9/doc/z80-documented.pdf b/emu/z80pack-1.9/doc/z80-documented.pdf
new file mode 100644
index 0000000..3db25eb
Binary files /dev/null and b/emu/z80pack-1.9/doc/z80-documented.pdf differ
diff --git a/emu/z80pack-1.9/z80asm/Makefile b/emu/z80pack-1.9/z80asm/Makefile
new file mode 100644
index 0000000..106e3b1
--- /dev/null
+++ b/emu/z80pack-1.9/z80asm/Makefile
@@ -0,0 +1,41 @@
+CFLAGS = -c -O
+LFLAGS = -s
+
+OBJ = z80amain.o \
+ z80atab.o \
+ z80anum.o \
+ z80aout.o \
+ z80arfun.o \
+ z80apfun.o \
+ z80aopc.o \
+ z80aglb.o
+
+z80asm : $(OBJ)
+ cc $(OBJ) $(LFLAGS) -o z80asm
+
+z80amain.o : z80amain.c z80a.h z80aglb.h
+ cc $(CFLAGS) z80amain.c
+
+z80atab.o : z80atab.c z80a.h z80aglb.h
+ cc $(CFLAGS) z80atab.c
+
+z80anum.o : z80anum.c z80a.h z80aglb.h
+ cc $(CFLAGS) z80anum.c
+
+z80aout.o : z80aout.c z80a.h z80aglb.h
+ cc $(CFLAGS) z80aout.c
+
+z80arfun.o : z80arfun.c z80a.h z80aglb.h
+ cc $(CFLAGS) z80arfun.c
+
+z80apfun.o : z80apfun.c z80a.h z80aglb.h
+ cc $(CFLAGS) z80apfun.c
+
+z80aopc.o : z80aopc.c z80a.h
+ cc $(CFLAGS) z80aopc.c
+
+z80aglb.o : z80aglb.c z80a.h
+ cc $(CFLAGS) z80aglb.c
+
+clean:
+ rm -f core *.o z80asm
diff --git a/emu/z80pack-1.9/z80asm/z80a.h b/emu/z80pack-1.9/z80asm/z80a.h
new file mode 100644
index 0000000..48c46fa
--- /dev/null
+++ b/emu/z80pack-1.9/z80asm/z80a.h
@@ -0,0 +1,144 @@
+/*
+ * Z80 - Assembler
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 17-SEP-1987 Development under Digital Research CP/M 2.2
+ * 28-JUN-1988 Switched to Unix System V.3
+ * 21-OCT-2006 changed to ANSI C for modern POSIX OS's
+ */
+
+/*
+ * OS dependant definitions
+ */
+#define LENFN 2048 /* max. filename length */
+#define READA "r" /* file open mode read ascii */
+#define WRITEA "w" /* file open mode write ascii */
+#define WRITEB "w" /* file open mode write binary */
+
+/*
+ * various constants
+ */
+#define REL "1.3"
+#define COPYR "Copyright (C) 1987-2006 by Udo Munk"
+#define SRCEXT ".asm" /* filenamen extension source */
+#define OBJEXT ".bin" /* filenamen extension object */
+#define LSTEXT ".lis" /* filenamen extension listing */
+#define OUTBIN 1 /* format of object: binary */
+#define OUTMOS 2 /* Mostek binaer */
+#define OUTHEX 3 /* Intel hex */
+#define OUTDEF OUTMOS /* default object format */
+#define COMMENT ';' /* inline comment character */
+#define LINCOM '*' /* comment line if in columne 1 */
+#define LABSEP ':' /* label separator */
+#define STRSEP '\'' /* string separator */
+#define ENDFILE "END" /* end of source */
+#define MAXFN 512 /* max. no. source files */
+#define MAXLINE 128 /* max. line length source */
+#define PLENGTH 65 /* default lines/page in listing */
+#define SYMSIZE 8 /* max. symbol length */
+#define INCNEST 5 /* max. INCLUDE nesting depth */
+#define IFNEST 5 /* max IF.. nesting depth */
+#define HASHSIZE 500 /* max. entries in symbol hash array */
+#define OPCARRAY 256 /* size of object buffer */
+#define SYMINC 100 /* start size of sorted symbol array */
+
+/*
+ * structure opcode table
+ */
+struct opc {
+ char *op_name; /* opcode name */
+ int (*op_fun) (); /* function pointer code generation */
+ int op_c1; /* first base opcode*/
+ int op_c2; /* second base opcode */
+};
+
+/*
+ * structure operand table
+ */
+struct ope {
+ char *ope_name; /* operand name */
+ int ope_sym; /* symbol value operand */
+};
+
+/*
+ * structure symbol table entries
+ */
+struct sym {
+ char *sym_name; /* symbol name */
+ int sym_wert; /* symbol value */
+ struct sym *sym_next; /* next entry */
+};
+
+/*
+ * structure nested INCLUDE's
+ */
+struct inc {
+ unsigned inc_line; /* line counter for listing */
+ char *inc_fn; /* filename */
+ FILE *inc_fp; /* file pointer */
+};
+
+/*
+ * definition of operand symbols
+ * definitions for registers A, B, C, D, H, L and (HL)
+ * are defined as the bits used in operands and may not
+ * be changed!
+ */
+#define REGB 0 /* register B */
+#define REGC 1 /* register C */
+#define REGD 2 /* register D */
+#define REGE 3 /* register E */
+#define REGH 4 /* register H */
+#define REGL 5 /* register L */
+#define REGIHL 6 /* register indirect HL */
+#define REGA 7 /* register A */
+#define REGI 8 /* register I */
+#define REGR 9 /* register R */
+#define REGAF 10 /* register pair AF */
+#define REGBC 11 /* register pair BC */
+#define REGDE 12 /* register pair DE */
+#define REGHL 13 /* register pair HL */
+#define REGIX 14 /* register IX */
+#define REGIY 15 /* register IY */
+#define REGSP 16 /* register SP */
+#define REGIBC 17 /* register indirect BC */
+#define REGIDE 18 /* register indirect DE */
+#define REGIIX 19 /* register indirect IX */
+#define REGIIY 20 /* register indirect IY */
+#define REGISP 21 /* register indirect SP */
+#define FLGNC 30 /* flag no carry */
+#define FLGNZ 31 /* flag not zerro */
+#define FLGZ 32 /* flag zerro */
+#define FLGM 33 /* flag minus */
+#define FLGP 34 /* flag plus */
+#define FLGPE 35 /* flag parrity even */
+#define FLGPO 36 /* flag parrity odd */
+#define NOOPERA 98 /* no operand */
+#define NOREG 99 /* operand isn't register */
+
+/*
+ * definitions of error numbers for error messages in listfile
+ */
+#define E_ILLOPC 0 /* illegal opcode */
+#define E_ILLOPE 1 /* illegal operand */
+#define E_MISOPE 2 /* missing operand */
+#define E_MULSYM 3 /* multiple defined symbol */
+#define E_UNDSYM 4 /* undefined symbol */
+#define E_VALOUT 5 /* value out of bounds */
+#define E_MISPAR 6 /* missing parren */
+#define E_MISHYP 7 /* missing string separator */
+#define E_MEMOVR 8 /* memory override (ORG) */
+#define E_MISIFF 9 /* missing IF at ELSE or ENDIF */
+#define E_IFNEST 10 /* to many IF's nested */
+#define E_MISEIF 11 /* missing ENDIF */
+#define E_INCNEST 12 /* to many INCLUDE's nested */
+
+/*
+ * definition fatal errors
+ */
+#define F_OUTMEM 0 /* out of memory */
+#define F_USAGE 1 /* usage: .... */
+#define F_HALT 2 /* assembly halted */
+#define F_FOPEN 3 /* can't open file */
+#define F_INTERN 4 /* internal error */
diff --git a/emu/z80pack-1.9/z80asm/z80aglb.c b/emu/z80pack-1.9/z80asm/z80aglb.c
new file mode 100644
index 0000000..1021feb
--- /dev/null
+++ b/emu/z80pack-1.9/z80asm/z80aglb.c
@@ -0,0 +1,67 @@
+/*
+ * Z80 - Assembler
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 17-SEP-1987 Development under Digital Research CP/M 2.2
+ * 28-JUN-1988 Switched to Unix System V.3
+ * 21-OCT-2006 changed to ANSI C for modern POSIX OS's
+ */
+
+/*
+ * this module contains all global variables other
+ * than CPU specific tables
+ */
+
+#include
+#include "z80a.h"
+
+char *infiles[MAXFN], /* source filenames */
+ objfn[LENFN + 1], /* object filename */
+ lstfn[LENFN + 1], /* listing filename */
+ *srcfn, /* filename of current processed source file */
+ line[MAXLINE], /* buffer for one line souce */
+ tmp[MAXLINE], /* temporary buffer */
+ label[SYMSIZE+1], /* buffer for label */
+ opcode[MAXLINE], /* buffer for opcode */
+ operand[MAXLINE], /* buffer for operand */
+ ops[OPCARRAY], /* buffer for generated object code */
+ title[MAXLINE]; /* buffer for titel of souce */
+
+int list_flag, /* flag for option -l */
+ sym_flag, /* flag for option -s */
+ ver_flag, /* flag for option -v */
+ dump_flag, /* flag for option -x */
+ pc, /* programm counter */
+ pass, /* processed pass */
+ iflevel, /* IF nesting level */
+ gencode = 1, /* flag for conditional object code */
+ errors, /* error counter */
+ errnum, /* error number in pass 2 */
+ sd_flag, /* list flag for PSEUDO opcodes */
+ /* = 0: address from , data from */
+ /* = 1: address from , data from */
+ /* = 2: no address, data from */
+ /* = 3: address from , no data */
+ /* = 4: suppress whole line */
+ sd_val, /* output value for PSEUDO opcodes */
+ prg_adr, /* start address of programm */
+ prg_flag, /* flag for prg_adr valid */
+ out_form = OUTDEF, /* format of object file */
+ symsize; /* size of symarray */
+
+FILE *srcfp, /* file pointer for current source */
+ *objfp, /* file pointer for object code */
+ *lstfp, /* file pointer for listing */
+ *errfp; /* file pointer for error output */
+
+unsigned
+ c_line, /* current line no. in current source */
+ s_line, /* line no. counter for listing */
+ p_line, /* no. printed lines on page */
+ ppl = PLENGTH, /* page length */
+ page; /* no. of pages for listing */
+
+struct sym
+ *symtab[HASHSIZE], /* symbol table */
+ **symarray; /* sorted symbol table */
diff --git a/emu/z80pack-1.9/z80asm/z80aglb.h b/emu/z80pack-1.9/z80asm/z80aglb.h
new file mode 100644
index 0000000..7f92cbe
--- /dev/null
+++ b/emu/z80pack-1.9/z80asm/z80aglb.h
@@ -0,0 +1,62 @@
+/*
+ * Z80 - Assembler
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 17-SEP-1987 Development under Digital Research CP/M 2.2
+ * 28-JUN-1988 Switched to Unix System V.3
+ * 21-OCT-2006 changed to ANSI C for modern POSIX OS's
+ */
+
+/*
+ * global variable declarations
+ */
+
+extern char *infiles[],
+ objfn[],
+ lstfn[],
+ *srcfn,
+ line[],
+ tmp[],
+ label[],
+ opcode[],
+ operand[],
+ ops[],
+ title[];
+
+extern int list_flag,
+ sym_flag,
+ ver_flag,
+ dump_flag,
+ pc,
+ pass,
+ iflevel,
+ gencode,
+ errors,
+ errnum,
+ sd_flag,
+ sd_val,
+ prg_adr,
+ prg_flag,
+ out_form,
+ symsize,
+ no_opcodes,
+ no_operands;
+
+extern FILE *srcfp,
+ *objfp,
+ *lstfp,
+ *errfp;
+
+extern unsigned c_line,
+ s_line,
+ p_line,
+ ppl,
+ page;
+
+extern struct sym *symtab[],
+ **symarray;
+
+extern struct opc opctab[];
+
+extern struct ope opetab[];
diff --git a/emu/z80pack-1.9/z80asm/z80amain.c b/emu/z80pack-1.9/z80asm/z80amain.c
new file mode 100644
index 0000000..7ea3230
--- /dev/null
+++ b/emu/z80pack-1.9/z80asm/z80amain.c
@@ -0,0 +1,503 @@
+/*
+ * Z80 - Assembler
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 17-SEP-1987 Development under Digital Research CP/M 2.2
+ * 28-JUN-1988 Switched to Unix System V.3
+ * 21-OCT-2006 changed to ANSI C for modern POSIX OS's
+ */
+
+/*
+ * main module, handles the options and runs 2 passes over the sources
+ */
+
+#include
+#include
+#include
+#include "z80a.h"
+#include "z80aglb.h"
+
+void init(void), options(int, char *[]);
+void usage(void), fatal(int, char *);
+void pass1(void), p1_file(char *);
+void pass2(void), p2_file(char *);
+void open_o_files(char *), get_fn(char *, char *, char *);
+char *get_label(char *, char *);
+char *get_opcode(char *, char *);
+char *get_arg(char *, char *);
+
+extern void asmerr(int);
+extern void lst_line(int, int);
+extern void lst_sym(void);
+extern void lst_sort_sym(int);
+extern void obj_header(void);
+extern void obj_end(void);
+extern void obj_writeb(int);
+extern struct opc *search_op(char *);
+extern int put_sym(char *, int);
+extern void put_label(void);
+extern int copy_sym(void);
+extern void n_sort_sym(int);
+extern void a_sort_sym(int);
+
+static char *errmsg[] = { /* error messages for fatal() */
+ "out of memory: %s", /* 0 */
+ "usage: z80asm -ofile -f[b|m|h] -l[file] -s[n|a] {-x} -v -dsymbol ... file ...",
+ "Assembly halted", /* 2 */
+ "can't open file %s", /* 3 */
+ "internal error: %s" /* 4 */
+};
+
+main(int argc, char *argv[])
+{
+ int len;
+
+ init();
+ options(argc, argv);
+ printf("Z80 - Assembler Release %s, %s\n", REL, COPYR);
+ pass1();
+ pass2();
+ if (list_flag) {
+ switch (sym_flag) {
+ case 0: /* no symbol table */
+ break;
+ case 1: /* unsorted symbol table */
+ lst_sym();
+ break;
+ case 2: /* symbol table sorted by name */
+ len = copy_sym();
+ n_sort_sym(len);
+ lst_sort_sym(len);
+ break;
+ case 3: /* symbol table sorted by address */
+ len = copy_sym();
+ a_sort_sym(len);
+ lst_sort_sym(len);
+ break;
+ default:
+ break;
+ }
+ fclose(lstfp);
+ }
+ return(errors);
+}
+
+/*
+ * initialization
+ */
+void init(void)
+{
+ errfp = stdout;
+}
+
+/*
+ * process options
+ */
+void options(int argc, char *argv[])
+{
+ register char *s, *t;
+ register int i;
+
+ while (--argc > 0 && (*++argv)[0] == '-')
+ for (s = argv[0]+1; *s != '\0'; s++)
+ switch (*s) {
+ case 'o':
+ case 'O':
+ if (*++s == '\0') {
+ puts("name missing in option -o");
+ usage();
+ }
+ get_fn(objfn, s, OBJEXT);
+ s += (strlen(s) - 1);
+ break;
+ case 'l':
+ case 'L':
+ if (*(s + 1) != '\0') {
+ get_fn(lstfn, ++s, LSTEXT);
+ s += (strlen(s) - 1);
+ }
+ list_flag = 1;
+ break;
+ case 's':
+ case 'S':
+ if (*(s + 1) == '\0')
+ sym_flag = 1;
+ else if ((*(s + 1) == 'n') || (*(s + 1) == 'N'))
+ sym_flag = 2;
+ else if ((*(s + 1) == 'a') || (*(s + 1) == 'A'))
+ sym_flag = 3;
+ else {
+ printf("unknown option -%s\n", s);
+ usage();
+ }
+ s += (strlen(s) - 1);
+ break;
+ case 'x':
+ case 'X':
+ dump_flag = 1;
+ break;
+ case 'f':
+ case 'F':
+ if ((*(s + 1) == 'b') || (*(s + 1) == 'B'))
+ out_form = OUTBIN;
+ else if ((*(s + 1) == 'm') || (*(s + 1) == 'M'))
+ out_form = OUTMOS;
+ else if ((*(s + 1) == 'h') || (*(s + 1) == 'H'))
+ out_form = OUTHEX;
+ else {
+ printf("unknown option -%s\n", s);
+ usage();
+ }
+ s += (strlen(s) - 1);
+ break;
+ case 'd':
+ case 'D':
+ if (*++s == '\0') {
+ puts("name missing in option -d");
+ usage();
+ }
+ t = tmp;
+ while (*s)
+ *t++ = islower(*s) ? toupper(*s++)
+ : *s++;
+ s--;
+ *t = '\0';
+ if (put_sym(tmp, 0))
+ fatal(F_OUTMEM, "symbols");
+ break;
+ case 'v':
+ case 'V':
+ ver_flag = 1;
+ break;
+ default :
+ printf("unknown option %c\n", *s);
+ usage();
+ }
+ i = 0;
+ while ((argc--) && (i < MAXFN)) {
+ if ((infiles[i] = malloc(LENFN + 1)) == NULL)
+ fatal(F_OUTMEM, "filenames");
+ get_fn(infiles[i], *argv++, SRCEXT);
+ i++;
+ }
+ if (i == 0) {
+ printf("no input file given\n");
+ usage();
+ }
+}
+
+/*
+ * error in options, print usage
+ */
+void usage(void)
+{
+ fatal(F_USAGE, NULL);
+}
+
+/*
+ * print error messages and abort
+ */
+void fatal(int i, char *arg)
+{
+ printf(errmsg[i], arg);
+ putchar('\n');
+ exit(1);
+}
+
+/*
+ * Pass 1:
+ * - process all source files
+ */
+void pass1(void)
+{
+ register int fi;
+
+ pass = 1;
+ pc = 0;
+ fi = 0;
+ if (!ver_flag)
+ puts("Pass 1");
+ open_o_files(infiles[fi]);
+ while (infiles[fi] != NULL) {
+ if (!ver_flag)
+ printf(" Read %s\n", infiles[fi]);
+ p1_file(infiles[fi]);
+ fi++;
+ }
+ if (errors) {
+ fclose(objfp);
+ unlink(objfn);
+ printf("%d error(s)\n", errors);
+ fatal(F_HALT, NULL);
+ }
+}
+
+/*
+ * Pass 1:
+ * - process one source file
+ *
+ * Input: name of source file
+ */
+void p1_file(char *fn)
+{
+ c_line = 0;
+ srcfn = fn;
+ if ((srcfp = fopen(fn, READA)) == NULL)
+ fatal(F_FOPEN, fn);
+ while (p1_line())
+ ;
+ fclose(srcfp);
+ if (iflevel)
+ asmerr(E_MISEIF);
+}
+
+/*
+ * Pass 1:
+ * - process one line of source
+ *
+ * Output: 1 line processed
+ * 0 EOF
+ */
+int p1_line(void)
+{
+ register char *p;
+ register int i;
+ register struct opc *op;
+
+ if ((p = fgets(line, MAXLINE, srcfp)) == NULL)
+ return(0);
+ c_line++;
+ p = get_label(label, p);
+ p = get_opcode(opcode, p);
+ p = get_arg(operand, p);
+ if (strcmp(opcode, ENDFILE) == 0)
+ return(0);
+ if (*opcode) {
+ if ((op = search_op(opcode)) != NULL) {
+ i = (*op->op_fun)(op->op_c1, op->op_c2);
+ if (gencode)
+ pc += i;
+ } else
+ asmerr(E_ILLOPC);
+ } else
+ if (*label)
+ put_label();
+ return(1);
+}
+
+/*
+ * Pass 2:
+ * - process all source files
+ */
+void pass2(void)
+{
+ register int fi;
+
+ pass = 2;
+ pc = 0;
+ fi = 0;
+ if (!ver_flag)
+ puts("Pass 2");
+ obj_header();
+ while (infiles[fi] != NULL) {
+ if (!ver_flag)
+ printf(" Read %s\n", infiles[fi]);
+ p2_file(infiles[fi]);
+ fi++;
+ }
+ obj_end();
+ fclose(objfp);
+ printf("%d error(s)\n", errors);
+}
+
+/*
+ * Pass 2:
+ * - process one source file
+ *
+ * Input: name of source file
+ */
+void p2_file(char *fn)
+{
+ c_line = 0;
+ srcfn = fn;
+ if ((srcfp = fopen(fn, READA)) == NULL)
+ fatal(F_FOPEN, fn);
+ while (p2_line())
+ ;
+ fclose(srcfp);
+}
+
+/*
+ * Pass 2:
+ * - process one line of source
+ *
+ * Output: 1 line processed
+ * 0 EOF
+ */
+int p2_line(void)
+{
+ register char *p;
+ register int op_count;
+ register struct opc *op;
+
+ if ((p = fgets(line, MAXLINE, srcfp)) == NULL)
+ return(0);
+ c_line++;
+ s_line++;
+ p = get_label(label, p);
+ p = get_opcode(opcode, p);
+ p = get_arg(operand, p);
+ if (strcmp(opcode, ENDFILE) == 0) {
+ lst_line(pc, 0);
+ return(0);
+ }
+ if (*opcode) {
+ op = search_op(opcode);
+ op_count = (*op->op_fun)(op->op_c1, op->op_c2);
+ if (gencode) {
+ lst_line(pc, op_count);
+ obj_writeb(op_count);
+ pc += op_count;
+ } else {
+ sd_flag = 2;
+ lst_line(0, 0);
+ }
+ } else {
+ sd_flag = 2;
+ lst_line(0, 0);
+ }
+ return(1);
+}
+
+/*
+ * open output files:
+ * input is filename of source file
+ * list and object filenames are build from source filename if
+ * not given by options
+ */
+void open_o_files(char *source)
+{
+ register char *p;
+
+ if (*objfn == '\0')
+ strcpy(objfn, source);
+ if ((p = strrchr(objfn, '.')) != NULL)
+ strcpy(p, OBJEXT);
+ else
+ strcat(objfn, OBJEXT);
+
+ if (out_form == OUTHEX)
+ objfp = fopen(objfn, WRITEA);
+ else
+ objfp = fopen(objfn, WRITEB);
+ if (objfp == NULL)
+ fatal(F_FOPEN, objfn);
+ if (list_flag) {
+ if (*lstfn == '\0')
+ strcpy(lstfn, source);
+ if ((p = strrchr(lstfn, '.')) != NULL)
+ strcpy(p, LSTEXT);
+ else
+ strcat(lstfn, LSTEXT);
+ if ((lstfp = fopen(lstfn, WRITEA)) == NULL)
+ fatal(F_FOPEN, lstfn);
+ errfp = lstfp;
+ }
+}
+
+/*
+ * create a filename in "dest" from "src" and "ext"
+ */
+void get_fn(char *dest, char *src, char *ext)
+{
+ register int i;
+ register char *sp, *dp;
+
+ i = 0;
+ sp = src;
+ dp = dest;
+ while ((i++ < LENFN) && (*sp != '\0'))
+ *dp++ = *sp++;
+ *dp = '\0';
+ if ((strrchr(dest,'.') == NULL) &&
+ (strlen(dest) <= (LENFN - strlen(ext))))
+ strcat(dest, ext);
+}
+
+/*
+ * get labels, constants and variables from source line
+ * convert names to upper case and truncate length of name
+ */
+char *get_label(char *s, char *l)
+{
+ register int i;
+
+ i = 0;
+ if (*l == LINCOM)
+ goto comment;
+ while (!isspace(*l) && *l != COMMENT && *l != LABSEP && i < SYMSIZE) {
+ *s++ = islower(*l) ? toupper(*l++) : *l++;
+ i++;
+ }
+comment:
+ *s = '\0';
+ return(l);
+}
+
+/*
+ * get opcode into s from source line l
+ * converts to uper case
+ */
+char *get_opcode(char *s, char *l)
+{
+ if (*l == LINCOM)
+ goto comment;
+ while (!isspace(*l) && *l != COMMENT && *l != LABSEP)
+ l++;
+ if (*l == LABSEP)
+ l++;
+ while (*l == ' ' || *l == '\t')
+ l++;
+ while (!isspace(*l) && *l != COMMENT)
+ *s++ = islower(*l) ? toupper(*l++) : *l++;
+comment:
+ *s = '\0';
+ return(l);
+}
+
+/*
+ * get operand into s from source line l
+ * converts to upper case
+ * strings inside of 's are copied without changes
+ */
+char *get_arg(char *s, char *l)
+{
+ if (*l == LINCOM)
+ goto comment;
+ while (*l == ' ' || *l == '\t')
+ l++;
+ while (*l != '\n' && *l != COMMENT) {
+ if (isspace(*l)) {
+ l++;
+ continue;
+ }
+ if (*l != STRSEP) {
+ *s++ = islower(*l) ? toupper(*l) : *l;
+ l++;
+ continue;
+ }
+ *s++ = *l++;
+ if (*(s - 2) == 'F') /* EX AF,AF' !!!!! */
+ continue;
+ while (*l != STRSEP) {
+ if (*l == '\n' || *l == '\0' || *l == COMMENT)
+ goto comment;
+ *s++ = *l++;
+ }
+ *s++ = *l++;
+ }
+comment:
+ *s = '\0';
+ return(l);
+}
diff --git a/emu/z80pack-1.9/z80asm/z80anum.c b/emu/z80pack-1.9/z80asm/z80anum.c
new file mode 100644
index 0000000..d836915
--- /dev/null
+++ b/emu/z80pack-1.9/z80asm/z80anum.c
@@ -0,0 +1,309 @@
+/*
+ * Z80 - Assembler
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 17-SEP-1987 Development under Digital Research CP/M 2.2
+ * 28-JUN-1988 Switched to Unix System V.3
+ * 21-OCT-2006 changed to ANSI C for modern POSIX OS's
+ */
+
+/*
+ * modul with numercial computation and conversion
+ */
+
+#include
+#include
+#include
+#include "z80a.h"
+#include "z80aglb.h"
+
+#ifndef isxdigit
+#define isxdigit(c) (isdigit(c) || (c>='a' && c<='f') || (c>='A' && c<='F'))
+#endif
+
+/*
+ * definitions of operator symbols for expression parser
+ */
+#define OPEDEC 1 /* decimal number */
+#define OPEHEX 2 /* hexadecimal number */
+#define OPEOCT 3 /* octal number */
+#define OPEBIN 4 /* binary number */
+#define OPESUB 5 /* arithmetical - */
+#define OPEADD 6 /* arithmetical + */
+#define OPEMUL 7 /* arithmetical * */
+#define OPEDIV 8 /* arithmetical / */
+#define OPEMOD 9 /* arithmetical modulo */
+#define OPESHL 10 /* logical shift left */
+#define OPESHR 11 /* logical shift right */
+#define OPELOR 12 /* logical OR */
+#define OPELAN 13 /* logical AND */
+#define OPEXOR 14 /* logical XOR */
+#define OPECOM 15 /* logical complement */
+#define OPESYM 99 /* symbol */
+
+extern struct sym *get_sym(char *);
+extern void asmerr(int);
+
+/*
+ * recursive expression parser
+ *
+ * Input: pointer to argument rest string
+ *
+ * Output: computed value
+ */
+int eval(char *s)
+{
+ register char *p;
+ register int val;
+ char word[MAXLINE];
+ struct sym *sp;
+
+ val = 0;
+ while (*s) {
+ p = word;
+ if (*s == '(') {
+ s++;
+ while (*s != ')') {
+ if (*s == '\0') {
+ asmerr(E_MISPAR);
+ goto eval_break;
+ }
+ *p++ = *s++;
+ }
+ *p = '\0';
+ s++;
+ val = eval(word);
+ continue;
+ }
+ if (*s == STRSEP) {
+ s++;
+ while (*s != STRSEP) {
+ if (*s == '\n' || *s == '\0') {
+ asmerr(E_MISHYP);
+ goto hyp_error;
+ }
+ *p++ = *s++;
+ }
+ s++;
+hyp_error:
+ *p = '\0';
+ val = strval(word);
+ continue;
+ }
+ if (isari(*s))
+ *p++ = *s++;
+ else
+ while (!isspace(*s) && !isari(*s) && (*s != '\0'))
+ *p++ = *s++;
+ *p = '\0';
+ switch (get_type(word)) {
+ case OPESYM: /* symbol */
+ if (strcmp(word, "$") == 0) {
+ val = pc;
+ break;
+ }
+ if (strlen(word) > SYMSIZE)
+ word[SYMSIZE] = '\0';
+ if ((sp = get_sym(word)) != NULL)
+ val = sp->sym_wert;
+ else
+ asmerr(E_UNDSYM);
+ break;
+ case OPEDEC: /* decimal number */
+ val = atoi(word);
+ break;
+ case OPEHEX: /* hexadecimal number */
+ val = axtoi(word);
+ break;
+ case OPEBIN: /* binary number */
+ val = abtoi(word);
+ break;
+ case OPEOCT: /* octal number */
+ val = aotoi(word);
+ break;
+ case OPESUB: /* arithmetical - */
+ val -= eval(s);
+ goto eval_break;
+ case OPEADD: /* arithmetical + */
+ val += eval(s);
+ goto eval_break;
+ case OPEMUL: /* arithmetical * */
+ val *= eval(s);
+ goto eval_break;
+ case OPEDIV: /* arithmetical / */
+ val /= eval(s);
+ goto eval_break;
+ case OPEMOD: /* arithmetical modulo */
+ val %= eval(s);
+ goto eval_break;
+ case OPESHL: /* logical shift left */
+ val <<= eval(s);
+ goto eval_break;
+ case OPESHR: /* logical shift right */
+ val >>= eval(s);
+ goto eval_break;
+ case OPELOR: /* logical OR */
+ val |= eval(s);
+ goto eval_break;
+ case OPELAN: /* logical AND */
+ val &= eval(s);
+ goto eval_break;
+ case OPEXOR: /* logical XOR */
+ val ^= eval(s);
+ goto eval_break;
+ case OPECOM: /* logical complement */
+ val = ~(eval(s));
+ goto eval_break;
+ }
+ }
+ eval_break:
+ return(val);
+}
+
+/*
+ * get typ of operand
+ *
+ * Input: pointer to string with operand
+ *
+ * Output: operand typ
+ */
+int get_type(char *s)
+{
+ if (isdigit(*s)) { /* numerical operand */
+ if (isdigit(*(s + strlen(s) - 1))) /* decimal number */
+ return(OPEDEC);
+ else if (*(s + strlen(s) - 1) == 'H') /* hexadecimal number */
+ return(OPEHEX);
+ else if (*(s + strlen(s) - 1) == 'B') /* binary number */
+ return(OPEBIN);
+ else if (*(s + strlen(s) - 1) == 'O') /* octal number */
+ return(OPEOCT);
+ } else if (*s == '-') /* arithmetical operand - */
+ return(OPESUB);
+ else if (*s == '+') /* arithmetical operand + */
+ return(OPEADD);
+ else if (*s == '*') /* arithmetical operand * */
+ return(OPEMUL);
+ else if (*s == '/') /* arithmetical operand / */
+ return(OPEDIV);
+ else if (*s == '%') /* arithmetical modulo */
+ return(OPEMOD);
+ else if (*s == '<') /* logical shift left */
+ return(OPESHL);
+ else if (*s == '>') /* logical shift rigth */
+ return(OPESHR);
+ else if (*s == '|') /* logical OR */
+ return(OPELOR);
+ else if (*s == '&') /* logical AND */
+ return(OPELAN);
+ else if (*s == '^') /* logical XOR */
+ return(OPEXOR);
+ else if (*s == '~') /* logical complement */
+ return(OPECOM);
+ return(OPESYM); /* operand is symbol */
+}
+
+/*
+ * check a character for arithmetical operators
+ * +, -, *, /, %, <, >, |, &, ~ and ^
+ */
+int isari(int c)
+{
+ return((c) == '+' || (c) == '-' || (c) == '*' ||
+ (c) == '/' || (c) == '%' || (c) == '<' ||
+ (c) == '>' || (c) == '|' || (c) == '&' ||
+ (c) == '~' || (c) == '^');
+}
+
+/*
+ * conversion of string with hexadecimal number to integer
+ * format: nnnnH or 0nnnnH if 1st digit > 9
+ */
+int axtoi(char *str)
+{
+ register int num;
+
+ num = 0;
+ while (isxdigit(*str)) {
+ num *= 16;
+ num += *str - ((*str <= '9') ? '0' : '7');
+ str++;
+ }
+ return(num);
+}
+
+/*
+ * conversion of string with octal number to integer
+ * format: nnnnO
+ */
+int aotoi(char *str)
+{
+ register int num;
+
+ num = 0;
+ while ('0' <= *str && *str <= '7') {
+ num *= 8;
+ num += (*str++) - '0';
+ }
+ return(num);
+}
+
+/*
+ * conversion of string with binary number to integer
+ * format: nnnnnnnnnnnnnnnnB
+ */
+int abtoi(char *str)
+{
+ register int num;
+
+ num = 0;
+ while ('0' <= *str && *str <= '1') {
+ num *= 2;
+ num += (*str++) - '0';
+ }
+ return(num);
+}
+
+/*
+ * convert ASCII string to integer
+ */
+int strval(char *str)
+{
+ register int num;
+
+ num = 0;
+ while (*str) {
+ num <<= 8;
+ num += (int) *str++;
+ }
+ return(num);
+}
+
+/*
+ * check value for range -256 < value < 256
+ * Output: value if in range, otherwise 0 and error message
+ */
+int chk_v1(int i)
+{
+ if (i >= -255 && i <= 255)
+ return(i);
+ else {
+ asmerr(E_VALOUT);
+ return(0);
+ }
+}
+
+/*
+ * check value for range -128 < value < 128
+ * Output: value if in range, otherwise 0 and error message
+ */
+int chk_v2(int i)
+{
+ if (i >= -127 && i <= 127)
+ return(i);
+ else {
+ asmerr(E_VALOUT);
+ return(0);
+ }
+}
diff --git a/emu/z80pack-1.9/z80asm/z80aopc.c b/emu/z80pack-1.9/z80asm/z80aopc.c
new file mode 100644
index 0000000..fcc8613
--- /dev/null
+++ b/emu/z80pack-1.9/z80asm/z80aopc.c
@@ -0,0 +1,172 @@
+/*
+ * Z80 - Assembler
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 17-SEP-1987 Development under Digital Research CP/M 2.2
+ * 28-JUN-1988 Switched to Unix System V.3
+ * 21-OCT-2006 changed to ANSI C for modern POSIX OS's
+ */
+
+/*
+ * opcode tables
+ */
+
+#include
+#include "z80a.h"
+
+extern int op_1b(), op_2b(), op_pupo(), op_ex(), op_ld();
+extern int op_call(), op_ret(), op_jp(), op_jr(), op_djnz(), op_rst();
+extern int op_add(), op_adc(), op_sub(), op_sbc(), op_cp();
+extern int op_inc(), op_dec(), op_or(), op_xor(), op_and();
+extern int op_rl(), op_rr(), op_sla(), op_sra(), op_srl(), op_rlc(), op_rrc();
+extern int op_out(), op_in(), op_im();
+extern int op_set(), op_res(), op_bit();
+extern int op_org(), op_dl(), op_equ();
+extern int op_ds(), op_db(), op_dw(), op_dm();
+extern int op_misc();
+extern int op_cond();
+extern int op_glob();
+
+/*
+ * opcode table:
+ * includes entries for all opcodes and pseudo ops other than END
+ * must be sorted in ascending order!
+ */
+struct opc opctab[] = {
+ { "ADC", op_adc, 0, 0 },
+ { "ADD", op_add, 0, 0 },
+ { "AND", op_and, 0, 0 },
+ { "BIT", op_bit, 0, 0 },
+ { "CALL", op_call, 0, 0 },
+ { "CCF", op_1b, 0x3f, 0 },
+ { "CP", op_cp, 0, 0 },
+ { "CPD", op_2b, 0xed, 0xa9 },
+ { "CPDR", op_2b, 0xed, 0xb9 },
+ { "CPI", op_2b, 0xed, 0xa1 },
+ { "CPIR", op_2b, 0xed, 0xb1 },
+ { "CPL", op_1b, 0x2f, 0 },
+ { "DAA", op_1b, 0x27, 0 },
+ { "DEC", op_dec, 0, 0 },
+ { "DEFB", op_db, 0, 0 },
+ { "DEFL", op_dl, 0, 0 },
+ { "DEFM", op_dm, 0, 0 },
+ { "DEFS", op_ds, 0, 0 },
+ { "DEFW", op_dw, 0, 0 },
+ { "DI", op_1b, 0xf3, 0 },
+ { "DJNZ", op_djnz, 0, 0 },
+ { "EI", op_1b, 0xfb, 0 },
+ { "EJECT", op_misc, 1, 0 },
+ { "ELSE", op_cond, 98, 0 },
+ { "ENDIF", op_cond, 99, 0 },
+ { "EQU", op_equ, 0, 0 },
+ { "EX", op_ex, 0, 0 },
+ { "EXTRN", op_glob, 1, 0 },
+ { "EXX", op_1b, 0xd9, 0 },
+ { "HALT", op_1b, 0x76, 0 },
+ { "IFDEF", op_cond, 1, 0 },
+ { "IFEQ", op_cond, 3, 0 },
+ { "IFNDEF", op_cond, 2, 0 },
+ { "IFNEQ", op_cond, 4, 0 },
+ { "IM", op_im, 0, 0 },
+ { "IN", op_in, 0, 0 },
+ { "INC", op_inc, 0, 0 },
+ { "INCLUDE", op_misc, 6, 0 },
+ { "IND", op_2b, 0xed, 0xaa },
+ { "INDR", op_2b, 0xed, 0xba },
+ { "INI", op_2b, 0xed, 0xa2 },
+ { "INIR", op_2b, 0xed, 0xb2 },
+ { "JP", op_jp, 0, 0 },
+ { "JR", op_jr, 0, 0 },
+ { "LD", op_ld, 0, 0 },
+ { "LDD", op_2b, 0xed, 0xa8 },
+ { "LDDR", op_2b, 0xed, 0xb8 },
+ { "LDI", op_2b, 0xed, 0xa0 },
+ { "LDIR", op_2b, 0xed, 0xb0 },
+ { "LIST", op_misc, 2, 0 },
+ { "NEG", op_2b, 0xed, 0x44 },
+ { "NOLIST", op_misc, 3, 0 },
+ { "NOP", op_1b, 0, 0 },
+ { "OR", op_or, 0, 0 },
+ { "ORG", op_org, 0, 0 },
+ { "OTDR", op_2b, 0xed, 0xbb },
+ { "OTIR", op_2b, 0xed, 0xb3 },
+ { "OUT", op_out, 0, 0 },
+ { "OUTD", op_2b, 0xed, 0xab },
+ { "OUTI", op_2b, 0xed, 0xa3 },
+ { "PAGE", op_misc, 4, 0 },
+ { "POP", op_pupo, 1, 0 },
+ { "PRINT", op_misc, 5, 0 },
+ { "PUBLIC", op_glob, 2, 0 },
+ { "PUSH", op_pupo, 2, 0 },
+ { "RES", op_res, 0, 0 },
+ { "RET", op_ret, 0, 0 },
+ { "RETI", op_2b, 0xed, 0x4d },
+ { "RETN", op_2b, 0xed, 0x45 },
+ { "RL", op_rl, 0, 0 },
+ { "RLA", op_1b, 0x17, 0 },
+ { "RLC", op_rlc, 0, 0 },
+ { "RLCA", op_1b, 0x07, 0 },
+ { "RLD", op_2b, 0xed, 0x6f },
+ { "RR", op_rr, 0, 0 },
+ { "RRA", op_1b, 0x1f, 0 },
+ { "RRC", op_rrc, 0, 0 },
+ { "RRCA", op_1b, 0x0f, 0 },
+ { "RRD", op_2b, 0xed, 0x67 },
+ { "RST", op_rst, 0, 0 },
+ { "SBC", op_sbc, 0, 0 },
+ { "SCF", op_1b, 0x37, 0 },
+ { "SET", op_set, 0, 0 },
+ { "SLA", op_sla, 0, 0 },
+ { "SRA", op_sra, 0, 0 },
+ { "SRL", op_srl, 0, 0 },
+ { "SUB", op_sub, 0, 0 },
+ { "TITLE", op_misc, 7, 0 },
+ { "XOR", op_xor, 0, 0 }
+};
+
+/*
+ * compute no. of table entries for search_op()
+ */
+int no_opcodes = sizeof(opctab) / sizeof(struct opc);
+
+/*
+ * table with reserverd operand words: registers and flags
+ * must be sorted in ascending order!
+ */
+struct ope opetab[] = {
+ { "(BC)", REGIBC },
+ { "(DE)", REGIDE },
+ { "(HL)", REGIHL },
+ { "(IX)", REGIIX },
+ { "(IY)", REGIIY },
+ { "(SP)", REGISP },
+ { "A", REGA },
+ { "AF", REGAF },
+ { "B", REGB },
+ { "BC", REGBC },
+ { "C", REGC },
+ { "D", REGD },
+ { "DE", REGDE },
+ { "E", REGE },
+ { "H", REGH },
+ { "HL", REGHL },
+ { "I", REGI },
+ { "IX", REGIX },
+ { "IY", REGIY },
+ { "L", REGL },
+ { "M", FLGM },
+ { "NC", FLGNC },
+ { "NZ", FLGNZ },
+ { "P", FLGP },
+ { "PE", FLGPE },
+ { "PO", FLGPO },
+ { "R", REGR },
+ { "SP", REGSP },
+ { "Z", FLGZ }
+};
+
+/*
+ * compute no. of table entries
+ */
+int no_operands = sizeof(opetab) / sizeof(struct ope);
diff --git a/emu/z80pack-1.9/z80asm/z80aout.c b/emu/z80pack-1.9/z80asm/z80aout.c
new file mode 100644
index 0000000..869bcac
--- /dev/null
+++ b/emu/z80pack-1.9/z80asm/z80aout.c
@@ -0,0 +1,360 @@
+/*
+ * Z80 - Assembler
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 17-SEP-1987 Development under Digital Research CP/M 2.2
+ * 28-JUN-1988 Switched to Unix System V.3
+ * 21-OCT-2006 changed to ANSI C for modern POSIX OS's
+ */
+
+/*
+ * module for output functions to list, object and error files
+ */
+
+#include
+#include
+#include "z80a.h"
+#include "z80aglb.h"
+
+void flush_hex(void);
+int chksum(void);
+void btoh(unsigned char, char **);
+
+extern void fatal(int, char *);
+
+static char *errmsg[] = { /* error messages for asmerr() */
+ "illegal opcode", /* 0 */
+ "illegal operand", /* 1 */
+ "missing operand", /* 2 */
+ "multiply defined symbol", /* 3 */
+ "undefined symbol", /* 4 */
+ "value out of range", /* 5 */
+ "missing )", /* 6 */
+ "missing string separator", /* 7 */
+ "memory override", /* 8 */
+ "missing IF", /* 9 */
+ "IF nesting to deep", /* 10 */
+ "missing ENDIF", /* 11 */
+ "INCLUDE nesting to deep" /* 12 */
+};
+
+#define MAXHEX 32 /* max no bytes/hex record */
+
+static unsigned short hex_adr; /* current address in hex record */
+static int hex_cnt; /* current no bytes in hex buffer */
+
+static unsigned char hex_buf[MAXHEX]; /* buffer for one hex record */
+static char hex_out[MAXHEX*2+11]; /* ASCII buffer for one hex record */
+
+/*
+ * print error message to listfile and increase error counter
+ */
+void asmerr(int i)
+{
+ if (pass == 1) {
+ fprintf(errfp, "Error in file: %s Line: %d\n", srcfn, c_line);
+ fprintf(errfp, errmsg[i]);
+ fprintf(errfp, "\n\n");
+ } else
+ errnum = i;
+ errors++;
+}
+
+/*
+ * begin new page in listfile
+ */
+void lst_header(void)
+{
+ fprintf(lstfp, "\fZ80-Assembler\t\tRelease %s\t\t\t\tPage %d\n", REL,
+ ++page);
+ fprintf(lstfp, "Source file: %s\n", srcfn);
+ fprintf(lstfp, "Title: %s\n", title);
+ p_line = 3;
+}
+
+/*
+ * print header for source lines
+ */
+void lst_attl(void)
+{
+ fprintf(lstfp, "\nLOC OBJECT CODE LINE STMT SOURCE CODE\n");
+ p_line += 2;
+}
+
+/*
+ * print one line into listfile, if -l option set
+ */
+void lst_line(int val, int opanz)
+{
+ register int i;
+
+ if (!list_flag || sd_flag == 4) {
+ sd_flag = 0;
+ return;
+ }
+ if ((p_line >= ppl) || (c_line == 1)) {
+ lst_header();
+ lst_attl();
+ }
+ switch (sd_flag) {
+ case 0:
+ fprintf(lstfp, "%04x ", val & 0xffff);
+ break;
+ case 1:
+ fprintf(lstfp, "%04x ", sd_val & 0xffff);
+ break;
+ case 2:
+ fprintf(lstfp, " ");
+ break;
+ case 3:
+ fprintf(lstfp, "%04x ", sd_val & 0xffff);
+ goto no_data;
+ default:
+ fatal(F_INTERN, "illegal listflag for function lst_line");
+ break;
+ }
+ if (opanz >= 1) fprintf(lstfp, "%02x ", ops[0] & 0xff);
+ else fprintf(lstfp, " ");
+ if (opanz >= 2) fprintf(lstfp, "%02x ", ops[1] & 0xff);
+ else fprintf(lstfp, " ");
+ if (opanz >= 3) fprintf(lstfp, "%02x ", ops[2] & 0xff);
+ else fprintf(lstfp, " ");
+ if (opanz >= 4) fprintf(lstfp, "%02x ", ops[3] & 0xff);
+ else fprintf(lstfp, " ");
+ no_data:
+ fprintf(lstfp, "%6d %6d %s", c_line, s_line, line);
+ if (errnum) {
+ fprintf(errfp, "=> %s", errmsg[errnum]);
+ putc('\n', errfp);
+ errnum = 0;
+ p_line++;
+ }
+ sd_flag = 0;
+ p_line++;
+ if (opanz > 4 && sd_flag == 0) {
+ opanz -= 4;
+ i = 4;
+ sd_val = val;
+ while (opanz > 0) {
+ if (p_line >= ppl) {
+ lst_header();
+ lst_attl();
+ }
+ s_line++;
+ sd_val += 4;
+ fprintf(lstfp, "%04x ", sd_val & 0xffff);
+ if (opanz-- > 0) fprintf(lstfp, "%02x ",
+ ops[i++] & 0xff);
+ else fprintf(lstfp, " ");
+ if (opanz-- > 0) fprintf(lstfp, "%02x ",
+ ops[i++] & 0xff);
+ else fprintf(lstfp, " ");
+ if (opanz-- > 0) fprintf(lstfp, "%02x ",
+ ops[i++] & 0xff);
+ else fprintf(lstfp, " ");
+ if (opanz-- > 0) fprintf(lstfp, "%02x ",
+ ops[i++] & 0xff);
+ else fprintf(lstfp, " ");
+ fprintf(lstfp, "%6d %6d\n", c_line, s_line);
+ p_line++;
+ }
+ }
+}
+
+/*
+ * print symbol table into listfile unsorted
+ */
+void lst_sym(void)
+{
+ register int i, j;
+ register struct sym *np;
+
+ p_line = j = 0;
+ strcpy(title,"Symboltable");
+ for (i = 0; i < HASHSIZE; i++) {
+ if (symtab[i] != NULL) {
+ for (np = symtab[i]; np != NULL; np = np->sym_next) {
+ if (p_line == 0) {
+ lst_header();
+ fputs("\n", lstfp);
+ p_line += 1;
+ }
+ fprintf(lstfp, "%-8s %04x\t", np->sym_name,
+ np->sym_wert & 0xffff);
+ if (++j == 4) {
+ fprintf(lstfp, "\n");
+ if (p_line++ >= ppl)
+ p_line = 0;
+ j = 0;
+ }
+ }
+ }
+ }
+}
+
+/*
+ * print sorted symbol table into listfile
+ */
+void lst_sort_sym(int len)
+{
+ register int i, j;
+
+ p_line = i = j = 0;
+ strcpy(title, "Symboltable");
+ while (i < len) {
+ if (p_line == 0) {
+ lst_header();
+ fputs("\n", lstfp);
+ p_line += 1;
+ }
+ fprintf(lstfp, "%-8s %04x\t", symarray[i]->sym_name,
+ symarray[i]->sym_wert & 0xffff);
+ if (++j == 4) {
+ fprintf(lstfp, "\n");
+ if (p_line++ >= ppl)
+ p_line = 0;
+ j = 0;
+ }
+ i++;
+ }
+}
+
+/*
+ * write header record into object file
+ */
+void obj_header(void)
+{
+ switch (out_form) {
+ case OUTBIN:
+ break;
+ case OUTMOS:
+ putc(0xff, objfp);
+ putc(prg_adr & 0xff, objfp);
+ putc(prg_adr >> 8, objfp);
+ break;
+ case OUTHEX:
+ hex_adr = prg_adr;
+ break;
+ }
+}
+
+/*
+ * write end record into object file
+ */
+void obj_end(void)
+{
+ switch (out_form) {
+ case OUTBIN:
+ break;
+ case OUTMOS:
+ break;
+ case OUTHEX:
+ flush_hex();
+ fprintf(objfp, ":0000000000\n");
+ break;
+ }
+}
+
+/*
+ * write opcodes in ops[] into object file
+ */
+void obj_writeb(int opanz)
+{
+ register int i;
+
+ switch (out_form) {
+ case OUTBIN:
+ fwrite(ops, 1, opanz, objfp);
+ break;
+ case OUTMOS:
+ fwrite(ops, 1, opanz, objfp);
+ break;
+ case OUTHEX:
+ for (i = 0; opanz; opanz--) {
+ if (hex_cnt >= MAXHEX)
+ flush_hex();
+ hex_buf[hex_cnt++] = ops[i++];
+ }
+ break;
+ }
+}
+
+/*
+ * write bytes 0xff into object file
+ */
+void obj_fill(int count)
+{
+ switch (out_form) {
+ case OUTBIN:
+ while (count--)
+ putc(0xff, objfp);
+ break;
+ case OUTMOS:
+ while (count--)
+ putc(0xff, objfp);
+ break;
+ case OUTHEX:
+ flush_hex();
+ hex_adr += count;
+ break;
+ }
+}
+
+/*
+ * create a hex record in ASCII and write into object file
+ */
+void flush_hex(void)
+{
+ char *p;
+ register int i;
+
+ if (!hex_cnt)
+ return;
+ p = hex_out;
+ *p++ = ':';
+ btoh((unsigned char) hex_cnt, &p);
+ btoh((unsigned char) (hex_adr >> 8), &p);
+ btoh((unsigned char) (hex_adr & 0xff), &p);
+ *p++ = '0';
+ *p++ = '0';
+ for (i = 0; i < hex_cnt; i++)
+ btoh(hex_buf[i], &p);
+ btoh((unsigned char) chksum(), &p);
+ *p++ = '\n';
+ *p = '\0';
+ fwrite(hex_out, 1, strlen(hex_out), objfp);
+ hex_adr += hex_cnt;
+ hex_cnt = 0;
+}
+
+/*
+ * convert unsigned char into ASCII hex and copy to string at p
+ * increase p by 2
+ */
+void btoh(unsigned char byte, char **p)
+{
+ register unsigned char c;
+
+ c = byte >> 4;
+ *(*p)++ = (c < 10) ? (c + '0') : (c - 10 + 'A');
+ c = byte & 0xf;
+ *(*p)++ = (c < 10) ? (c + '0') : (c - 10 + 'A');
+}
+
+/*
+ * computer checksum for Intel hex record
+ */
+int chksum(void)
+{
+ register int i, j, sum;
+
+ sum = hex_cnt;
+ sum += hex_adr >> 8;
+ sum += hex_adr & 0xff;
+ for (i = 0; i < hex_cnt; i++) {
+ j = hex_buf[i];
+ sum += j & 0xff;
+ }
+ return (0x100 - (sum & 0xff));
+}
diff --git a/emu/z80pack-1.9/z80asm/z80apfun.c b/emu/z80pack-1.9/z80asm/z80apfun.c
new file mode 100644
index 0000000..912db5d
--- /dev/null
+++ b/emu/z80pack-1.9/z80asm/z80apfun.c
@@ -0,0 +1,446 @@
+/*
+ * Z80 - Assembler
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 17-SEP-1987 Development under Digital Research CP/M 2.2
+ * 28-JUN-1988 Switched to Unix System V.3
+ * 22-OCT-2006 changed to ANSI C for modern POSIX OS's
+ */
+
+/*
+ * processing of all PSEUDO ops
+ */
+
+#include
+#include
+#include
+#include "z80a.h"
+#include "z80aglb.h"
+
+extern void fatal(int, char *);
+extern void p1_file(char *);
+extern void p2_file(char *);
+extern int eval(char *);
+extern void asmerr(int);
+extern void lst_header(void);
+extern void lst_attl(void);
+extern void lst_line(int, int);
+extern void obj_fill(int);
+extern struct sym *get_sym(char *);
+extern int put_sym(char *, int);
+extern void put_label(void);
+
+/*
+ * ORG
+ */
+int op_org(void)
+{
+ register int i;
+
+ if (!gencode)
+ return(0);
+ i = eval(operand);
+ if (i < pc) {
+ asmerr(E_MEMOVR);
+ return(0);
+ }
+ if (pass == 1) { /* PASS 1 */
+ if (!prg_flag) {
+ prg_adr = i;
+ prg_flag++;
+ }
+ } else { /* PASS 2 */
+ if (++prg_flag > 2)
+ obj_fill(i - pc);
+ sd_flag = 2;
+ }
+ pc = i;
+ return(0);
+}
+
+/*
+ * EQU
+ */
+int op_equ(void)
+{
+ if (!gencode)
+ return(0);
+ if (pass == 1) { /* Pass 1 */
+ if (get_sym(label) == NULL) {
+ sd_val = eval(operand);
+ if (put_sym(label, sd_val))
+ fatal(F_OUTMEM, "symbols");
+ } else
+ asmerr(E_MULSYM);
+ } else { /* Pass 2 */
+ sd_flag = 1;
+ sd_val = eval(operand);
+ }
+ return(0);
+}
+
+/*
+ * DEFL
+ */
+int op_dl(void)
+{
+ if (!gencode)
+ return(0);
+ sd_flag = 1;
+ sd_val = eval(operand);
+ if (put_sym(label, sd_val))
+ fatal(F_OUTMEM, "symbols");
+ return(0);
+}
+
+/*
+ * DEFS
+ */
+int op_ds(void)
+{
+ register int val;
+
+ if (!gencode)
+ return(0);
+ if (pass == 1)
+ if (*label)
+ put_label();
+ sd_val = pc;
+ sd_flag = 3;
+ val = eval(operand);
+ if ((pass == 2) && !dump_flag)
+ obj_fill(val);
+ pc += val;
+ return(0);
+}
+
+/*
+ * DEFB
+ */
+int op_db(void)
+{
+ register int i;
+ register char *p;
+ register char *s;
+
+ if (!gencode)
+ return(0);
+ i = 0;
+ p = operand;
+ if (pass == 1)
+ if (*label)
+ put_label();
+ while (*p) {
+ if (*p == STRSEP) {
+ p++;
+ while (*p != STRSEP) {
+ if (*p == '\n' || *p == '\0') {
+ asmerr(E_MISHYP);
+ goto hyp_error;
+ }
+ ops[i++] = *p++;
+ if (i >= OPCARRAY)
+ fatal(F_INTERN, "Op-Code buffer overflow");
+ }
+ p++;
+ } else {
+ s = tmp;
+ while (*p != ',' && *p != '\0')
+ *s++ = *p++;
+ *s = '\0';
+ ops[i++] = eval(tmp);
+ if (i >= OPCARRAY)
+ fatal(F_INTERN, "Op-Code buffer overflow");
+ }
+ if (*p == ',')
+ p++;
+ }
+hyp_error:
+ return(i);
+}
+
+/*
+ * DEFM
+ */
+int op_dm(void)
+{
+ register int i;
+ register char *p;
+
+ if (!gencode)
+ return(0);
+ i = 0;
+ p = operand;
+ if (pass == 1)
+ if (*label)
+ put_label();
+ if (*p != STRSEP) {
+ asmerr(E_MISHYP);
+ return(0);
+ }
+ p++;
+ while (*p != STRSEP) {
+ if (*p == '\n' || *p == '\0') {
+ asmerr(E_MISHYP);
+ break;
+ }
+ ops[i++] = *p++;
+ if (i >= OPCARRAY)
+ fatal(F_INTERN, "Op-Code buffer overflow");
+ }
+ return(i);
+}
+
+/*
+ * DEFW
+ */
+int op_dw(void)
+{
+ register int i, len, temp;
+ register char *p;
+ register char *s;
+
+ if (!gencode)
+ return(0);
+ p = operand;
+ i = len = 0;
+ if (pass == 1)
+ if (*label)
+ put_label();
+ while (*p) {
+ s = tmp;
+ while (*p != ',' && *p != '\0')
+ *s++ = *p++;
+ *s = '\0';
+ if (pass == 2) {
+ temp = eval(tmp);
+ ops[i++] = temp & 0xff;
+ ops[i++] = temp >> 8;
+ if (i >= OPCARRAY)
+ fatal(F_INTERN, "Op-Code buffer overflow");
+ }
+ len += 2;
+ if (*p == ',')
+ p++;
+ }
+ return(len);
+}
+
+/*
+ * EJECT, LIST, NOLIST, PAGE, PRINT, TITLE, INCLUDE
+ */
+int op_misc(int op_code, int dummy)
+{
+ register char *p, *d;
+ static char fn[LENFN];
+ static int incnest;
+ static struct inc incl[INCNEST];
+
+ if (!gencode)
+ return(0);
+ sd_flag = 2;
+ switch(op_code) {
+ case 1: /* EJECT */
+ if (pass == 2)
+ p_line = ppl;
+ break;
+ case 2: /* LIST */
+ if (pass == 2)
+ list_flag = 1;
+ break;
+ case 3: /* NOLIST */
+ if (pass == 2)
+ list_flag = 0;
+ break;
+ case 4: /* PAGE */
+ if (pass == 2)
+ ppl = eval(operand);
+ break;
+ case 5: /* PRINT */
+ if (pass == 1) {
+ p = operand;
+ while (*p) {
+ if (*p != STRSEP)
+ putchar(*p++);
+ else
+ p++;
+ }
+ putchar('\n');
+ }
+ break;
+ case 6: /* INCLUDE */
+ if (incnest >= INCNEST) {
+ asmerr(E_INCNEST);
+ break;
+ }
+ incl[incnest].inc_line = c_line;
+ incl[incnest].inc_fn = srcfn;
+ incl[incnest].inc_fp = srcfp;
+ incnest++;
+ p = line;
+ d = fn;
+ while(isspace(*p)) /* ignore white space until INCLUDE */
+ p++;
+ while(!isspace(*p)) /* ignore INCLUDE */
+ p++;
+ while(isspace(*p)) /* ignore white space until filename */
+ p++;
+ while(!isspace(*p) && *p != COMMENT) /* get filename */
+ *d++ = *p++;
+ *d = '\0';
+ if (pass == 1) { /* PASS 1 */
+ if (!ver_flag)
+ printf(" Include %s\n", fn);
+ p1_file(fn);
+ } else { /* PASS 2 */
+ sd_flag = 2;
+ lst_line(0, 0);
+ if (!ver_flag)
+ printf(" Include %s\n", fn);
+ p2_file(fn);
+ }
+ incnest--;
+ c_line = incl[incnest].inc_line;
+ srcfn = incl[incnest].inc_fn;
+ srcfp = incl[incnest].inc_fp;
+ printf(" Resume %s\n", srcfn);
+ if (list_flag && (pass == 2)) {
+ lst_header();
+ lst_attl();
+ }
+ sd_flag = 4;
+ break;
+ case 7: /* TITLE */
+ if (pass == 2) {
+ p = line;
+ d = title;
+ while (isspace(*p)) /* ignore white space until TITLE */
+ p++;
+ while (!isspace(*p)) /* ignore TITLE */
+ p++;
+ while (isspace(*p)) /* ignore white space until text */
+ p++;
+ if (*p == STRSEP)
+ p++;
+ while (*p != '\n' && *p != STRSEP && *p != COMMENT)
+ *d++ = *p++;
+ *d = '\0';
+ }
+ break;
+ default:
+ fatal(F_INTERN, "illegal opcode for function op_misc");
+ break;
+ }
+ return(0);
+}
+
+/*
+ * IFDEF, IFNDEF, IFEQ, IFNEQ, ELSE, ENDIF
+ */
+int op_cond(int op_code, int dummy)
+{
+ register char *p, *p1, *p2;
+ static int condnest[IFNEST];
+
+ switch(op_code) {
+ case 1: /* IFDEF */
+ if (iflevel >= IFNEST) {
+ asmerr(E_IFNEST);
+ break;
+ }
+ condnest[iflevel++] = gencode;
+ if (gencode)
+ if (get_sym(operand) == NULL)
+ gencode = 0;
+ break;
+ case 2: /* IFNDEF */
+ if (iflevel >= IFNEST) {
+ asmerr(E_IFNEST);
+ break;
+ }
+ condnest[iflevel++] = gencode;
+ if (gencode)
+ if (get_sym(operand) != NULL)
+ gencode = 0;
+ break;
+ case 3: /* IFEQ */
+ if (iflevel >= IFNEST) {
+ asmerr(E_IFNEST);
+ break;
+ }
+ condnest[iflevel++] = gencode;
+ p = operand;
+ if (!*p || !(p1 = strchr(operand, ','))) {
+ asmerr(E_MISOPE);
+ break;
+ }
+ if (gencode) {
+ p2 = tmp;
+ while (*p != ',')
+ *p2++ = *p++;
+ *p2 = '\0';
+ if (eval(tmp) != eval(++p1))
+ gencode = 0;
+ }
+ break;
+ case 4: /* IFNEQ */
+ if (iflevel >= IFNEST) {
+ asmerr(E_IFNEST);
+ break;
+ }
+ condnest[iflevel++] = gencode;
+ p = operand;
+ if (!*p || !(p1 = strchr(operand, ','))) {
+ asmerr(E_MISOPE);
+ break;
+ }
+ if (gencode) {
+ p2 = tmp;
+ while (*p != ',')
+ *p2++ = *p++;
+ *p2 = '\0';
+ if (eval(tmp) == eval(++p1))
+ gencode = 0;
+ }
+ break;
+ case 98: /* ELSE */
+ if (!iflevel)
+ asmerr(E_MISIFF);
+ else
+ if ((iflevel == 0) || (condnest[iflevel - 1] == 1))
+ gencode = !gencode;
+ break;
+ case 99: /* ENDIF */
+ if (!iflevel)
+ asmerr(E_MISIFF);
+ else
+ gencode = condnest[--iflevel];
+ break;
+ default:
+ fatal(F_INTERN, "illegal opcode for function op_cond");
+ break;
+ }
+ sd_flag = 2;
+ return(0);
+}
+
+/*
+ * EXTRN and PUBLIC
+ */
+int op_glob(int op_code, int dummy)
+{
+ if (!gencode)
+ return(0);
+ sd_flag = 2;
+ switch(op_code) {
+ case 1: /* EXTRN */
+ break;
+ case 2: /* PUBLIC */
+ break;
+ default:
+ fatal(F_INTERN, "illegal opcode for function op_glob");
+ break;
+ }
+ return(0);
+}
diff --git a/emu/z80pack-1.9/z80asm/z80arfun.c b/emu/z80pack-1.9/z80asm/z80arfun.c
new file mode 100644
index 0000000..02ab38d
--- /dev/null
+++ b/emu/z80pack-1.9/z80asm/z80arfun.c
@@ -0,0 +1,3274 @@
+/*
+ * Z80 - Assembler
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 17-SEP-1987 Development under Digital Research CP/M 2.2
+ * 28-JUN-1988 Switched to Unix System V.3
+ * 22-OCT-2006 changed to ANSI C for modern POSIX OS's
+ */
+
+/*
+ * processing of all real Z80 opcodes
+ */
+
+#include
+#include
+#include "z80a.h"
+#include "z80aglb.h"
+
+char *get_second(char *);
+
+extern int eval(char *);
+extern int chk_v1(int);
+extern int chk_v2(int);
+extern void asmerr(int);
+extern int get_reg(char *);
+extern void put_label(void);
+
+/*
+ * process 1byte opcodes without arguments
+ */
+int op_1b(int b1, int dummy)
+{
+ if (pass == 1) { /* Pass 1 */
+ if (*label)
+ put_label();
+ } else /* Pass 2 */
+ ops[0] = b1;
+ return(1);
+}
+
+/*
+ * process 2byte opcodes without arguments
+ */
+int op_2b(int b1, int b2)
+{
+ if (pass == 1) { /* Pass 1 */
+ if (*label)
+ put_label();
+ } else { /* Pass 2 */
+ ops[0] = b1;
+ ops[1] = b2;
+ }
+ return(2);
+}
+
+/*
+ * IM
+ */
+int op_im(void)
+{
+ if (pass == 1)
+ if (*label)
+ put_label();
+ if (pass == 2) {
+ ops[0] = 0xed;
+ switch(eval(operand)) {
+ case 0:
+ ops[1] = 0x46;
+ break;
+ case 1:
+ ops[1] = 0x56;
+ break;
+ case 2:
+ ops[1] = 0x5e;
+ break;
+ default:
+ ops[1] = 0;
+ asmerr(E_ILLOPE);
+ break;
+ }
+ }
+ return(2);
+}
+
+/*
+ * PUSH and POP
+ */
+int op_pupo(int op_code, int dummy)
+{
+ register int len;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ switch (get_reg(operand)) {
+ case REGAF:
+ if (pass == 2) {
+ if (op_code == 1)
+ ops[0] = 0xf1; /* POP AF */
+ else
+ ops[0] = 0xf5; /* PUSH AF */
+ }
+ len = 1;
+ break;
+ case REGBC:
+ if (pass == 2) {
+ if (op_code == 1)
+ ops[0] = 0xc1; /* POP BC */
+ else
+ ops[0] = 0xc5; /* PUSH BC */
+ }
+ len = 1;
+ break;
+ case REGDE:
+ if (pass == 2) {
+ if (op_code == 1)
+ ops[0] = 0xd1; /* POP DE */
+ else
+ ops[0] = 0xd5; /* PUSH DE */
+ }
+ len = 1;
+ break;
+ case REGHL:
+ if (pass == 2) {
+ if (op_code == 1)
+ ops[0] = 0xe1; /* POP HL */
+ else
+ ops[0] = 0xe5; /* PUSH HL */
+ }
+ len = 1;
+ break;
+ case REGIX:
+ if (pass == 2) {
+ if (op_code == 1) {
+ ops[0] = 0xdd; /* POP IX */
+ ops[1] = 0xe1;
+ } else {
+ ops[0] = 0xdd; /* PUSH IX */
+ ops[1] = 0xe5;
+ }
+ }
+ len = 2;
+ break;
+ case REGIY:
+ if (pass == 2) {
+ if (op_code == 1) {
+ ops[0] = 0xfd; /* POP IY */
+ ops[1] = 0xe1;
+ } else {
+ ops[0] = 0xfd; /* PUSH IY */
+ ops[1] = 0xe5;
+ }
+ }
+ len = 2;
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * EX
+ */
+int op_ex(void)
+{
+ register int len;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ if (strncmp(operand, "DE,HL", 5) == 0) {
+ ops[0] = 0xeb;
+ len = 1;
+ } else if (strncmp(operand, "AF,AF'", 7) == 0) {
+ ops[0] = 0x08;
+ len = 1;
+ } else if (strncmp(operand, "(SP),HL", 7) == 0) {
+ ops[0] = 0xe3;
+ len = 1;
+ } else if (strncmp(operand, "(SP),IX", 7) == 0) {
+ ops[0] = 0xdd;
+ ops[1] = 0xe3;
+ len = 2;
+ } else if (strncmp(operand, "(SP),IY", 7) == 0) {
+ ops[0] = 0xfd;
+ ops[1] = 0xe3;
+ len = 2;
+ } else {
+ ops[0] = 0;
+ len = 1;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * CALL
+ */
+int op_call(void)
+{
+ register char *p1, *p2;
+ register int i;
+
+ if (pass == 1) { /* PASS 1 */
+ if (*label)
+ put_label();
+ } else { /* PASS 2 */
+ p1 = operand;
+ p2 = tmp;
+ while (*p1 != ',' && *p1 != '\0')
+ *p2++ = *p1++;
+ *p2 = '\0';
+ switch (get_reg(tmp)) {
+ case REGC: /* CALL C,nn */
+ i = eval(strchr(operand, ',') + 1);
+ ops[0] = 0xdc;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ break;
+ case FLGNC: /* CALL NC,nn */
+ i = eval(strchr(operand, ',') + 1);
+ ops[0] = 0xd4;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ break;
+ case FLGZ: /* CALL Z,nn */
+ i = eval(strchr(operand, ',') + 1);
+ ops[0] = 0xcc;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ break;
+ case FLGNZ: /* CALL NZ,nn */
+ i = eval(strchr(operand, ',') + 1);
+ ops[0] = 0xc4;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ break;
+ case FLGPE: /* CALL PE,nn */
+ i = eval(strchr(operand, ',') + 1);
+ ops[0] = 0xec;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ break;
+ case FLGPO: /* CALL PO,nn */
+ i = eval(strchr(operand, ',') + 1);
+ ops[0] = 0xe4;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ break;
+ case FLGM: /* CALL M,nn */
+ i = eval(strchr(operand, ',') + 1);
+ ops[0] = 0xfc;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ break;
+ case FLGP: /* CALL P,nn */
+ i = eval(strchr(operand, ',') + 1);
+ ops[0] = 0xf4;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ break;
+ case NOREG: /* CALL nn */
+ i = eval(operand);
+ ops[0] = 0xcd;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ break;
+ case NOOPERA: /* missing operand */
+ ops[0] = 0;
+ ops[1] = 0;
+ ops[2] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ ops[0] = 0;
+ ops[1] = 0;
+ ops[2] = 0;
+ asmerr(E_ILLOPE);
+ }
+ }
+ return(3);
+}
+
+/*
+ * RST
+ */
+int op_rst(void)
+{
+ register int op;
+
+ if (pass == 1) { /* PASS 1 */
+ if (*label)
+ put_label();
+ } else { /* PASS 2 */
+ op = eval(operand);
+ if ((op / 8 > 7) || (op % 8 != 0)) {
+ ops[0] = 0;
+ asmerr(E_VALOUT);
+ } else
+ ops[0] = 0xc7 + op;
+ }
+ return(1);
+}
+
+/*
+ * RET
+ */
+int op_ret(void)
+{
+ if (pass == 1) { /* PASS 1 */
+ if (*label)
+ put_label();
+ } else { /* PASS 2 */
+ switch (get_reg(operand)) {
+ case NOOPERA: /* RET */
+ ops[0] = 0xc9;
+ break;
+ case REGC: /* RET C */
+ ops[0] = 0xd8;
+ break;
+ case FLGNC: /* RET NC */
+ ops[0] = 0xd0;
+ break;
+ case FLGZ: /* RET Z */
+ ops[0] = 0xc8;
+ break;
+ case FLGNZ: /* RET NZ */
+ ops[0] = 0xc0;
+ break;
+ case FLGPE: /* RET PE */
+ ops[0] = 0xe8;
+ break;
+ case FLGPO: /* RET PO */
+ ops[0] = 0xe0;
+ break;
+ case FLGM: /* RET M */
+ ops[0] = 0xf8;
+ break;
+ case FLGP: /* RET P */
+ ops[0] = 0xf0;
+ break;
+ default: /* invalid operand */
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ }
+ return(1);
+}
+
+/*
+ * JP
+ */
+int op_jp(void)
+{
+ register char *p1, *p2;
+ register int i, len;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ p1 = operand;
+ p2 = tmp;
+ while (*p1 != ',' && *p1 != '\0')
+ *p2++ = *p1++;
+ *p2 = '\0';
+ switch (get_reg(tmp)) {
+ case REGC: /* JP C,nn */
+ len = 3;
+ if (pass == 2) {
+ i = eval(strchr(operand, ',') + 1);
+ ops[0] = 0xda;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ }
+ break;
+ case FLGNC: /* JP NC,nn */
+ len = 3;
+ if (pass == 2) {
+ i = eval(strchr(operand, ',') + 1);
+ ops[0] = 0xd2;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ }
+ break;
+ case FLGZ: /* JP Z,nn */
+ len = 3;
+ if (pass == 2) {
+ i = eval(strchr(operand, ',') + 1);
+ ops[0] = 0xca;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ }
+ break;
+ case FLGNZ: /* JP NZ,nn */
+ len = 3;
+ if (pass == 2) {
+ i = eval(strchr(operand, ',') + 1);
+ ops[0] = 0xc2;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ }
+ break;
+ case FLGPE: /* JP PE,nn */
+ len = 3;
+ if (pass == 2) {
+ i = eval(strchr(operand, ',') + 1);
+ ops[0] = 0xea;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ }
+ break;
+ case FLGPO: /* JP PO,nn */
+ len = 3;
+ if (pass == 2) {
+ i = eval(strchr(operand, ',') + 1);
+ ops[0] = 0xe2;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ }
+ break;
+ case FLGM: /* JP M,nn */
+ len = 3;
+ if (pass == 2) {
+ i = eval(strchr(operand, ',') + 1);
+ ops[0] = 0xfa;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ }
+ break;
+ case FLGP: /* JP P,nn */
+ len = 3;
+ if (pass == 2) {
+ i = eval(strchr(operand, ',') + 1);
+ ops[0] = 0xf2;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ }
+ break;
+ case REGIHL: /* JP (HL) */
+ ops[0] = 0xe9;
+ len = 1;
+ break;
+ case REGIIX: /* JP (IX) */
+ ops[0] = 0xdd;
+ ops[1] = 0xe9;
+ len = 2;
+ break;
+ case REGIIY: /* JP (IY) */
+ ops[0] = 0xfd;
+ ops[1] = 0xe9;
+ len = 2;
+ break;
+ case NOREG: /* JP nn */
+ len = 3;
+ if (pass == 2) {
+ i = eval(operand);
+ ops[0] = 0xc3;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ ops[0] = 0;
+ len = 1;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ ops[0] = 0;
+ len = 1;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * JR
+ */
+int op_jr(void)
+{
+ register char *p1, *p2;
+
+ if (pass == 1) { /* PASS 1 */
+ if (*label)
+ put_label();
+ } else { /* PASS 2 */
+ p1 = operand;
+ p2 = tmp;
+ while (*p1 != ',' && *p1 != '\0')
+ *p2++ = *p1++;
+ *p2 = '\0';
+ switch (get_reg(tmp)) {
+ case REGC: /* JR C,n */
+ ops[0] = 0x38;
+ ops[1] = chk_v2(eval(strchr(operand, ',') + 1) - pc - 2);
+ break;
+ case FLGNC: /* JR NC,n */
+ ops[0] = 0x30;
+ ops[1] = chk_v2(eval(strchr(operand, ',') + 1) - pc - 2);
+ break;
+ case FLGZ: /* JR Z,n */
+ ops[0] = 0x28;
+ ops[1] = chk_v2(eval(strchr(operand, ',') + 1) - pc - 2);
+ break;
+ case FLGNZ: /* JR NZ,n */
+ ops[0] = 0x20;
+ ops[1] = chk_v2(eval(strchr(operand, ',') + 1) - pc - 2);
+ break;
+ case NOREG: /* JR n */
+ ops[0] = 0x18;
+ ops[1] = chk_v2(eval(operand) - pc - 2);
+ break;
+ case NOOPERA: /* missing operand */
+ ops[0] = 0;
+ ops[1] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ ops[0] = 0;
+ ops[1] = 0;
+ asmerr(E_ILLOPE);
+ }
+ }
+ return(2);
+}
+
+/*
+ * DJNZ
+ */
+int op_djnz(void)
+{
+ if (pass == 1) { /* PASS 1 */
+ if (*label)
+ put_label();
+ } else { /* PASS 2 */
+ ops[0] = 0x10;
+ ops[1] = chk_v2(eval(operand) - pc - 2);
+ }
+ return(2);
+}
+
+/*
+ * LD
+ */
+int op_ld(void)
+{
+ register int len;
+ register char *p1, *p2;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ p1 = operand;
+ p2 = tmp;
+ while (*p1 != ',' && *p1 != '\0')
+ *p2++ = *p1++;
+ *p2 = '\0';
+ switch (get_reg(tmp)) {
+ case REGA: /* LD A,? */
+ len = lda();
+ break;
+ case REGB: /* LD B,? */
+ len = ldb();
+ break;
+ case REGC: /* LD C,? */
+ len = ldc();
+ break;
+ case REGD: /* LD D,? */
+ len = ldd();
+ break;
+ case REGE: /* LD E,? */
+ len = lde();
+ break;
+ case REGH: /* LD H,? */
+ len = ldh();
+ break;
+ case REGL: /* LD L,? */
+ len = ldl();
+ break;
+ case REGI: /* LD I,A */
+ if (get_reg(get_second(operand)) == REGA) {
+ len = 2;
+ ops[0] = 0xed;
+ ops[1] = 0x47;
+ break;
+ }
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ break;
+ case REGR: /* LD R,A */
+ if (get_reg(get_second(operand)) == REGA) {
+ len = 2;
+ ops[0] = 0xed;
+ ops[1] = 0x4f;
+ break;
+ }
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ break;
+ case REGBC: /* LD BC,? */
+ len = ldbc();
+ break;
+ case REGDE: /* LD DE,? */
+ len = ldde();
+ break;
+ case REGHL: /* LD HL,? */
+ len = ldhl();
+ break;
+ case REGIX: /* LD IX,? */
+ len = ldix();
+ break;
+ case REGIY: /* LD IY,? */
+ len = ldiy();
+ break;
+ case REGSP: /* LD SP,? */
+ len = ldsp();
+ break;
+ case REGIHL: /* LD (HL),? */
+ len = ldihl();
+ break;
+ case REGIBC: /* LD (BC),A */
+ if (get_reg(get_second(operand)) == REGA) {
+ len = 1;
+ ops[0] = 0x02;
+ break;
+ }
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ break;
+ case REGIDE: /* LD (DE),A */
+ if (get_reg(get_second(operand)) == REGA) {
+ len = 1;
+ ops[0] = 0x12;
+ break;
+ }
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default:
+ if (strncmp(operand, "(IX+", 4) == 0)
+ len = ldiix(); /* LD (IX+d),? */
+ else if (strncmp(operand, "(IY+", 4) == 0)
+ len = ldiiy(); /* LD (IY+d),? */
+ else if (*operand == '(')
+ len = ldinn(); /* LD (nn),? */
+ else { /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ }
+ return(len);
+}
+
+/*
+ * LD A,?
+ */
+int lda(void)
+{
+ register int op;
+ register int i, len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (op = get_reg(p)) {
+ case REGA: /* LD A,A */
+ case REGB: /* LD A,B */
+ case REGC: /* LD A,C */
+ case REGD: /* LD A,D */
+ case REGE: /* LD A,E */
+ case REGH: /* LD A,H */
+ case REGL: /* LD A,L */
+ case REGIHL: /* LD A,(HL) */
+ len = 1;
+ ops[0] = 0x78 + op;
+ break;
+ case REGI: /* LD A,I */
+ len = 2;
+ ops[0] = 0xed;
+ ops[1] = 0x57;
+ break;
+ case REGR: /* LD A,R */
+ len = 2;
+ ops[0] = 0xed;
+ ops[1] = 0x5f;
+ break;
+ case REGIBC: /* LD A,(BC) */
+ len = 1;
+ ops[0] = 0x0a;
+ break;
+ case REGIDE: /* LD A,(DE) */
+ len = 1;
+ ops[0] = 0x1a;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(p, "(IX+", 4) == 0) { /* LD A,(IX+d) */
+ len = 3;
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0x7e;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ break;
+ }
+ if (strncmp(p, "(IY+", 4) == 0) { /* LD A,(IY+d) */
+ len = 3;
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0x7e;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ break;
+ }
+ if (*p == '(' && *(p + strlen(p) - 1) == ')') {
+ len = 3; /* LD A,(nn) */
+ if (pass == 2) {
+ i = calc_val(p + 1);
+ ops[0] = 0x3a;
+ ops[1] = i & 255;
+ ops[2] = i >> 8;
+ }
+ break;
+ }
+ len = 2; /* LD A,n */
+ if (pass == 2) {
+ ops[0] = 0x3e;
+ ops[1] = chk_v1(eval(p));
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * LD B,?
+ */
+int ldb(void)
+{
+ register int op;
+ register int len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (op = get_reg(p)) {
+ case REGA: /* LD B,A */
+ case REGB: /* LD B,B */
+ case REGC: /* LD B,C */
+ case REGD: /* LD B,D */
+ case REGE: /* LD B,E */
+ case REGH: /* LD B,H */
+ case REGL: /* LD B,L */
+ case REGIHL: /* LD B,(HL) */
+ len = 1;
+ ops[0] = 0x40 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(p, "(IX+", 4) == 0) { /* LD B,(IX+d) */
+ len = 3;
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0x46;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ break;
+ }
+ if (strncmp(p, "(IY+", 4) == 0) { /* LD B,(IY+d) */
+ len = 3;
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0x46;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ break;
+ }
+ len = 2; /* LD B,n */
+ if (pass == 2) {
+ ops[0] = 0x06;
+ ops[1] = chk_v1(eval(p));
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * LD C,?
+ */
+int ldc(void)
+{
+ register int op;
+ register int len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (op = get_reg(p)) {
+ case REGA: /* LD C,A */
+ case REGB: /* LD C,B */
+ case REGC: /* LD C,C */
+ case REGD: /* LD C,D */
+ case REGE: /* LD C,E */
+ case REGH: /* LD C,H */
+ case REGL: /* LD C,L */
+ case REGIHL: /* LD C,(HL) */
+ len = 1;
+ ops[0] = 0x48 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(p, "(IX+", 4) == 0) { /* LD C,(IX+d) */
+ len = 3;
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0x4e;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ break;
+ }
+ if (strncmp(p, "(IY+", 4) == 0) { /* LD C,(IY+d) */
+ len = 3;
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0x4e;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ break;
+ }
+ len = 2; /* LD C,n */
+ if (pass == 2) {
+ ops[0] = 0x0e;
+ ops[1] = chk_v1(eval(p));
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * LD D,?
+ */
+int ldd(void)
+{
+ register int op;
+ register int len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (op = get_reg(p)) {
+ case REGA: /* LD D,A */
+ case REGB: /* LD D,B */
+ case REGC: /* LD D,C */
+ case REGD: /* LD D,D */
+ case REGE: /* LD D,E */
+ case REGH: /* LD D,H */
+ case REGL: /* LD D,L */
+ case REGIHL: /* LD D,(HL) */
+ len = 1;
+ ops[0] = 0x50 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(p, "(IX+", 4) == 0) { /* LD D,(IX+d) */
+ len = 3;
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0x56;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ break;
+ }
+ if (strncmp(p, "(IY+", 4) == 0) { /* LD D,(IY+d) */
+ len = 3;
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0x56;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ break;
+ }
+ len = 2; /* LD D,n */
+ if (pass == 2) {
+ ops[0] = 0x16;
+ ops[1] = chk_v1(eval(p));
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * LD E,?
+ */
+int lde(void)
+{
+ register int op;
+ register int len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (op = get_reg(p)) {
+ case REGA: /* LD E,A */
+ case REGB: /* LD E,B */
+ case REGC: /* LD E,C */
+ case REGD: /* LD E,D */
+ case REGE: /* LD E,E */
+ case REGH: /* LD E,H */
+ case REGL: /* LD E,L */
+ case REGIHL: /* LD E,(HL) */
+ len = 1;
+ ops[0] = 0x58 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(p, "(IX+", 4) == 0) { /* LD E,(IX+d) */
+ len = 3;
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0x5e;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ break;
+ }
+ if (strncmp(p, "(IY+", 4) == 0) { /* LD E,(IY+d) */
+ len = 3;
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0x5e;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ break;
+ }
+ len = 2; /* LD E,n */
+ if (pass == 2) {
+ ops[0] = 0x1e;
+ ops[1] = chk_v1(eval(p));
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * LD H,?
+ */
+int ldh(void)
+{
+ register int op;
+ register int len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (op = get_reg(p)) {
+ case REGA: /* LD H,A */
+ case REGB: /* LD H,B */
+ case REGC: /* LD H,C */
+ case REGD: /* LD H,D */
+ case REGE: /* LD H,E */
+ case REGH: /* LD H,H */
+ case REGL: /* LD H,L */
+ case REGIHL: /* LD H,(HL) */
+ len = 1;
+ ops[0] = 0x60 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(p, "(IX+", 4) == 0) { /* LD H,(IX+d) */
+ len = 3;
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0x66;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ break;
+ }
+ if (strncmp(p, "(IY+", 4) == 0) { /* LD H,(IY+d) */
+ len = 3;
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0x66;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ break;
+ }
+ len = 2; /* LD H,n */
+ if (pass == 2) {
+ ops[0] = 0x26;
+ ops[1] = chk_v1(eval(p));
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * LD L,?
+ */
+int ldl(void)
+{
+ register int op;
+ register int len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (op = get_reg(p)) {
+ case REGA: /* LD L,A */
+ case REGB: /* LD L,B */
+ case REGC: /* LD L,C */
+ case REGD: /* LD L,D */
+ case REGE: /* LD L,E */
+ case REGH: /* LD L,H */
+ case REGL: /* LD L,L */
+ case REGIHL: /* LD L,(HL) */
+ len = 1;
+ ops[0] = 0x68 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(p, "(IX+", 4) == 0) { /* LD L,(IX+d) */
+ len = 3;
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0x6e;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ break;
+ }
+ if (strncmp(p, "(IY+", 4) == 0) { /* LD L,(IY+d) */
+ len = 3;
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0x6e;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ break;
+ }
+ len = 2; /* LD L,n */
+ if (pass == 2) {
+ ops[0] = 0x2e;
+ ops[1] = chk_v1(eval(p));
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * LD BC,?
+ */
+int ldbc(void)
+{
+ register int i, len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (get_reg(p)) {
+ case NOREG: /* operand isn't register */
+ if (*p == '(' && *(p + strlen(p) - 1) == ')') {
+ len = 4; /* LD BC,(nn) */
+ if (pass == 2) {
+ i = calc_val(p + 1);
+ ops[0] = 0xed;
+ ops[1] = 0x4b;
+ ops[2] = i & 0xff;
+ ops[3] = i >> 8;
+ }
+ break;
+ }
+ len = 3; /* LD BC,nn */
+ if (pass == 2) {
+ i = eval(p);
+ ops[0] = 0x01;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * LD DE,?
+ */
+int ldde(void)
+{
+ register int i, len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (get_reg(p)) {
+ case NOREG: /* operand isn't register */
+ if (*p == '(' && *(p + strlen(p) - 1) == ')') {
+ len = 4; /* LD DE,(nn) */
+ if (pass == 2) {
+ i = calc_val(p + 1);
+ ops[0] = 0xed;
+ ops[1] = 0x5b;
+ ops[2] = i & 0xff;
+ ops[3] = i >> 8;
+ }
+ break;
+ }
+ len = 3; /* LD DE,nn */
+ if (pass == 2) {
+ i = eval(p);
+ ops[0] = 0x11;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * LD HL,?
+ */
+int ldhl(void)
+{
+ register int i, len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (get_reg(p)) {
+ case NOREG: /* operand isn't register */
+ if (*p == '(' && *(p + strlen(p) - 1) == ')') {
+ len = 3; /* LD HL,(nn) */
+ if (pass == 2) {
+ i = calc_val(p + 1);
+ ops[0] = 0x2a;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ }
+ break;
+ }
+ len = 3; /* LD HL,nn */
+ if (pass == 2) {
+ i = eval(p);
+ ops[0] = 0x21;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * LD IX,?
+ */
+int ldix(void)
+{
+ register int i, len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (get_reg(p)) {
+ case NOREG: /* operand isn't register */
+ if (*p == '(' && *(p + strlen(p) - 1) == ')') {
+ len = 4; /* LD IX,(nn) */
+ if (pass == 2) {
+ i = calc_val(p + 1);
+ ops[0] = 0xdd;
+ ops[1] = 0x2a;
+ ops[2] = i & 0xff;
+ ops[3] = i >> 8;
+ }
+ break;
+ }
+ len = 4; /* LD IX,nn */
+ if (pass == 2) {
+ i = eval(p);
+ ops[0] = 0xdd;
+ ops[1] = 0x21;
+ ops[2] = i & 0xff;
+ ops[3] = i >> 8;
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * LD IY,?
+ */
+int ldiy(void)
+{
+ register int i, len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (get_reg(p)) {
+ case NOREG: /* operand isn't register */
+ if (*p == '(' && *(p + strlen(p) - 1) == ')') {
+ len = 4; /* LD IY,(nn) */
+ if (pass == 2) {
+ i = calc_val(p + 1);
+ ops[0] = 0xfd;
+ ops[1] = 0x2a;
+ ops[2] = i & 0xff;
+ ops[3] = i >> 8;
+ }
+ break;
+ }
+ len = 4; /* LD IY,nn */
+ if (pass == 2) {
+ i = eval(p);
+ ops[0] = 0xfd;
+ ops[1] = 0x21;
+ ops[2] = i & 0xff;
+ ops[3] = i >> 8;
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * LD SP,?
+ */
+int ldsp(void)
+{
+ register int i, len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (get_reg(p)) {
+ case REGHL: /* LD SP,HL */
+ len = 1;
+ ops[0] = 0xf9;
+ break;
+ case REGIX: /* LD SP,IX */
+ len = 2;
+ ops[0] = 0xdd;
+ ops[1] = 0xf9;
+ break;
+ case REGIY: /* LD SP,IY */
+ len = 2;
+ ops[0] = 0xfd;
+ ops[1] = 0xf9;
+ break;
+ case NOREG: /* operand isn't register */
+ if (*p == '(' && *(p + strlen(p) - 1) == ')') {
+ len = 4; /* LD SP,(nn) */
+ if (pass == 2) {
+ i = calc_val(p + 1);
+ ops[0] = 0xed;
+ ops[1] = 0x7b;
+ ops[2] = i & 0xff;
+ ops[3] = i >> 8;
+ }
+ break;
+ }
+ len = 3; /* LD SP,nn */
+ if (pass == 2) {
+ i = eval(p);
+ ops[0] = 0x31;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * LD (HL),?
+ */
+int ldihl(void)
+{
+ register int op;
+ register int len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (op = get_reg(p)) {
+ case REGA: /* LD (HL),A */
+ case REGB: /* LD (HL),B */
+ case REGC: /* LD (HL),C */
+ case REGD: /* LD (HL),D */
+ case REGE: /* LD (HL),E */
+ case REGH: /* LD (HL),H */
+ case REGL: /* LD (HL),L */
+ len = 1;
+ ops[0] = 0x70 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ len = 2; /* LD (HL),n */
+ if (pass == 2) {
+ ops[0] = 0x36;
+ ops[1] = chk_v1(eval(p));
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * LD (IX+d),?
+ */
+int ldiix(void)
+{
+ register int op;
+ register int len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (op = get_reg(p)) {
+ case REGA: /* LD (IX+d),A */
+ case REGB: /* LD (IX+d),B */
+ case REGC: /* LD (IX+d),C */
+ case REGD: /* LD (IX+d),D */
+ case REGE: /* LD (IX+d),E */
+ case REGH: /* LD (IX+d),H */
+ case REGL: /* LD (IX+d),L */
+ len = 3;
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0x70 + op;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ }
+ break;
+ case NOREG: /* LD (IX+d),n */
+ len = 4;
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0x36;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = chk_v1(eval(p));
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * LD (IY+d),?
+ */
+int ldiiy(void)
+{
+ register int op;
+ register int len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (op = get_reg(p)) {
+ case REGA: /* LD (IY+d),A */
+ case REGB: /* LD (IY+d),B */
+ case REGC: /* LD (IY+d),C */
+ case REGD: /* LD (IY+d),D */
+ case REGE: /* LD (IY+d),E */
+ case REGH: /* LD (IY+d),H */
+ case REGL: /* LD (IY+d),L */
+ len = 3;
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0x70 + op;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ }
+ break;
+ case NOREG: /* LD (IY+d),n */
+ len = 4;
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0x36;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = chk_v1(eval(p));
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * LD (nn),?
+ */
+int ldinn(void)
+{
+ register int i, len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (get_reg(p)) {
+ case REGA: /* LD (nn),A */
+ len = 3;
+ if (pass == 2) {
+ i = calc_val(operand + 1);
+ ops[0] = 0x32;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ }
+ break;
+ case REGBC: /* LD (nn),BC */
+ len = 4;
+ if (pass == 2) {
+ i = calc_val(operand + 1);
+ ops[0] = 0xed;
+ ops[1] = 0x43;
+ ops[2] = i & 0xff;
+ ops[3] = i >> 8;
+ }
+ break;
+ case REGDE: /* LD (nn),DE */
+ len = 4;
+ if (pass == 2) {
+ i = calc_val(operand + 1);
+ ops[0] = 0xed;
+ ops[1] = 0x53;
+ ops[2] = i & 0xff;
+ ops[3] = i >> 8;
+ }
+ break;
+ case REGHL: /* LD (nn),HL */
+ len = 3;
+ if (pass == 2) {
+ i = calc_val(operand + 1);
+ ops[0] = 0x22;
+ ops[1] = i & 0xff;
+ ops[2] = i >> 8;
+ }
+ break;
+ case REGSP: /* LD (nn),SP */
+ len = 4;
+ if (pass == 2) {
+ i = calc_val(operand + 1);
+ ops[0] = 0xed;
+ ops[1] = 0x73;
+ ops[2] = i & 0xff;
+ ops[3] = i >> 8;
+ }
+ break;
+ case REGIX: /* LD (nn),IX */
+ len = 4;
+ if (pass == 2) {
+ i = calc_val(operand + 1);
+ ops[0] = 0xdd;
+ ops[1] = 0x22;
+ ops[2] = i & 0xff;
+ ops[3] = i >> 8;
+ }
+ break;
+ case REGIY: /* LD (nn),IY */
+ len = 4;
+ if (pass == 2) {
+ i = calc_val(operand + 1);
+ ops[0] = 0xfd;
+ ops[1] = 0x22;
+ ops[2] = i & 0xff;
+ ops[3] = i >> 8;
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * ADD ?,?
+ */
+int op_add(void)
+{
+ register int len;
+ register char *p1, *p2;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ p1 = operand;
+ p2 = tmp;
+ while (*p1 != ',' && *p1 != '\0')
+ *p2++ = *p1++;
+ *p2 = '\0';
+ switch (get_reg(tmp)) {
+ case REGA: /* ADD A,? */
+ len = adda();
+ break;
+ case REGHL: /* ADD HL,? */
+ len = addhl();
+ break;
+ case REGIX: /* ADD IX,? */
+ len = addix();
+ break;
+ case REGIY: /* ADD IY,? */
+ len = addiy();
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * ADD A,?
+ */
+int adda(void)
+{
+ register int op;
+ register int len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (op = get_reg(p)) {
+ case REGA: /* ADD A,A */
+ case REGB: /* ADD A,B */
+ case REGC: /* ADD A,C */
+ case REGD: /* ADD A,D */
+ case REGE: /* ADD A,E */
+ case REGH: /* ADD A,H */
+ case REGL: /* ADD A,L */
+ case REGIHL: /* ADD A,(HL) */
+ len = 1;
+ ops[0] = 0x80 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(p, "(IX+", 4) == 0) {
+ len = 3; /* ADD A,(IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0x86;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ } else if (strncmp(p, "(IY+", 4) == 0) {
+ len = 3; /* ADD A,(IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0x86;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ } else {
+ len = 2; /* ADD A,n */
+ if (pass == 2) {
+ ops[0] = 0xc6;
+ ops[1] = chk_v1(eval(p));
+ }
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * ADD HL,?
+ */
+int addhl(void)
+{
+ switch (get_reg(get_second(operand))) {
+ case REGBC: /* ADD HL,BC */
+ ops[0] = 0x09;
+ break;
+ case REGDE: /* ADD HL,DE */
+ ops[0] = 0x19;
+ break;
+ case REGHL: /* ADD HL,HL */
+ ops[0] = 0x29;
+ break;
+ case REGSP: /* ADD HL,SP */
+ ops[0] = 0x39;
+ break;
+ case NOOPERA: /* missing operand */
+ ops[0] = 0;
+ ops[1] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ ops[0] = 0;
+ ops[1] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(1);
+}
+
+/*
+ * ADD IX,?
+ */
+int addix(void)
+{
+ switch (get_reg(get_second(operand))) {
+ case REGBC: /* ADD IX,BC */
+ ops[0] = 0xdd;
+ ops[1] = 0x09;
+ break;
+ case REGDE: /* ADD IX,DE */
+ ops[0] = 0xdd;
+ ops[1] = 0x19;
+ break;
+ case REGIX: /* ADD IX,IX */
+ ops[0] = 0xdd;
+ ops[1] = 0x29;
+ break;
+ case REGSP: /* ADD IX,SP */
+ ops[0] = 0xdd;
+ ops[1] = 0x39;
+ break;
+ case NOOPERA: /* missing operand */
+ ops[0] = 0;
+ ops[1] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ ops[0] = 0;
+ ops[1] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(2);
+}
+
+/*
+ * ADD IY,?
+ */
+int addiy(void)
+{
+ switch (get_reg(get_second(operand))) {
+ case REGBC: /* ADD IY,BC */
+ ops[0] = 0xfd;
+ ops[1] = 0x09;
+ break;
+ case REGDE: /* ADD IY,DE */
+ ops[0] = 0xfd;
+ ops[1] = 0x19;
+ break;
+ case REGIY: /* ADD IY,IY */
+ ops[0] = 0xfd;
+ ops[1] = 0x29;
+ break;
+ case REGSP: /* ADD IY,SP */
+ ops[0] = 0xfd;
+ ops[1] = 0x39;
+ break;
+ case NOOPERA: /* missing operand */
+ ops[0] = 0;
+ ops[1] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ ops[0] = 0;
+ ops[1] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(2);
+}
+
+/*
+ * ADC ?,?
+ */
+int op_adc(void)
+{
+ register int len;
+ register char *p1, *p2;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ p1 = operand;
+ p2 = tmp;
+ while (*p1 != ',' && *p1 != '\0')
+ *p2++ = *p1++;
+ *p2 = '\0';
+ switch (get_reg(tmp)) {
+ case REGA: /* ADC A,? */
+ len = adca();
+ break;
+ case REGHL: /* ADC HL,? */
+ len = adchl();
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * ADC A,?
+ */
+int adca(void)
+{
+ register int op;
+ register int len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (op = get_reg(p)) {
+ case REGA: /* ADC A,A */
+ case REGB: /* ADC A,B */
+ case REGC: /* ADC A,C */
+ case REGD: /* ADC A,D */
+ case REGE: /* ADC A,E */
+ case REGH: /* ADC A,H */
+ case REGL: /* ADC A,L */
+ case REGIHL: /* ADC A,(HL) */
+ len = 1;
+ ops[0] = 0x88 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(p, "(IX+", 4) == 0) {
+ len = 3; /* ADC A,(IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0x8e;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ } else if (strncmp(p, "(IY+", 4) == 0) {
+ len = 3; /* ADC A,(IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0x8e;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ } else {
+ len = 2; /* ADD A,n */
+ if (pass == 2) {
+ ops[0] = 0xce;
+ ops[1] = chk_v1(eval(p));
+ }
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * ADC HL,?
+ */
+int adchl(void)
+{
+ switch (get_reg(get_second(operand))) {
+ case REGBC: /* ADC HL,BC */
+ ops[0] = 0xed;
+ ops[1] = 0x4a;
+ break;
+ case REGDE: /* ADC HL,DE */
+ ops[0] = 0xed;
+ ops[1] = 0x5a;
+ break;
+ case REGHL: /* ADC HL,HL */
+ ops[0] = 0xed;
+ ops[1] = 0x6a;
+ break;
+ case REGSP: /* ADC HL,SP */
+ ops[0] = 0xed;
+ ops[1] = 0x7a;
+ break;
+ case NOOPERA: /* missing operand */
+ ops[0] = 0;
+ ops[1] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ ops[0] = 0;
+ ops[1] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(2);
+}
+
+/*
+ * SUB
+ */
+int op_sub(void)
+{
+ register int len, op;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ switch (op = get_reg(operand)) {
+ case REGA: /* SUB A */
+ case REGB: /* SUB B */
+ case REGC: /* SUB C */
+ case REGD: /* SUB D */
+ case REGE: /* SUB E */
+ case REGH: /* SUB H */
+ case REGL: /* SUB L */
+ case REGIHL: /* SUB (HL) */
+ len = 1;
+ ops[0] = 0x90 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(operand, "(IX+", 4) == 0) {
+ len = 3; /* SUB (IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0x96;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ }
+ } else if (strncmp(operand, "(IY+", 4) == 0) {
+ len = 3; /* SUB (IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0x96;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ }
+ } else {
+ len = 2; /* SUB n */
+ if (pass == 2) {
+ ops[0] = 0xd6;
+ ops[1] = chk_v1(eval(operand));
+ }
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * SBC ?,?
+ */
+int op_sbc(void)
+{
+ register int len;
+ register char *p1, *p2;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ p1 = operand;
+ p2 = tmp;
+ while (*p1 != ',' && *p1 != '\0')
+ *p2++ = *p1++;
+ *p2 = '\0';
+ switch (get_reg(tmp)) {
+ case REGA: /* SBC A,? */
+ len = sbca();
+ break;
+ case REGHL: /* SBC HL,? */
+ len = sbchl();
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * SBC A,?
+ */
+int sbca(void)
+{
+ register int op;
+ register int len;
+ register char *p;
+
+ p = get_second(operand);
+ switch (op = get_reg(p)) {
+ case REGA: /* SBC A,A */
+ case REGB: /* SBC A,B */
+ case REGC: /* SBC A,C */
+ case REGD: /* SBC A,D */
+ case REGE: /* SBC A,E */
+ case REGH: /* SBC A,H */
+ case REGL: /* SBC A,L */
+ case REGIHL: /* SBC A,(HL) */
+ len = 1;
+ ops[0] = 0x98 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(p, "(IX+", 4) == 0) {
+ len = 3; /* SBC A,(IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0x9e;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ } else if (strncmp(p, "(IY+", 4) == 0) {
+ len = 3; /* SBC A,(IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0x9e;
+ ops[2] = chk_v2(calc_val(strchr(p, '+') + 1));
+ }
+ } else {
+ len = 2; /* SBC A,n */
+ if (pass == 2) {
+ ops[0] = 0xde;
+ ops[1] = chk_v1(eval(p));
+ }
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * SBC HL,?
+ */
+int sbchl(void)
+{
+ switch (get_reg(get_second(operand))) {
+ case REGBC: /* SBC HL,BC */
+ ops[0] = 0xed;
+ ops[1] = 0x42;
+ break;
+ case REGDE: /* SBC HL,DE */
+ ops[0] = 0xed;
+ ops[1] = 0x52;
+ break;
+ case REGHL: /* SBC HL,HL */
+ ops[0] = 0xed;
+ ops[1] = 0x62;
+ break;
+ case REGSP: /* SBC HL,SP */
+ ops[0] = 0xed;
+ ops[1] = 0x72;
+ break;
+ case NOOPERA: /* missing operand */
+ ops[0] = 0;
+ ops[1] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ ops[0] = 0;
+ ops[1] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(2);
+}
+
+/*
+ * INC
+ */
+int op_inc(void)
+{
+ register int len, op;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ switch (op = get_reg(operand)) {
+ case REGA: /* INC A */
+ case REGB: /* INC B */
+ case REGC: /* INC C */
+ case REGD: /* INC D */
+ case REGE: /* INC E */
+ case REGH: /* INC H */
+ case REGL: /* INC L */
+ case REGIHL: /* INC (HL) */
+ len = 1;
+ ops[0] = 0x04 + (op << 3);
+ break;
+ case REGBC: /* INC BC */
+ len = 1;
+ ops[0] = 0x03;
+ break;
+ case REGDE: /* INC DE */
+ len = 1;
+ ops[0] = 0x13;
+ break;
+ case REGHL: /* INC HL */
+ len = 1;
+ ops[0] = 0x23;
+ break;
+ case REGSP: /* INC SP */
+ len = 1;
+ ops[0] = 0x33;
+ break;
+ case REGIX: /* INC IX */
+ len = 2;
+ ops[0] = 0xdd;
+ ops[1] = 0x23;
+ break;
+ case REGIY: /* INC IY */
+ len = 2;
+ ops[0] = 0xfd;
+ ops[1] = 0x23;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(operand, "(IX+", 4) == 0) {
+ len = 3; /* INC (IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0x34;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ }
+ } else if (strncmp(operand, "(IY+", 4) == 0) {
+ len = 3; /* INC (IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0x34;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ }
+ } else {
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * DEC
+ */
+int op_dec(void)
+{
+ register int len, op;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ switch (op = get_reg(operand)) {
+ case REGA: /* DEC A */
+ case REGB: /* DEC B */
+ case REGC: /* DEC C */
+ case REGD: /* DEC D */
+ case REGE: /* DEC E */
+ case REGH: /* DEC H */
+ case REGL: /* DEC L */
+ case REGIHL: /* DEC (HL) */
+ len = 1;
+ ops[0] = 0x05 + (op << 3);
+ break;
+ case REGBC: /* DEC BC */
+ len = 1;
+ ops[0] = 0x0b;
+ break;
+ case REGDE: /* DEC DE */
+ len = 1;
+ ops[0] = 0x1b;
+ break;
+ case REGHL: /* DEC HL */
+ len = 1;
+ ops[0] = 0x2b;
+ break;
+ case REGSP: /* DEC SP */
+ len = 1;
+ ops[0] = 0x3b;
+ break;
+ case REGIX: /* DEC IX */
+ len = 2;
+ ops[0] = 0xdd;
+ ops[1] = 0x2b;
+ break;
+ case REGIY: /* DEC IY */
+ len = 2;
+ ops[0] = 0xfd;
+ ops[1] = 0x2b;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(operand, "(IX+", 4) == 0) {
+ len = 3; /* DEC (IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0x35;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ }
+ } else if (strncmp(operand, "(IY+", 4) == 0) {
+ len = 3; /* DEC (IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0x35;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ }
+ } else {
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * OR
+ */
+int op_or(void)
+{
+ register int len, op;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ switch (op = get_reg(operand)) {
+ case REGA: /* OR A */
+ case REGB: /* OR B */
+ case REGC: /* OR C */
+ case REGD: /* OR D */
+ case REGE: /* OR E */
+ case REGH: /* OR H */
+ case REGL: /* OR L */
+ case REGIHL: /* OR (HL) */
+ len = 1;
+ ops[0] = 0xb0 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(operand, "(IX+", 4) == 0) {
+ len = 3; /* OR (IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0xb6;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ }
+ } else if (strncmp(operand, "(IY+", 4) == 0) {
+ len = 3; /* OR (IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0xb6;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ }
+ } else {
+ len = 2; /* OR n */
+ if (pass == 2) {
+ ops[0] = 0xf6;
+ ops[1] = chk_v1(eval(operand));
+ }
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * XOR
+ */
+int op_xor(void)
+{
+ register int len, op;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ switch (op = get_reg(operand)) {
+ case REGA: /* XOR A */
+ case REGB: /* XOR B */
+ case REGC: /* XOR C */
+ case REGD: /* XOR D */
+ case REGE: /* XOR E */
+ case REGH: /* XOR H */
+ case REGL: /* XOR L */
+ case REGIHL: /* XOR (HL) */
+ len = 1;
+ ops[0] = 0xa8 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(operand, "(IX+", 4) == 0) {
+ len = 3; /* XOR (IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0xae;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ }
+ } else if (strncmp(operand, "(IY+", 4) == 0) {
+ len = 3; /* XOR (IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0xae;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ }
+ } else {
+ len = 2; /* XOR n */
+ if (pass == 2) {
+ ops[0] = 0xee;
+ ops[1] = chk_v1(eval(operand));
+ }
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * AND
+ */
+int op_and(void)
+{
+ register int len, op;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ switch (op = get_reg(operand)) {
+ case REGA: /* AND A */
+ case REGB: /* AND B */
+ case REGC: /* AND C */
+ case REGD: /* AND D */
+ case REGE: /* AND E */
+ case REGH: /* AND H */
+ case REGL: /* AND L */
+ case REGIHL: /* AND (HL) */
+ len = 1;
+ ops[0] = 0xa0 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(operand, "(IX+", 4) == 0) {
+ len = 3; /* AND (IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0xa6;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ }
+ } else if (strncmp(operand, "(IY+", 4) == 0) {
+ len = 3; /* AND (IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0xa6;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ }
+ } else {
+ len = 2; /* AND n */
+ if (pass == 2) {
+ ops[0] = 0xe6;
+ ops[1] = chk_v1(eval(operand));
+ }
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * CP
+ */
+int op_cp(void)
+{
+ register int len, op;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ switch (op = get_reg(operand)) {
+ case REGA: /* CP A */
+ case REGB: /* CP B */
+ case REGC: /* CP C */
+ case REGD: /* CP D */
+ case REGE: /* CP E */
+ case REGH: /* CP H */
+ case REGL: /* CP L */
+ case REGIHL: /* CP (HL) */
+ len = 1;
+ ops[0] = 0xb8 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(operand, "(IX+", 4) == 0) {
+ len = 3; /* CP (IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0xbe;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ }
+ } else if (strncmp(operand, "(IY+", 4) == 0) {
+ len = 3; /* CP (IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0xbe;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ }
+ } else {
+ len = 2; /* OR n */
+ if (pass == 2) {
+ ops[0] = 0xfe;
+ ops[1] = chk_v1(eval(operand));
+ }
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * RL
+ */
+int op_rl(void)
+{
+ register int len, op;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ switch (op = get_reg(operand)) {
+ case REGA: /* RL A */
+ case REGB: /* RL B */
+ case REGC: /* RL C */
+ case REGD: /* RL D */
+ case REGE: /* RL E */
+ case REGH: /* RL H */
+ case REGL: /* RL L */
+ case REGIHL: /* RL (HL) */
+ len = 2;
+ ops[0] = 0xcb;
+ ops[1] = 0x10 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(operand, "(IX+", 4) == 0) {
+ len = 4; /* RL (IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0x16;
+ }
+ } else if (strncmp(operand, "(IY+", 4) == 0) {
+ len = 4; /* RL (IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0x16;
+ }
+ } else {
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * RR
+ */
+int op_rr(void)
+{
+ register int len, op;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ switch (op = get_reg(operand)) {
+ case REGA: /* RR A */
+ case REGB: /* RR B */
+ case REGC: /* RR C */
+ case REGD: /* RR D */
+ case REGE: /* RR E */
+ case REGH: /* RR H */
+ case REGL: /* RR L */
+ case REGIHL: /* RR (HL) */
+ len = 2;
+ ops[0] = 0xcb;
+ ops[1] = 0x18 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(operand, "(IX+", 4) == 0) {
+ len = 4; /* RR (IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0x1e;
+ }
+ } else if (strncmp(operand, "(IY+", 4) == 0) {
+ len = 4; /* RR (IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0x1e;
+ }
+ } else {
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * SLA
+ */
+int op_sla(void)
+{
+ register int len, op;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ switch (op = get_reg(operand)) {
+ case REGA: /* SLA A */
+ case REGB: /* SLA B */
+ case REGC: /* SLA C */
+ case REGD: /* SLA D */
+ case REGE: /* SLA E */
+ case REGH: /* SLA H */
+ case REGL: /* SLA L */
+ case REGIHL: /* SLA (HL) */
+ len = 2;
+ ops[0] = 0xcb;
+ ops[1] = 0x20 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(operand, "(IX+", 4) == 0) {
+ len = 4; /* SLA (IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0x26;
+ }
+ } else if (strncmp(operand, "(IY+", 4) == 0) {
+ len = 4; /* SLA (IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0x26;
+ }
+ } else {
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * SRA
+ */
+int op_sra(void)
+{
+ register int len, op;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ switch (op = get_reg(operand)) {
+ case REGA: /* SRA A */
+ case REGB: /* SRA B */
+ case REGC: /* SRA C */
+ case REGD: /* SRA D */
+ case REGE: /* SRA E */
+ case REGH: /* SRA H */
+ case REGL: /* SRA L */
+ case REGIHL: /* SRA (HL) */
+ len = 2;
+ ops[0] = 0xcb;
+ ops[1] = 0x28 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(operand, "(IX+", 4) == 0) {
+ len = 4; /* SRA (IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0x2e;
+ }
+ } else if (strncmp(operand, "(IY+", 4) == 0) {
+ len = 4; /* SRA (IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0x2e;
+ }
+ } else {
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * SRL
+ */
+int op_srl(void)
+{
+ register int len, op;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ switch (op = get_reg(operand)) {
+ case REGA: /* SRL A */
+ case REGB: /* SRL B */
+ case REGC: /* SRL C */
+ case REGD: /* SRL D */
+ case REGE: /* SRL E */
+ case REGH: /* SRL H */
+ case REGL: /* SRL L */
+ case REGIHL: /* SRL (HL) */
+ len = 2;
+ ops[0] = 0xcb;
+ ops[1] = 0x38 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(operand, "(IX+", 4) == 0) {
+ len = 4; /* SRL (IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0x3e;
+ }
+ } else if (strncmp(operand, "(IY+", 4) == 0) {
+ len = 4; /* SRL (IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0x3e;
+ }
+ } else {
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * RLC
+ */
+int op_rlc(void)
+{
+ register int len, op;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ switch (op = get_reg(operand)) {
+ case REGA: /* RLC A */
+ case REGB: /* RLC B */
+ case REGC: /* RLC C */
+ case REGD: /* RLC D */
+ case REGE: /* RLC E */
+ case REGH: /* RLC H */
+ case REGL: /* RLC L */
+ case REGIHL: /* RLC (HL) */
+ len = 2;
+ ops[0] = 0xcb;
+ ops[1] = 0x00 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(operand, "(IX+", 4) == 0) {
+ len = 4; /* RLC (IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0x06;
+ }
+ } else if (strncmp(operand, "(IY+", 4) == 0) {
+ len = 4; /* RLC (IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0x06;
+ }
+ } else {
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * RRC
+ */
+int op_rrc(void)
+{
+ register int len, op;
+
+ if (pass == 1)
+ if (*label)
+ put_label();
+ switch (op = get_reg(operand)) {
+ case REGA: /* RRC A */
+ case REGB: /* RRC B */
+ case REGC: /* RRC C */
+ case REGD: /* RRC D */
+ case REGE: /* RRC E */
+ case REGH: /* RRC H */
+ case REGL: /* RRC L */
+ case REGIHL: /* RRC (HL) */
+ len = 2;
+ ops[0] = 0xcb;
+ ops[1] = 0x08 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(operand, "(IX+", 4) == 0) {
+ len = 4; /* RRC (IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0x0e;
+ }
+ } else if (strncmp(operand, "(IY+", 4) == 0) {
+ len = 4; /* RRC (IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0x0e;
+ }
+ } else {
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ len = 1;
+ ops[0] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * OUT
+ */
+int op_out(void)
+{
+ register int op;
+
+ if (pass == 1) { /* PASS 1 */
+ if (*label)
+ put_label();
+ } else { /* PASS 2 */
+ if (strncmp(operand, "(C),", 4) == 0) {
+ switch(op = get_reg(get_second(operand))) {
+ case REGA: /* OUT (C),A */
+ case REGB: /* OUT (C),B */
+ case REGC: /* OUT (C),C */
+ case REGD: /* OUT (C),D */
+ case REGE: /* OUT (C),E */
+ case REGH: /* OUT (C),H */
+ case REGL: /* OUT (C),L */
+ ops[0] = 0xed;
+ ops[1] = 0x41 + (op << 3);
+ break;
+ case NOOPERA: /* missing operand */
+ ops[0] = 0;
+ ops[1] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ ops[0] = 0;
+ ops[1] = 0;
+ asmerr(E_ILLOPE);
+ }
+ } else {
+ ops[0] = 0xd3; /* OUT (n),A */
+ ops[1] = chk_v1(calc_val(operand + 1));
+ }
+ }
+ return(2);
+}
+
+/*
+ * IN
+ */
+int op_in(void)
+{
+ register char *p1, *p2;
+ register int op;
+
+ if (pass == 1) { /* PASS 1 */
+ if (*label)
+ put_label();
+ } else { /* PASS 2 */
+ p1 = operand;
+ p2 = tmp;
+ while (*p1 != ',' && *p1 != '\0')
+ *p2++ = *p1++;
+ *p2 = '\0';
+ switch (op = get_reg(tmp)) {
+ case REGA:
+ if (strncmp(operand, "A,(C)", 5) == 0) {
+ ops[0] = 0xed; /* IN A,(C) */
+ ops[1] = 0x78;
+ } else {
+ ops[0] = 0xdb; /* IN A,(n) */
+ ops[1] = chk_v1(calc_val(get_second(operand) + 1));
+ }
+ break;
+ case REGB: /* IN B,(C) */
+ case REGC: /* IN C,(C) */
+ case REGD: /* IN D,(C) */
+ case REGE: /* IN E,(C) */
+ case REGH: /* IN H,(C) */
+ case REGL: /* IN L,(C) */
+ ops[0] = 0xed;
+ ops[1] = 0x40 + (op << 3);
+ break;
+ default: /* invalid operand */
+ ops[0] = 0;
+ ops[1] = 0;
+ asmerr(E_ILLOPE);
+ }
+ }
+ return(2);
+}
+
+/*
+ * SET
+ */
+int op_set(void)
+{
+ register char *p1, *p2;
+ register int len;
+ register int i;
+ register int op;
+
+ len = 2;
+ i = 0;
+ if (pass == 1)
+ if (*label)
+ put_label();
+ ops[0] = 0xcb;
+ p1 = operand;
+ p2 = tmp;
+ while (*p1 != ',' && *p1 != '\0')
+ *p2++ = *p1++;
+ *p2 = '\0';
+ if (pass == 2) {
+ i = eval(tmp);
+ if (i < 0 || i > 7)
+ asmerr(E_VALOUT);
+ }
+ switch (op = get_reg(++p1)) {
+ case REGA: /* SET n,A */
+ case REGB: /* SET n,B */
+ case REGC: /* SET n,C */
+ case REGD: /* SET n,D */
+ case REGE: /* SET n,E */
+ case REGH: /* SET n,H */
+ case REGL: /* SET n,L */
+ case REGIHL: /* SET n,(HL) */
+ ops[1] = 0xc0 + i * 8 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(p1, "(IX+", 4) == 0) {
+ len = 4; /* SET n,(IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0xc6 + i * 8;
+ }
+ } else if (strncmp(p1, "(IY+", 4) == 0) {
+ len = 4; /* SET n,(IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0xc6 + i * 8;
+ }
+ } else {
+ ops[1] = 0;
+ asmerr(E_ILLOPE);
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ ops[1] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ ops[1] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * RES
+ */
+int op_res(void)
+{
+ register char *p1, *p2;
+ register int len;
+ register int i;
+ register int op;
+
+ len = 2;
+ i = 0;
+ if (pass == 1)
+ if (*label)
+ put_label();
+ ops[0] = 0xcb;
+ p1 = operand;
+ p2 = tmp;
+ while (*p1 != ',' && *p1 != '\0')
+ *p2++ = *p1++;
+ *p2 = '\0';
+ if (pass == 2) {
+ i = eval(tmp);
+ if (i < 0 || i > 7)
+ asmerr(E_VALOUT);
+ }
+ switch (op = get_reg(++p1)) {
+ case REGA: /* RES n,A */
+ case REGB: /* RES n,B */
+ case REGC: /* RES n,C */
+ case REGD: /* RES n,D */
+ case REGE: /* RES n,E */
+ case REGH: /* RES n,H */
+ case REGL: /* RES n,L */
+ case REGIHL: /* RES n,(HL) */
+ ops[1] = 0x80 + i * 8 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(p1, "(IX+", 4) == 0) {
+ len = 4; /* RES n,(IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0x86 + i * 8;
+ }
+ } else if (strncmp(p1, "(IY+", 4) == 0) {
+ len = 4; /* RES n,(IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0x86 + i * 8;
+ }
+ } else {
+ ops[1] = 0;
+ asmerr(E_ILLOPE);
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ ops[1] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ ops[1] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * BIT
+ */
+int op_bit(void)
+{
+ register char *p1, *p2;
+ register int len;
+ register int i;
+ register int op;
+
+ len = 2;
+ i = 0;
+ if (pass == 1)
+ if (*label)
+ put_label();
+ ops[0] = 0xcb;
+ p1 = operand;
+ p2 = tmp;
+ while (*p1 != ',' && *p1 != '\0')
+ *p2++ = *p1++;
+ *p2 = '\0';
+ if (pass == 2) {
+ i = eval(tmp);
+ if (i < 0 || i > 7)
+ asmerr(E_VALOUT);
+ }
+ switch (op = get_reg(++p1)) {
+ case REGA: /* BIT n,A */
+ case REGB: /* BIT n,B */
+ case REGC: /* BIT n,C */
+ case REGD: /* BIT n,D */
+ case REGE: /* BIT n,E */
+ case REGH: /* BIT n,H */
+ case REGL: /* BIT n,L */
+ case REGIHL: /* BIT n,(HL) */
+ ops[1] = 0x40 + i * 8 + op;
+ break;
+ case NOREG: /* operand isn't register */
+ if (strncmp(p1, "(IX+", 4) == 0) {
+ len = 4; /* BIT n,(IX+d) */
+ if (pass == 2) {
+ ops[0] = 0xdd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0x46 + i * 8;
+ }
+ } else if (strncmp(p1, "(IY+", 4) == 0) {
+ len = 4; /* BIT n,(IY+d) */
+ if (pass == 2) {
+ ops[0] = 0xfd;
+ ops[1] = 0xcb;
+ ops[2] = chk_v2(calc_val(strchr(operand, '+') + 1));
+ ops[3] = 0x46 + i * 8;
+ }
+ } else {
+ ops[1] = 0;
+ asmerr(E_ILLOPE);
+ }
+ break;
+ case NOOPERA: /* missing operand */
+ ops[1] = 0;
+ asmerr(E_MISOPE);
+ break;
+ default: /* invalid operand */
+ ops[1] = 0;
+ asmerr(E_ILLOPE);
+ }
+ return(len);
+}
+
+/*
+ * returns a pointer to the second operand for
+ * opcodes: opcode destination,source
+ * if source is missing returns NULL
+ */
+char *get_second(char *s)
+{
+ register char *p;
+
+ if ((p = strchr(s, ',')) != NULL)
+ return(p + 1);
+ else
+ return(NULL);
+}
+
+/*
+ * computes value of expressions in offsets:
+ * LD A,(IX+7)
+ * --
+ */
+int calc_val(char *s)
+{
+ register char *p;
+ register int i;
+
+ if ((p = strrchr(s, ')')) == NULL) {
+ asmerr(E_MISPAR);
+ return(0);
+ }
+ i = p - s;
+ strncpy(tmp, s, i);
+ *(tmp + i) = '\0';
+ return(eval(tmp));
+}
diff --git a/emu/z80pack-1.9/z80asm/z80atab.c b/emu/z80pack-1.9/z80asm/z80atab.c
new file mode 100644
index 0000000..4cb4f9f
--- /dev/null
+++ b/emu/z80pack-1.9/z80asm/z80atab.c
@@ -0,0 +1,255 @@
+/*
+ * Z80 - Assembler
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 17-SEP-1987 Development under Digital Research CP/M 2.2
+ * 28-JUN-1988 Switched to Unix System V.3
+ * 22-OCT-2006 changed to ANSI C for modern POSIX OS's
+ */
+
+/*
+ * module with table oprations on opcode and symbol tables
+ */
+
+#include
+#include
+#include
+#include "z80a.h"
+#include "z80aglb.h"
+
+extern void fatal(int, char *);
+extern void asmerr(int);
+
+/*
+ * binary search in sorted table opctab
+ *
+ * Input: pointer to string with opcode
+ *
+ * Output: pointer to table element, or NULL if not found
+ */
+struct opc *search_op(char *op_name)
+{
+ register int cond;
+ register struct opc *low, *high, *mid;
+
+ low = &opctab[0];
+ high = &opctab[no_opcodes - 1];
+ while (low <= high) {
+ mid = low + (high - low) / 2;
+ if ((cond = strcmp(op_name, mid->op_name)) < 0)
+ high = mid - 1;
+ else if (cond > 0)
+ low = mid + 1;
+ else
+ return(mid);
+ }
+ return(NULL);
+}
+
+/*
+ * binary search on sorted table opetab
+ *
+ * Input: pointer to string with operand
+ *
+ * Output: symbol for operand, NOOPERA if empty operand,
+ * NOREG if operand not found
+ */
+int get_reg(char *s)
+{
+ register int cond;
+ register struct ope *low, *high, *mid;
+
+ if (s == NULL || *s == '\0')
+ return(NOOPERA);
+ low = &opetab[0];
+ high = &opetab[no_operands - 1];
+ while (low <= high) {
+ mid = low + (high - low) / 2;
+ if ((cond = strcmp(s, mid->ope_name)) < 0)
+ high = mid - 1;
+ else if (cond > 0)
+ low = mid + 1;
+ else
+ return(mid->ope_sym);
+ }
+ return(NOREG);
+}
+
+/*
+ * hash search on symbol table symtab
+ *
+ * Input: pointer to string with symbol
+ *
+ * Output: pointer to table element, or NULL if not found
+ */
+struct sym *get_sym(char *sym_name)
+{
+ register struct sym *np;
+
+ for (np = symtab[hash(sym_name)]; np != NULL; np = np->sym_next)
+ if (strcmp(sym_name, np->sym_name) == 0)
+ return(np);
+ return(NULL);
+}
+
+/*
+ * add symbol to symbol table symtab, or modify existing symbol
+ *
+ * Input: sym_name pointer to string with symbol name
+ * sym_wert value of symbol
+ *
+ * Output: 0 symbol added/modified
+ * 1 out of memory
+ */
+int put_sym(char *sym_name, int sym_wert)
+{
+ struct sym *get_sym();
+ register int hashval;
+ register struct sym *np;
+
+ char *strsave(char *);
+
+ if (!gencode)
+ return(0);
+ if ((np = get_sym(sym_name)) == NULL) {
+ np = (struct sym *) malloc(sizeof (struct sym));
+ if (np == NULL)
+ return(1);
+ if ((np->sym_name = strsave(sym_name)) == NULL)
+ return(1);
+ hashval = hash(sym_name);
+ np->sym_next = symtab[hashval];
+ symtab[hashval] = np;
+ }
+ np->sym_wert = sym_wert;
+ return(0);
+}
+
+/*
+ * add label to symbol table, error if symbol already exists
+ */
+void put_label(void)
+{
+ struct sym *get_sym(char *);
+
+ if (get_sym(label) == NULL) {
+ if (put_sym(label, pc))
+ fatal(F_OUTMEM, "symbols");
+ } else
+ asmerr(E_MULSYM);
+}
+
+/*
+ * hash algorithm
+ *
+ * Input: pointer to string with name
+ *
+ * Output: hash value
+ */
+int hash(char *name)
+{
+ register int hashval;
+
+ for (hashval = 0; *name;)
+ hashval += *name++;
+ return(hashval % HASHSIZE);
+}
+
+/*
+ * save string into allocated memory
+ *
+ * Input: pointer to string
+ *
+ * Output: pointer to allocated memory with string
+ */
+char *strsave(char *s)
+{
+ register char *p;
+
+ if ((p = malloc((unsigned) strlen(s)+1)) != NULL)
+ strcpy(p, s);
+ return(p);
+}
+
+/*
+ * copy whole symbol hast table into allocated pointer array
+ * used for sorting the symbol table later
+ */
+int copy_sym(void)
+{
+ register int i, j;
+ register struct sym *np;
+
+ symarray = (struct sym **) malloc(SYMINC * sizeof(struct sym *));
+ if (symarray == NULL)
+ fatal(F_OUTMEM, "sorting symbol table");
+ symsize = SYMINC;
+ for (i = 0, j = 0; i < HASHSIZE; i++) {
+ if (symtab[i] != NULL) {
+ for (np = symtab[i]; np != NULL; np = np->sym_next) {
+ symarray[j++] = np;
+ if (j == symsize) {
+ symarray = (struct sym **) realloc((char *) symarray, symsize * sizeof(struct sym *) + SYMINC * sizeof(struct sym *));
+ if (symarray == NULL)
+ fatal(F_OUTMEM, "sorting symbol table");
+ symsize += SYMINC;
+ }
+ }
+ }
+ }
+ return(j);
+}
+
+/*
+ * sort symbol table by name
+ */
+void n_sort_sym(int len)
+{
+ register int gap, i, j;
+ register struct sym *temp;
+
+ for (gap = len/2; gap > 0; gap /= 2)
+ for (i = gap; i < len; i++)
+ for (j = i-gap; j >= 0; j -= gap) {
+ if (strcmp(symarray[j]->sym_name,
+ symarray[j+gap]->sym_name) <= 0)
+ break;
+ temp = symarray[j];
+ symarray[j] = symarray[j+gap];
+ symarray[j+gap] = temp;
+ }
+}
+
+/*
+ * sort symbol table by address
+ */
+void a_sort_sym(int len)
+{
+ register int gap, i, j;
+ register struct sym *temp;
+
+ for (gap = len/2; gap > 0; gap /= 2)
+ for (i = gap; i < len; i++)
+ for (j = i-gap; j >= 0; j -= gap) {
+ if (numcmp(symarray[j]->sym_wert,
+ symarray[j+gap]->sym_wert) <= 0)
+ break;
+ temp = symarray[j];
+ symarray[j] = symarray[j+gap];
+ symarray[j+gap] = temp;
+ }
+}
+
+/*
+ * compares two 16bit values, result like strcmp()
+ */
+int numcmp(int n1, int n2)
+{
+ if ((unsigned) (n1 & 0xffff) < (unsigned) (n2 & 0xffff))
+ return(-1);
+ else if ((unsigned) (n1 & 0xffff) > (unsigned) (n2 & 0xffff))
+ return(1);
+ else
+ return(0);
+}
diff --git a/emu/z80pack-1.9/z80sim/Makefile b/emu/z80pack-1.9/z80sim/Makefile
new file mode 100644
index 0000000..ea9022b
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/Makefile
@@ -0,0 +1,70 @@
+# Makefile for Z80-CPU emulator unter UNIX System V
+
+CFLAGS= -O -c -Wall
+LFLAGS= -s
+
+#CFLAGS= -g -c -Wall
+#LFLAGS=
+
+OBJ = sim0.o \
+ sim1.o \
+ sim2.o \
+ sim3.o \
+ sim4.o \
+ sim5.o \
+ sim6.o \
+ sim7.o \
+ simctl.o \
+ disas.o \
+ simint.o \
+ iosim.o \
+ simfun.o \
+ simglb.o
+
+z80sim : $(OBJ)
+ cc $(OBJ) $(LFLAGS) -o z80sim
+
+sim0.o : sim0.c sim.h simglb.h
+ cc $(CFLAGS) sim0.c
+
+sim1.o : sim1.c sim.h simglb.h
+ cc $(CFLAGS) sim1.c
+
+sim2.o : sim2.c sim.h simglb.h
+ cc $(CFLAGS) sim2.c
+
+sim3.o : sim3.c sim.h simglb.h
+ cc $(CFLAGS) sim3.c
+
+sim4.o : sim4.c sim.h simglb.h
+ cc $(CFLAGS) sim4.c
+
+sim5.o : sim5.c sim.h simglb.h
+ cc $(CFLAGS) sim5.c
+
+sim6.o : sim6.c sim.h simglb.h
+ cc $(CFLAGS) sim6.c
+
+sim7.o : sim7.c sim.h simglb.h
+ cc $(CFLAGS) sim7.c
+
+simctl.o : simctl.c sim.h simglb.h
+ cc $(CFLAGS) simctl.c
+
+disas.o : disas.c
+ cc $(CFLAGS) disas.c
+
+simint.o : simint.c sim.h simglb.h
+ cc $(CFLAGS) simint.c
+
+iosim.o : iosim.c sim.h simglb.h
+ cc $(CFLAGS) iosim.c
+
+simfun.o : simfun.c sim.h
+ cc $(CFLAGS) simfun.c
+
+simglb.o : simglb.c sim.h
+ cc $(CFLAGS) simglb.c
+
+clean:
+ rm -f *.o core z80sim
diff --git a/emu/z80pack-1.9/z80sim/disas.c b/emu/z80pack-1.9/z80sim/disas.c
new file mode 100644
index 0000000..b7e426c
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/disas.c
@@ -0,0 +1,883 @@
+/*
+ * Z80 disassembler for Z80-CPU simulator
+ *
+ * Copyright (C) 1989-2006 by Udo Munk
+ *
+ * History:
+ * 06-DEC-89 Development on TARGON/35 with AT&T Unix System V.3
+ * 07-APR-92 forget to implement Op-Codes LD A,R and LD R,A, added
+ * 25-JUN-92 comments in english
+ * 03-OCT-06 changed to ANSI C for modern POSIX OS's
+ */
+
+#include
+
+/*
+ * Forward declarations
+ */
+static int opout(char *, char **);
+static int nout(char *, unsigned char **);
+static int iout(char *, unsigned char **);
+static int rout(char *, char **);
+static int nnout(char *, unsigned char **);
+static int inout(char *, unsigned char **);
+static int cbop(char *, unsigned char **);
+static int edop(char *, unsigned char **);
+static int ddfd(char *, unsigned char **);
+
+/*
+ * Op-code tables
+ */
+struct opt {
+ int (*fun) ();
+ char *text;
+};
+
+static struct opt optab[256] = {
+ { opout, "NOP" }, /* 0x00 */
+ { nnout, "LD\tBC," }, /* 0x01 */
+ { opout, "LD\t(BC),A" }, /* 0x02 */
+ { opout, "INC\tBC" }, /* 0x03 */
+ { opout, "INC\tB" }, /* 0x04 */
+ { opout, "DEC\tB" }, /* 0x05 */
+ { nout, "LD\tB," }, /* 0x06 */
+ { opout, "RLCA" }, /* 0x07 */
+ { opout, "EX\tAF,AF'" }, /* 0x08 */
+ { opout, "ADD\tHL,BC" }, /* 0x09 */
+ { opout, "LD\tA,(BC)" }, /* 0x0a */
+ { opout, "DEC\tBC" }, /* 0x0b */
+ { opout, "INC\tC" }, /* 0x0c */
+ { opout, "DEC\tC" }, /* 0x0d */
+ { nout, "LD\tC," }, /* 0x0e */
+ { opout, "RRCA" }, /* 0x0f */
+ { rout, "DJNZ\t" }, /* 0x10 */
+ { nnout, "LD\tDE," }, /* 0x11 */
+ { opout, "LD\t(DE),A" }, /* 0x12 */
+ { opout, "INC\tDE" }, /* 0x13 */
+ { opout, "INC\tD" }, /* 0x14 */
+ { opout, "DEC\tD" }, /* 0x15 */
+ { nout, "LD\tD," }, /* 0x16 */
+ { opout, "RLA" }, /* 0x17 */
+ { rout, "JR\t" }, /* 0x18 */
+ { opout, "ADD\tHL,DE" }, /* 0x19 */
+ { opout, "LD\tA,(DE)" }, /* 0x1a */
+ { opout, "DEC\tDE" }, /* 0x1b */
+ { opout, "INC\tE" }, /* 0x1c */
+ { opout, "DEC\tE" }, /* 0x1d */
+ { nout, "LD\tE," }, /* 0x1e */
+ { opout, "RRA" }, /* 0x1f */
+ { rout, "JR\tNZ," }, /* 0x20 */
+ { nnout, "LD\tHL," }, /* 0x21 */
+ { inout, "LD\t(%04x),HL" }, /* 0x22 */
+ { opout, "INC\tHL" }, /* 0x23 */
+ { opout, "INC\tH" }, /* 0x24 */
+ { opout, "DEC\tH" }, /* 0x25 */
+ { nout, "LD\tH," }, /* 0x26 */
+ { opout, "DAA" }, /* 0x27 */
+ { rout, "JR\tZ," }, /* 0x28 */
+ { opout, "ADD\tHL,HL" }, /* 0x29 */
+ { inout, "LD\tHL,(%04x)" }, /* 0x2a */
+ { opout, "DEC\tHL" }, /* 0x2b */
+ { opout, "INC\tL" }, /* 0x2c */
+ { opout, "DEC\tL" }, /* 0x2d */
+ { nout, "LD\tL," }, /* 0x2e */
+ { opout, "CPL" }, /* 0x2f */
+ { rout, "JR\tNC," }, /* 0x30 */
+ { nnout, "LD\tSP," }, /* 0x31 */
+ { inout, "LD\t(%04x),A" }, /* 0x32 */
+ { opout, "INC\tSP" }, /* 0x33 */
+ { opout, "INC\t(HL)" }, /* 0x34 */
+ { opout, "DEC\t(HL)" }, /* 0x35 */
+ { nout, "LD\t(HL)," }, /* 0x36 */
+ { opout, "SCF" }, /* 0x37 */
+ { rout, "JR\tC," }, /* 0x38 */
+ { opout, "ADD\tHL,SP" }, /* 0x39 */
+ { inout, "LD\tA,(%04x)" }, /* 0x3a */
+ { opout, "DEC\tSP" }, /* 0x3b */
+ { opout, "INC\tA" }, /* 0x3c */
+ { opout, "DEC\tA" }, /* 0x3d */
+ { nout, "LD\tA," }, /* 0x3e */
+ { opout, "CCF" }, /* 0x3f */
+ { opout, "LD\tB,B" }, /* 0x40 */
+ { opout, "LD\tB,C" }, /* 0x41 */
+ { opout, "LD\tB,D" }, /* 0x42 */
+ { opout, "LD\tB,E" }, /* 0x43 */
+ { opout, "LD\tB,H" }, /* 0x44 */
+ { opout, "LD\tB,L" }, /* 0x45 */
+ { opout, "LD\tB,(HL)" }, /* 0x46 */
+ { opout, "LD\tB,A" }, /* 0x47 */
+ { opout, "LD\tC,B" }, /* 0x48 */
+ { opout, "LD\tC,C" }, /* 0x49 */
+ { opout, "LD\tC,D" }, /* 0x4a */
+ { opout, "LD\tC,E" }, /* 0x4b */
+ { opout, "LD\tC,H" }, /* 0x4c */
+ { opout, "LD\tC,L" }, /* 0x4d */
+ { opout, "LD\tC,(HL)" }, /* 0x4e */
+ { opout, "LD\tC,A" }, /* 0x4f */
+ { opout, "LD\tD,B" }, /* 0x50 */
+ { opout, "LD\tD,C" }, /* 0x51 */
+ { opout, "LD\tD,D" }, /* 0x52 */
+ { opout, "LD\tD,E" }, /* 0x53 */
+ { opout, "LD\tD,H" }, /* 0x54 */
+ { opout, "LD\tD,L" }, /* 0x55 */
+ { opout, "LD\tD,(HL)" }, /* 0x56 */
+ { opout, "LD\tD,A" }, /* 0x57 */
+ { opout, "LD\tE,B" }, /* 0x58 */
+ { opout, "LD\tE,C" }, /* 0x59 */
+ { opout, "LD\tE,D" }, /* 0x5a */
+ { opout, "LD\tE,E" }, /* 0x5b */
+ { opout, "LD\tE,H" }, /* 0x5c */
+ { opout, "LD\tE,L" }, /* 0x5d */
+ { opout, "LD\tE,(HL)" }, /* 0x5e */
+ { opout, "LD\tE,A" }, /* 0x5f */
+ { opout, "LD\tH,B" }, /* 0x60 */
+ { opout, "LD\tH,C" }, /* 0x61 */
+ { opout, "LD\tH,D" }, /* 0x62 */
+ { opout, "LD\tH,E" }, /* 0x63 */
+ { opout, "LD\tH,H" }, /* 0x64 */
+ { opout, "LD\tH,L" }, /* 0x65 */
+ { opout, "LD\tH,(HL)" }, /* 0x66 */
+ { opout, "LD\tH,A" }, /* 0x67 */
+ { opout, "LD\tL,B" }, /* 0x68 */
+ { opout, "LD\tL,C" }, /* 0x69 */
+ { opout, "LD\tL,D" }, /* 0x6a */
+ { opout, "LD\tL,E" }, /* 0x6b */
+ { opout, "LD\tL,H" }, /* 0x6c */
+ { opout, "LD\tL,L" }, /* 0x6d */
+ { opout, "LD\tL,(HL)" }, /* 0x6e */
+ { opout, "LD\tL,A" }, /* 0x6f */
+ { opout, "LD\t(HL),B" }, /* 0x70 */
+ { opout, "LD\t(HL),C" }, /* 0x71 */
+ { opout, "LD\t(HL),D" }, /* 0x72 */
+ { opout, "LD\t(HL),E" }, /* 0x73 */
+ { opout, "LD\t(HL),H" }, /* 0x74 */
+ { opout, "LD\t(HL),L" }, /* 0x75 */
+ { opout, "HALT" }, /* 0x76 */
+ { opout, "LD\t(HL),A" }, /* 0x77 */
+ { opout, "LD\tA,B" }, /* 0x78 */
+ { opout, "LD\tA,C" }, /* 0x79 */
+ { opout, "LD\tA,D" }, /* 0x7a */
+ { opout, "LD\tA,E" }, /* 0x7b */
+ { opout, "LD\tA,H" }, /* 0x7c */
+ { opout, "LD\tA,L" }, /* 0x7d */
+ { opout, "LD\tA,(HL)" }, /* 0x7e */
+ { opout, "LD\tA,A" }, /* 0x7f */
+ { opout, "ADD\tA,B" }, /* 0x80 */
+ { opout, "ADD\tA,C" }, /* 0x81 */
+ { opout, "ADD\tA,D" }, /* 0x82 */
+ { opout, "ADD\tA,E" }, /* 0x83 */
+ { opout, "ADD\tA,H" }, /* 0x84 */
+ { opout, "ADD\tA,L" }, /* 0x85 */
+ { opout, "ADD\tA,(HL)" }, /* 0x86 */
+ { opout, "ADD\tA,A" }, /* 0x87 */
+ { opout, "ADC\tA,B" }, /* 0x88 */
+ { opout, "ADC\tA,C" }, /* 0x89 */
+ { opout, "ADC\tA,D" }, /* 0x8a */
+ { opout, "ADC\tA,E" }, /* 0x8b */
+ { opout, "ADC\tA,H" }, /* 0x8c */
+ { opout, "ADC\tA,L" }, /* 0x8d */
+ { opout, "ADC\tA,(HL)" }, /* 0x8e */
+ { opout, "ADC\tA,A" }, /* 0x8f */
+ { opout, "SUB\tB" }, /* 0x90 */
+ { opout, "SUB\tC" }, /* 0x91 */
+ { opout, "SUB\tD" }, /* 0x92 */
+ { opout, "SUB\tE" }, /* 0x93 */
+ { opout, "SUB\tH" }, /* 0x94 */
+ { opout, "SUB\tL" }, /* 0x95 */
+ { opout, "SUB\t(HL)" }, /* 0x96 */
+ { opout, "SUB\tA" }, /* 0x97 */
+ { opout, "SBC\tA,B" }, /* 0x98 */
+ { opout, "SBC\tA,C" }, /* 0x99 */
+ { opout, "SBC\tA,D" }, /* 0x9a */
+ { opout, "SBC\tA,E" }, /* 0x9b */
+ { opout, "SBC\tA,H" }, /* 0x9c */
+ { opout, "SBC\tA,L" }, /* 0x9d */
+ { opout, "SBC\tA,(HL)" }, /* 0x9e */
+ { opout, "SBC\tA,A" }, /* 0x9f */
+ { opout, "AND\tB" }, /* 0xa0 */
+ { opout, "AND\tC" }, /* 0xa1 */
+ { opout, "AND\tD" }, /* 0xa2 */
+ { opout, "AND\tE" }, /* 0xa3 */
+ { opout, "AND\tH" }, /* 0xa4 */
+ { opout, "AND\tL" }, /* 0xa5 */
+ { opout, "AND\t(HL)" }, /* 0xa6 */
+ { opout, "AND\tA" }, /* 0xa7 */
+ { opout, "XOR\tB" }, /* 0xa8 */
+ { opout, "XOR\tC" }, /* 0xa9 */
+ { opout, "XOR\tD" }, /* 0xaa */
+ { opout, "XOR\tE" }, /* 0xab */
+ { opout, "XOR\tH" }, /* 0xac */
+ { opout, "XOR\tL" }, /* 0xad */
+ { opout, "XOR\t(HL)" }, /* 0xae */
+ { opout, "XOR\tA" }, /* 0xaf */
+ { opout, "OR\tB" }, /* 0xb0 */
+ { opout, "OR\tC" }, /* 0xb1 */
+ { opout, "OR\tD" }, /* 0xb2 */
+ { opout, "OR\tE" }, /* 0xb3 */
+ { opout, "OR\tH" }, /* 0xb4 */
+ { opout, "OR\tL" }, /* 0xb5 */
+ { opout, "OR\t(HL)" }, /* 0xb6 */
+ { opout, "OR\tA" }, /* 0xb7 */
+ { opout, "CP\tB" }, /* 0xb8 */
+ { opout, "CP\tC" }, /* 0xb9 */
+ { opout, "CP\tD" }, /* 0xba */
+ { opout, "CP\tE" }, /* 0xbb */
+ { opout, "CP\tH" }, /* 0xbc */
+ { opout, "CP\tL" }, /* 0xbd */
+ { opout, "CP\t(HL)" }, /* 0xbe */
+ { opout, "CP\tA" }, /* 0xbf */
+ { opout, "RET\tNZ" }, /* 0xc0 */
+ { opout, "POP\tBC" }, /* 0xc1 */
+ { nnout, "JP\tNZ," }, /* 0xc2 */
+ { nnout, "JP\t" }, /* 0xc3 */
+ { nnout, "CALL\tNZ," }, /* 0xc4 */
+ { opout, "PUSH\tBC" }, /* 0xc5 */
+ { nout, "ADD\tA," }, /* 0xc6 */
+ { opout, "RST\t0" }, /* 0xc7 */
+ { opout, "RET\tZ" }, /* 0xc8 */
+ { opout, "RET" }, /* 0xc9 */
+ { nnout, "JP\tZ," }, /* 0xca */
+ { cbop, "" }, /* 0xcb */
+ { nnout, "CALL\tZ," }, /* 0xcc */
+ { nnout, "CALL\t" }, /* 0xcd */
+ { nout, "ADC\tA," }, /* 0xce */
+ { opout, "RST\t8" }, /* 0xcf */
+ { opout, "RET\tNC" }, /* 0xd0 */
+ { opout, "POP\tDE" }, /* 0xd1 */
+ { nnout, "JP\tNC," }, /* 0xd2 */
+ { iout, "OUT\t(%02x),A" }, /* 0xd3 */
+ { nnout, "CALL\tNC," }, /* 0xd4 */
+ { opout, "PUSH\tDE" }, /* 0xd5 */
+ { nout, "SUB\t" }, /* 0xd6 */
+ { opout, "RST\t10" }, /* 0xd7 */
+ { opout, "RET\tC" }, /* 0xd8 */
+ { opout, "EXX" }, /* 0xd9 */
+ { nnout, "JP\tC," }, /* 0xda */
+ { iout, "IN\tA,(%02x)" }, /* 0xdb */
+ { nnout, "CALL\tC," }, /* 0xdc */
+ { ddfd, "" }, /* 0xdd */
+ { nout, "SBC\tA," }, /* 0xde */
+ { opout, "RST\t18" }, /* 0xdf */
+ { opout, "RET\tPO" }, /* 0xe0 */
+ { opout, "POP\tHL" }, /* 0xe1 */
+ { nnout, "JP\tPO," }, /* 0xe2 */
+ { opout, "EX\t(SP),HL" }, /* 0xe3 */
+ { nnout, "CALL\tPO," }, /* 0xe4 */
+ { opout, "PUSH\tHL" }, /* 0xe5 */
+ { nout, "AND\t" }, /* 0xe6 */
+ { opout, "RST\t20" }, /* 0xe7 */
+ { opout, "RET\tPE" }, /* 0xe8 */
+ { opout, "JP\t(HL)" }, /* 0xe9 */
+ { nnout, "JP\tPE," }, /* 0xea */
+ { opout, "EX\tDE,HL" }, /* 0xeb */
+ { nnout, "CALL\tPE," }, /* 0xec */
+ { edop, "" }, /* 0xed */
+ { nout, "XOR\t" }, /* 0xee */
+ { opout, "RST\t28" }, /* 0xef */
+ { opout, "RET\tP" }, /* 0xf0 */
+ { opout, "POP\tAF" }, /* 0xf1 */
+ { nnout, "JP\tP," }, /* 0xf2 */
+ { opout, "DI" }, /* 0xf3 */
+ { nnout, "CALL\tP," }, /* 0xf4 */
+ { opout, "PUSH\tAF" }, /* 0xf5 */
+ { nout, "OR\t" }, /* 0xf6 */
+ { opout, "RST\t30" }, /* 0xf7 */
+ { opout, "RET\tM" }, /* 0xf8 */
+ { opout, "LD\tSP,HL" }, /* 0xf9 */
+ { nnout, "JP\tM," }, /* 0xfa */
+ { opout, "EI" }, /* 0xfb */
+ { nnout, "CALL\tM," }, /* 0xfc */
+ { ddfd, "" }, /* 0xfd */
+ { nout, "CP\t" }, /* 0xfe */
+ { opout, "RST\t38" } /* 0xff */
+};
+
+static int addr;
+static char *unkown = "???";
+static char *reg[] = { "B", "C", "D", "E", "H", "L", "(HL)", "A" };
+static char *regix = "IX";
+static char *regiy = "IY";
+
+/*
+ * The function disass() is the only global function of
+ * this module. The first argument is a pointer to a
+ * unsigned char pointer, which points to the op-code
+ * to disassemble. The output of the disassembly goes
+ * to stdout, terminated by a newline. After the
+ * disassembly the pointer to the op-code will be
+ * increased by the size of the op-code, so that
+ * disass() can be called again.
+ * The secound argument is the (Z80) address of the
+ * op-code to disassemble. It is used to calculate the
+ * destination address of relative jumps.
+ */
+void disass(unsigned char **p, int adr)
+{
+ register int len;
+
+ addr = adr;
+ len = (*optab[**p].fun) (optab[**p].text, p);
+ *p += len;
+}
+
+/*
+ * disassemble 1 byte op-codes
+ */
+static int opout(char *s, char **p)
+{
+ puts(s);
+ return(1);
+}
+
+/*
+ * disassemble 2 byte op-codes of type "Op n"
+ */
+static int nout(char *s, unsigned char **p)
+{
+ printf("%s%02x\n", s, *(*p + 1));
+ return(2);
+}
+
+/*
+ * disassemble 2 byte op-codes with indirect addressing
+ */
+static int iout(char *s, unsigned char **p)
+{
+ printf(s, *(*p + 1));
+ putchar('\n');
+ return(2);
+}
+
+/*
+ * disassemble 2 byte op-codes with relative addressing
+ */
+static int rout(char *s, char **p)
+{
+ printf("%s%04x\n", s, addr + *(*p + 1) + 2);
+ return(2);
+}
+
+/*
+ * disassemble 3 byte op-codes of type "Op nn"
+ */
+static int nnout(char *s, unsigned char **p)
+{
+ register int i;
+
+ i = *(*p + 1) + (*(*p + 2) << 8);
+ printf("%s%04x\n", s, i);
+ return(3);
+}
+
+/*
+ * disassemble 3 byte op-codes with indirect addressing
+ */
+static int inout(char *s, unsigned char **p)
+{
+ register int i;
+
+ i = *(*p + 1) + (*(*p + 2) << 8);
+ printf(s, i);
+ putchar('\n');
+ return(3);
+}
+
+/*
+ * disassemble multi byte op-codes with prefix 0xcb
+ */
+static int cbop(char *s, unsigned char **p)
+{
+ register int b2;
+
+ b2 = *(*p + 1);
+ if (b2 >= 0x00 && b2 <= 0x07) {
+ printf("RLC\t");
+ printf("%s\n", reg[b2 & 7]);
+ return(2);
+ }
+ if (b2 >= 0x08 && b2 <= 0x0f) {
+ printf("RRC\t");
+ printf("%s\n", reg[b2 & 7]);
+ return(2);
+ }
+ if (b2 >= 0x10 && b2 <= 0x17) {
+ printf("RL\t");
+ printf("%s\n", reg[b2 & 7]);
+ return(2);
+ }
+ if (b2 >= 0x18 && b2 <= 0x1f) {
+ printf("RR\t");
+ printf("%s\n", reg[b2 & 7]);
+ return(2);
+ }
+ if (b2 >= 0x20 && b2 <= 0x27) {
+ printf("SLA\t");
+ printf("%s\n", reg[b2 & 7]);
+ return(2);
+ }
+ if (b2 >= 0x28 && b2 <= 0x2f) {
+ printf("SRA\t");
+ printf("%s\n", reg[b2 & 7]);
+ return(2);
+ }
+ if (b2 >= 0x38 && b2 <= 0x3f) {
+ printf("SRL\t");
+ printf("%s\n", reg[b2 & 7]);
+ return(2);
+ }
+ if (b2 >= 0x40 && b2 <= 0x7f) {
+ printf("BIT\t");
+ printf("%c,", ((b2 >> 3) & 7) + '0');
+ printf("%s\n", reg[b2 & 7]);
+ return(2);
+ }
+ if (b2 >= 0x80 && b2 <= 0xbf) {
+ printf("RES\t");
+ printf("%c,", ((b2 >> 3) & 7) + '0');
+ printf("%s\n", reg[b2 & 7]);
+ return(2);
+ }
+ if (b2 >= 0xc0) {
+ printf("SET\t");
+ printf("%c,", ((b2 >> 3) & 7) + '0');
+ printf("%s\n", reg[b2 & 7]);
+ return(2);
+ }
+ puts(unkown);
+ return(2);
+}
+
+/*
+ * disassemble multi byte op-codes with prefix 0xed
+ */
+static int edop(char *s, unsigned char **p)
+{
+ register int b2, i;
+ int len = 2;
+
+ b2 = *(*p + 1);
+ switch (b2) {
+ case 0x40:
+ puts("IN\tB,(C)");
+ break;
+ case 0x41:
+ puts("OUT\t(C),B");
+ break;
+ case 0x42:
+ puts("SBC\tHL,BC");
+ break;
+ case 0x43:
+ i = *(*p + 2) + (*(*p + 3) << 8);
+ printf("LD\t(%04x),BC\n", i);
+ len = 4;
+ break;
+ case 0x44:
+ puts("NEG");
+ break;
+ case 0x45:
+ puts("RETN");
+ break;
+ case 0x46:
+ puts("IM\t0");
+ break;
+ case 0x47:
+ puts("LD\tI,A");
+ break;
+ case 0x48:
+ puts("IN\tC,(C)");
+ break;
+ case 0x49:
+ puts("OUT\t(C),C");
+ break;
+ case 0x4a:
+ puts("ADC\tHL,BC");
+ break;
+ case 0x4b:
+ i = *(*p + 2) + (*(*p + 3) << 8);
+ printf("LD\tBC,(%04x)\n", i);
+ len = 4;
+ break;
+ case 0x4d:
+ puts("RETI");
+ break;
+ case 0x4f:
+ puts("LD\tR,A");
+ break;
+ case 0x50:
+ puts("IN\tD,(C)");
+ break;
+ case 0x51:
+ puts("OUT\t(C),D");
+ break;
+ case 0x52:
+ puts("SBC\tHL,DE");
+ break;
+ case 0x53:
+ i = *(*p + 2) + (*(*p + 3) << 8);
+ printf("LD\t(%04x),DE\n", i);
+ len = 4;
+ break;
+ case 0x56:
+ puts("IM\t1");
+ break;
+ case 0x57:
+ puts("LD\tA,I");
+ break;
+ case 0x58:
+ puts("IN\tE,(C)");
+ break;
+ case 0x59:
+ puts("OUT\t(C),E");
+ break;
+ case 0x5a:
+ puts("ADC\tHL,DE");
+ break;
+ case 0x5b:
+ i = *(*p + 2) + (*(*p + 3) << 8);
+ printf("LD\tDE,(%04x)\n", i);
+ len = 4;
+ break;
+ case 0x5e:
+ puts("IM\t2");
+ break;
+ case 0x5f:
+ puts("LD\tA,R");
+ break;
+ case 0x60:
+ puts("IN\tH,(C)");
+ break;
+ case 0x61:
+ puts("OUT\t(C),H");
+ break;
+ case 0x62:
+ puts("SBC\tHL,HL");
+ break;
+ case 0x67:
+ puts("RRD");
+ break;
+ case 0x68:
+ puts("IN\tL,(C)");
+ break;
+ case 0x69:
+ puts("OUT\t(C),L");
+ break;
+ case 0x6a:
+ puts("ADC\tHL,HL");
+ break;
+ case 0x6f:
+ puts("RLD");
+ break;
+ case 0x72:
+ puts("SBC\tHL,SP");
+ break;
+ case 0x73:
+ i = *(*p + 2) + (*(*p + 3) << 8);
+ printf("LD\t(%04x),SP\n", i);
+ len = 4;
+ break;
+ case 0x78:
+ puts("IN\tA,(C)");
+ break;
+ case 0x79:
+ puts("OUT\t(C),A");
+ break;
+ case 0x7a:
+ puts("ADC\tHL,SP");
+ break;
+ case 0x7b:
+ i = *(*p + 2) + (*(*p + 3) << 8);
+ printf("LD\tSP,(%04x)\n", i);
+ len = 4;
+ break;
+ case 0xa0:
+ puts("LDI");
+ break;
+ case 0xa1:
+ puts("CPI");
+ break;
+ case 0xa2:
+ puts("INI");
+ break;
+ case 0xa3:
+ puts("OUTI");
+ break;
+ case 0xa8:
+ puts("LDD");
+ break;
+ case 0xa9:
+ puts("CPD");
+ break;
+ case 0xaa:
+ puts("IND");
+ break;
+ case 0xab:
+ puts("OUTD");
+ break;
+ case 0xb0:
+ puts("LDIR");
+ break;
+ case 0xb1:
+ puts("CPIR");
+ break;
+ case 0xb2:
+ puts("INIR");
+ break;
+ case 0xb3:
+ puts("OTIR");
+ break;
+ case 0xb8:
+ puts("LDDR");
+ break;
+ case 0xb9:
+ puts("CPDR");
+ break;
+ case 0xba:
+ puts("INDR");
+ break;
+ case 0xbb:
+ puts("OTDR");
+ break;
+ default:
+ puts(unkown);
+ }
+ return(len);
+}
+
+/*
+ * disassemble multi byte op-codes with prefix 0xdd and 0xfd
+ */
+static int ddfd(char *s, unsigned char **p)
+{
+ register int b2;
+ register char *ireg;
+ int len = 3;
+
+ if (**p == 0xdd)
+ ireg = regix;
+ else
+ ireg = regiy;
+ b2 = *(*p + 1);
+ if (b2 >= 0x70 && b2 <= 0x77) {
+ printf("LD\t(%s+%02x),%s\n", ireg, *(*p + 2), reg[b2 & 7]);
+ return(3);
+ }
+ switch (b2) {
+ case 0x09:
+ printf("ADD\t%s,BC\n", ireg);
+ len = 2;
+ break;
+ case 0x19:
+ printf("ADD\t%s,DE\n", ireg);
+ len = 2;
+ break;
+ case 0x21:
+ printf("LD\t%s,%04x\n", ireg, *(*p + 2) + (*(*p + 3) << 8));
+ len = 4;
+ break;
+ case 0x22:
+ printf("LD\t(%04x),%s\n", *(*p + 2) + (*(*p + 3) << 8), ireg);
+ len = 4;
+ break;
+ case 0x23:
+ printf("INC\t%s\n", ireg);
+ len = 2;
+ break;
+ case 0x29:
+ if (**p == 0xdd)
+ printf("ADD\tIX,IX\n");
+ else
+ printf("ADD\tIY,IY\n");
+ len = 2;
+ break;
+ case 0x2a:
+ printf("LD\t%s,(%04x)\n", ireg, *(*p + 2) + (*(*p + 3) << 8));
+ len = 4;
+ break;
+ case 0x2b:
+ printf("DEC\t%s\n", ireg);
+ len = 2;
+ break;
+ case 0x34:
+ printf("INC\t(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x35:
+ printf("DEC\t(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x36:
+ printf("LD\t(%s+%02x),%02x\n", ireg, *(*p + 2), *(*p + 3));
+ len = 4;
+ break;
+ case 0x39:
+ printf("ADD\t%s,SP\n", ireg);
+ len = 2;
+ break;
+ case 0x46:
+ printf("LD\tB,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x4e:
+ printf("LD\tC,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x56:
+ printf("LD\tD,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x5e:
+ printf("LD\tE,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x66:
+ printf("LD\tH,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x6e:
+ printf("LD\tL,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x7e:
+ printf("LD\tA,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x86:
+ printf("ADD\tA,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x8e:
+ printf("ADC\tA,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x96:
+ printf("SUB\t(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x9e:
+ printf("SBC\tA,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0xa6:
+ printf("AND\t(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0xae:
+ printf("XOR\t(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0xb6:
+ printf("OR\t(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0xbe:
+ printf("CP\t(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0xcb:
+ switch (*(*p + 3)) {
+ case 0x06:
+ printf("RLC\t(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x0e:
+ printf("RRC\t(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x16:
+ printf("RL\t(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x1e:
+ printf("RR\t(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x26:
+ printf("SLA\t(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x2e:
+ printf("SRA\t(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x3e:
+ printf("SRL\t(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x46:
+ printf("BIT\t0,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x4e:
+ printf("BIT\t1,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x56:
+ printf("BIT\t2,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x5e:
+ printf("BIT\t3,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x66:
+ printf("BIT\t4,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x6e:
+ printf("BIT\t5,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x76:
+ printf("BIT\t6,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x7e:
+ printf("BIT\t7,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x86:
+ printf("RES\t0,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x8e:
+ printf("RES\t1,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x96:
+ printf("RES\t2,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0x9e:
+ printf("RES\t3,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0xa6:
+ printf("RES\t4,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0xae:
+ printf("RES\t5,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0xb6:
+ printf("RES\t6,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0xbe:
+ printf("RES\t7,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0xc6:
+ printf("SET\t0,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0xce:
+ printf("SET\t1,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0xd6:
+ printf("SET\t2,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0xde:
+ printf("SET\t3,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0xe6:
+ printf("SET\t4,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0xee:
+ printf("SET\t5,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0xf6:
+ printf("SET\t6,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ case 0xfe:
+ printf("SET\t7,(%s+%02x)\n", ireg, *(*p + 2));
+ break;
+ default:
+ puts(unkown);
+ }
+ len = 4;
+ break;
+ case 0xe1:
+ printf("POP\t%s\n", ireg);
+ len = 2;
+ break;
+ case 0xe3:
+ printf("EX\t(SP),%s\n", ireg);
+ len = 2;
+ break;
+ case 0xe5:
+ printf("PUSH\t%s\n", ireg);
+ len = 2;
+ break;
+ case 0xe9:
+ printf("JP\t(%s)\n", ireg);
+ len = 2;
+ break;
+ case 0xf9:
+ printf("LD\tSP,%s\n", ireg);
+ len = 2;
+ break;
+ default:
+ puts(unkown);
+ }
+ return(len);
+}
diff --git a/emu/z80pack-1.9/z80sim/disas.o b/emu/z80pack-1.9/z80sim/disas.o
new file mode 100644
index 0000000..6b8597d
Binary files /dev/null and b/emu/z80pack-1.9/z80sim/disas.o differ
diff --git a/emu/z80pack-1.9/z80sim/iosim.c b/emu/z80pack-1.9/z80sim/iosim.c
new file mode 100644
index 0000000..0e5c25f
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/iosim.c
@@ -0,0 +1,136 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * This modul of the simulator contains a simple terminal I/O
+ * simulation as an example.
+ *
+ * History:
+ * 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-JAN-89 Release 1.1
+ * 08-FEB-89 Release 1.2
+ * 13-MAR-89 Release 1.3
+ * 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
+ * 20-DEC-90 Release 1.5 Ported to COHERENT 3.0
+ * 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
+ * and some optimization
+ * 25-JUN-92 Release 1.7 comments in english
+ * 03-OCT-06 Release 1.8 changed to ANSI C for modern POSIX OS's
+ */
+
+/*
+ * Sample I/O-handler
+ *
+ * Port 0 input: reads the next byte from stdin
+ * Port 0 output: writes the byte to stdout
+ *
+ * All the other ports are connected to a I/O-trap handler,
+ * I/O to this ports stops the simulation with an I/O error.
+ */
+
+#include
+#include "sim.h"
+#include "simglb.h"
+
+/*
+ * Forward declarations of the I/O functions
+ * for all port addresses.
+ */
+static BYTE io_trap(void);
+static BYTE p000_in(void);
+static void p000_out(BYTE);
+
+/*
+ * This two dimensional array contains function pointers
+ * for every I/O port (0 - 255), to do the needed I/O.
+ * The first entry is for input, the second for output.
+ */
+static BYTE (*port[256][2]) () = {
+ { p000_in, p000_out } /* port 0 */
+};
+
+/*
+ * This function is to initiate the I/O devices.
+ * It will be called from the CPU simulation before
+ * any operation with the Z80 is possible.
+ *
+ * In this sample I/O simulation we initialize all
+ * unused port with an error trap handler, so that
+ * simulation stops at I/O on the unused ports.
+ *
+ * See the I/O simulation of CP/M for a more complex
+ * example.
+ */
+void init_io(void)
+{
+ register int i;
+
+ for (i = 1; i <= 255; i++)
+ port[i][0] = port[i][1] = io_trap;
+}
+
+/*
+ * This function is to stop the I/O devices. It is
+ * called from the CPU simulation on exit.
+ *
+ * Here is just nothing to do, see the I/O simulation
+ * of CP/M for a more complex example.
+ */
+void exit_io(void)
+{
+}
+
+/*
+ * This is the main handler for all IN op-codes,
+ * called by the simulator. It calls the input
+ * function for port adr.
+ */
+BYTE io_in(BYTE adr)
+{
+ return((*port[adr][0]) ());
+}
+
+/*
+ * This is the main handler for all OUT op-codes,
+ * called by the simulator. It calls the output
+ * function for port adr.
+ */
+void io_out(BYTE adr, BYTE data)
+{
+ (*port[adr][1]) (data);
+}
+
+/*
+ * I/O trap funtion
+ * This function should be added into all unused
+ * entrys of the port array. It stops the emulation
+ * with an I/O error.
+ */
+static BYTE io_trap(void)
+{
+ if (i_flag) {
+ cpu_error = IOTRAP;
+ cpu_state = STOPPED;
+ }
+ return((BYTE) 0);
+}
+
+/*
+ * I/O function port 0 read:
+ * Read next byte from stdin.
+ */
+static BYTE p000_in(void)
+{
+ return((BYTE) getchar());
+}
+
+/*
+ * I/O function port 0 write:
+ * Write byte to stdout and flush the output.
+ */
+static void p000_out(BYTE data)
+{
+ putchar((int) data);
+ fflush(stdout);
+}
diff --git a/emu/z80pack-1.9/z80sim/iosim.o b/emu/z80pack-1.9/z80sim/iosim.o
new file mode 100644
index 0000000..1230fd5
Binary files /dev/null and b/emu/z80pack-1.9/z80sim/iosim.o differ
diff --git a/emu/z80pack-1.9/z80sim/run.sh b/emu/z80pack-1.9/z80sim/run.sh
new file mode 100755
index 0000000..3b79f22
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/run.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+./z80sim
diff --git a/emu/z80pack-1.9/z80sim/sim.h b/emu/z80pack-1.9/z80sim/sim.h
new file mode 100644
index 0000000..4e22072
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/sim.h
@@ -0,0 +1,104 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * This is the configuration I'm using for software testing and debugging
+ *
+ * History:
+ * 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-JAN-89 Release 1.1
+ * 08-FEB-89 Release 1.2
+ * 13-MAR-89 Release 1.3
+ * 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
+ * 20-DEC-90 Release 1.5 Ported to COHERENT 3.0
+ * 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
+ * and some optimization
+ * 25-JUN-92 Release 1.7 comments in english
+ * 03-OCT-06 Release 1.8 modified to compile on modern POSIX OS's
+ */
+
+/*
+ * The following defines may be activated, commented or modified
+ * by user for her/his own purpose.
+ */
+/*#define WANT_INT*/ /* activate CPU's interrupts */
+#define WANT_SPC /* activate SP over-/underrun handling 0000<->FFFF */
+#define WANT_PCC /* activate PC overrun handling FFFF->0000 */
+#define CNTL_C /* cntl-c will stop running emulation */
+#define CNTL_BS /* cntl-\ will stop running emulation */
+#define CNTL_Z /* cntl-z will suspend emulator */
+#define WANT_TIM /* activate runtime measurement */
+#define HISIZE 100 /* number of entrys in history */
+#define SBSIZE 4 /* number of software breakpoints */
+
+/*
+ * The following defines may be modified and activated by
+ * user, to print her/his copyright for a developed system,
+ * which contains the Z80-CPU simulation as a part.
+ */
+/*
+#define USR_COM "XYZ-System Simulation"
+#define USR_REL "x.y"
+#define USR_CPR "Copyright (C) 20xx by XYZ"
+*/
+
+/*
+ * The following lines of this file should not be modified by user
+ */
+#define COPYR "Copyright (C) 1987-2006 by Udo Munk"
+#define RELEASE "1.9"
+
+#define LENCMD 80 /* length of command buffers etc */
+
+#define S_FLAG 128 /* bit definitions of CPU flags */
+#define Z_FLAG 64
+#define N2_FLAG 32
+#define H_FLAG 16
+#define N1_FLAG 8
+#define P_FLAG 4
+#define N_FLAG 2
+#define C_FLAG 1
+
+ /* operation of simulated CPU */
+#define SINGLE_STEP 0 /* single step */
+#define CONTIN_RUN 1 /* continual run */
+#define STOPPED 0 /* stop CPU because of error */
+
+ /* causes of error */
+#define NONE 0 /* no error */
+#define OPHALT 1 /* HALT op-code trap */
+#define IOTRAP 2 /* IN/OUT trap */
+#define OPTRAP1 3 /* illegal 1 byte op-code trap */
+#define OPTRAP2 4 /* illegal 2 byte op-code trap */
+#define OPTRAP4 5 /* illegal 4 byte op-code trap */
+#define USERINT 6 /* user interrupt */
+
+ /* type of CPU interrupt */
+#define INT_NMI 1 /* non maskable interrupt */
+#define INT_INT 2 /* maskable interrupt */
+
+typedef unsigned short WORD; /* 16 bit unsigned */
+typedef unsigned char BYTE; /* 8 bit unsigned */
+
+#ifdef HISIZE
+struct history { /* structure of a history entry */
+ WORD h_adr; /* address of execution */
+ WORD h_af; /* register AF */
+ WORD h_bc; /* register BC */
+ WORD h_de; /* register DE */
+ WORD h_hl; /* register HL */
+ WORD h_ix; /* register IX */
+ WORD h_iy; /* register IY */
+ WORD h_sp; /* register SP */
+};
+#endif
+
+#ifdef SBSIZE
+struct softbreak { /* structure of a breakpoint */
+ WORD sb_adr; /* address of breakpoint */
+ BYTE sb_oldopc; /* op-code at address of breakpoint */
+ int sb_passcount; /* pass counter of breakpoint */
+ int sb_pass; /* no. of pass to break */
+};
+#endif
diff --git a/emu/z80pack-1.9/z80sim/sim.h.debug b/emu/z80pack-1.9/z80sim/sim.h.debug
new file mode 100644
index 0000000..4e22072
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/sim.h.debug
@@ -0,0 +1,104 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * This is the configuration I'm using for software testing and debugging
+ *
+ * History:
+ * 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-JAN-89 Release 1.1
+ * 08-FEB-89 Release 1.2
+ * 13-MAR-89 Release 1.3
+ * 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
+ * 20-DEC-90 Release 1.5 Ported to COHERENT 3.0
+ * 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
+ * and some optimization
+ * 25-JUN-92 Release 1.7 comments in english
+ * 03-OCT-06 Release 1.8 modified to compile on modern POSIX OS's
+ */
+
+/*
+ * The following defines may be activated, commented or modified
+ * by user for her/his own purpose.
+ */
+/*#define WANT_INT*/ /* activate CPU's interrupts */
+#define WANT_SPC /* activate SP over-/underrun handling 0000<->FFFF */
+#define WANT_PCC /* activate PC overrun handling FFFF->0000 */
+#define CNTL_C /* cntl-c will stop running emulation */
+#define CNTL_BS /* cntl-\ will stop running emulation */
+#define CNTL_Z /* cntl-z will suspend emulator */
+#define WANT_TIM /* activate runtime measurement */
+#define HISIZE 100 /* number of entrys in history */
+#define SBSIZE 4 /* number of software breakpoints */
+
+/*
+ * The following defines may be modified and activated by
+ * user, to print her/his copyright for a developed system,
+ * which contains the Z80-CPU simulation as a part.
+ */
+/*
+#define USR_COM "XYZ-System Simulation"
+#define USR_REL "x.y"
+#define USR_CPR "Copyright (C) 20xx by XYZ"
+*/
+
+/*
+ * The following lines of this file should not be modified by user
+ */
+#define COPYR "Copyright (C) 1987-2006 by Udo Munk"
+#define RELEASE "1.9"
+
+#define LENCMD 80 /* length of command buffers etc */
+
+#define S_FLAG 128 /* bit definitions of CPU flags */
+#define Z_FLAG 64
+#define N2_FLAG 32
+#define H_FLAG 16
+#define N1_FLAG 8
+#define P_FLAG 4
+#define N_FLAG 2
+#define C_FLAG 1
+
+ /* operation of simulated CPU */
+#define SINGLE_STEP 0 /* single step */
+#define CONTIN_RUN 1 /* continual run */
+#define STOPPED 0 /* stop CPU because of error */
+
+ /* causes of error */
+#define NONE 0 /* no error */
+#define OPHALT 1 /* HALT op-code trap */
+#define IOTRAP 2 /* IN/OUT trap */
+#define OPTRAP1 3 /* illegal 1 byte op-code trap */
+#define OPTRAP2 4 /* illegal 2 byte op-code trap */
+#define OPTRAP4 5 /* illegal 4 byte op-code trap */
+#define USERINT 6 /* user interrupt */
+
+ /* type of CPU interrupt */
+#define INT_NMI 1 /* non maskable interrupt */
+#define INT_INT 2 /* maskable interrupt */
+
+typedef unsigned short WORD; /* 16 bit unsigned */
+typedef unsigned char BYTE; /* 8 bit unsigned */
+
+#ifdef HISIZE
+struct history { /* structure of a history entry */
+ WORD h_adr; /* address of execution */
+ WORD h_af; /* register AF */
+ WORD h_bc; /* register BC */
+ WORD h_de; /* register DE */
+ WORD h_hl; /* register HL */
+ WORD h_ix; /* register IX */
+ WORD h_iy; /* register IY */
+ WORD h_sp; /* register SP */
+};
+#endif
+
+#ifdef SBSIZE
+struct softbreak { /* structure of a breakpoint */
+ WORD sb_adr; /* address of breakpoint */
+ BYTE sb_oldopc; /* op-code at address of breakpoint */
+ int sb_passcount; /* pass counter of breakpoint */
+ int sb_pass; /* no. of pass to break */
+};
+#endif
diff --git a/emu/z80pack-1.9/z80sim/sim.h.fast b/emu/z80pack-1.9/z80sim/sim.h.fast
new file mode 100644
index 0000000..8cdf8ee
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/sim.h.fast
@@ -0,0 +1,106 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * With this configuration the simulated Z80 runs with the
+ * highest possible speed
+ *
+ * History:
+ * 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-JAN-89 Release 1.1
+ * 08-FEB-89 Release 1.2
+ * 13-MAR-89 Release 1.3
+ * 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
+ * 20-DEC-90 Release 1.5 Ported to COHERENT 3.0
+ * 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
+ * and some optimization
+ * 25-JUN-92 Release 1.7 comments in english
+ * 03-OCT-06 Release 1.8 modified to compile on modern POSIX OS's
+ */
+
+/*
+ * The following defines may be activated, commented or modified
+ * by user for her/his own purpose.
+ */
+/*#define WANT_INT*/ /* activate CPU's interrupts */
+/*#define WANT_SPC*/ /* activate SP over-/underrun handling 0000<->FFFF */
+/*#define WANT_PCC*/ /* activate PC overrun handling FFFF->0000 */
+#define CNTL_C /* cntl-c will stop running emulation */
+#define CNTL_BS /* cntl-\ will stop running emulation */
+#define CNTL_Z /* cntl-z will suspend emulator */
+/*#define WANT_TIM*/ /* activate runtime measurement */
+/*#define HISIZE 100*/ /* number of entrys in history */
+/*#define SBSIZE 4*/ /* number of software breakpoints */
+
+/*
+ * The following defines may be modified and activated by
+ * user, to print her/his copyright for a developed system,
+ * which contains the Z80-CPU simulation as a part.
+ */
+/*
+#define USR_COM "XYZ-System Simulation"
+#define USR_REL "x.y"
+#define USR_CPR "Copyright (C) 20xx by XYZ"
+*/
+
+/*
+ * The following lines of this file should not be modified by user
+ */
+#define COPYR "Copyright (C) 1987-2006 by Udo Munk"
+#define RELEASE "1.9"
+
+#define LENCMD 80 /* length of command buffers etc */
+
+#define S_FLAG 128 /* bit definitions of CPU flags */
+#define Z_FLAG 64
+#define N2_FLAG 32
+#define H_FLAG 16
+#define N1_FLAG 8
+#define P_FLAG 4
+#define N_FLAG 2
+#define C_FLAG 1
+
+ /* operation of simulated CPU */
+#define SINGLE_STEP 0 /* single step */
+#define CONTIN_RUN 1 /* continual run */
+#define STOPPED 0 /* stop CPU because of error */
+
+ /* causes of error */
+#define NONE 0 /* no error */
+#define OPHALT 1 /* HALT op-code trap */
+#define IOTRAP 2 /* IN/OUT trap */
+#define OPTRAP1 3 /* illegal 1 byte op-code trap */
+#define OPTRAP2 4 /* illegal 2 byte op-code trap */
+#define OPTRAP4 5 /* illegal 4 byte op-code trap */
+#define USERINT 6 /* user interrupt */
+
+ /* type of CPU interrupt */
+#define INT_NONE 0
+#define INT_NMI 1 /* non maskable interrupt */
+#define INT_INT 2 /* maskable interrupt */
+
+typedef unsigned short WORD; /* 16 bit unsigned */
+typedef unsigned char BYTE; /* 8 bit unsigned */
+
+#ifdef HISIZE
+struct history { /* structure of a history entry */
+ WORD h_adr; /* address of execution */
+ WORD h_af; /* register AF */
+ WORD h_bc; /* register BC */
+ WORD h_de; /* register DE */
+ WORD h_hl; /* register HL */
+ WORD h_ix; /* register IX */
+ WORD h_iy; /* register IY */
+ WORD h_sp; /* register SP */
+};
+#endif
+
+#ifdef SBSIZE
+struct softbreak { /* structure of a breakpoint */
+ WORD sb_adr; /* address of breakpoint */
+ BYTE sb_oldopc; /* op-code at address of breakpoint */
+ int sb_passcount; /* pass counter of breakpoint */
+ int sb_pass; /* no. of pass to break */
+};
+#endif
diff --git a/emu/z80pack-1.9/z80sim/sim0.c b/emu/z80pack-1.9/z80sim/sim0.c
new file mode 100644
index 0000000..cf5fd06
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/sim0.c
@@ -0,0 +1,202 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-JAN-89 Release 1.1
+ * 08-FEB-89 Release 1.2
+ * 13-MAR-89 Release 1.3
+ * 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
+ * 20-DEC-90 Release 1.5 Ported to COHERENT 3.0
+ * 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
+ * and some optimization
+ * 25-JUN-92 Release 1.7 comments in english and ported to COHERENT 4.0
+ * 03-OCT-06 Release 1.8 modified to compile on modern POSIX OS's
+ */
+
+/*
+ * This modul contain the 'main()' function of the simulator,
+ * where the options are checked and variables are initialized.
+ * After initialization of the UNIX interrupts ( int_on() )
+ * and initialization of the I/O simulation ( init_io() )
+ * the user interface ( mon() ) is called.
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include "sim.h"
+#include "simglb.h"
+
+static void save_core(void), load_core(void);
+extern void int_on(void), int_off(void), mon(void);
+extern void init_io(void), exit_io(void);
+extern int exatoi(char *);
+
+int main(int argc, char *argv[])
+{
+ register char *s, *p;
+ register char *pn = argv[0];
+
+ while (--argc > 0 && (*++argv)[0] == '-')
+ for (s = argv[0] + 1; *s != '\0'; s++)
+ switch (*s) {
+ case 's': /* save core and CPU on exit */
+ s_flag = 1;
+ break;
+ case 'l': /* load core and CPU from file */
+ l_flag = 1;
+ break;
+ case 'h': /* execute HALT opcode */
+ break_flag = 0;
+ break;
+ case 'i': /* trap I/O on unused ports */
+ i_flag = 1;
+ break;
+ case 'm': /* initialize Z80 memory */
+ m_flag = exatoi(s+1);
+ s += strlen(s+1);
+ break;
+ case 'f':
+ f_flag = atoi(s+1);
+ s += strlen(s+1);
+ freq = (float) 1 / (float) f_flag;
+ break;
+ case 'x': /* get filename with Z80 executable */
+ x_flag = 1;
+ s++;
+ p = xfn;
+ while (*s)
+ *p++ = *s++;
+ *p = '\0';
+ s--;
+ break;
+ case '?':
+ goto usage;
+ default:
+ printf("illegal option %c\n", *s);
+usage: printf("usage:\t%s -s -l -i -h -mn -fn -xfilename\n", pn);
+ puts("\ts = save core and cpu");
+ puts("\tl = load core and cpu");
+ puts("\ti = trap on I/O to unused ports");
+ puts("\th = execute HALT op-code");
+ puts("\tm = init memory with n");
+ puts("\tf = CPU frequenzy n in MHz (not implemented yet)");
+ puts("\tx = load and execute filename");
+ exit(1);
+ }
+
+ putchar('\n');
+ puts("####### ##### ### ##### ### # #");
+ puts(" # # # # # # # # ## ##");
+ puts(" # # # # # # # # # # #");
+ puts(" # ##### # # ##### ##### # # # #");
+ puts(" # # # # # # # # #");
+ puts(" # # # # # # # # # #");
+ puts("####### ##### ### ##### ### # #");
+ printf("\nRelease %s, %s\n", RELEASE, COPYR);
+#ifdef USR_COM
+ printf("%s Release %s, %s\n", USR_COM, USR_REL, USR_CPR);
+#endif
+ putchar('\n');
+ fflush(stdout);
+
+ wrk_ram = PC = STACK = ram;
+ memset((char *) ram, m_flag, 32768);
+ memset((char *) ram + 32768, m_flag, 32768);
+ if (l_flag)
+ load_core();
+ int_on();
+ init_io();
+ mon();
+ if (s_flag)
+ save_core();
+ exit_io();
+ int_off();
+ return(0);
+}
+
+/*
+ * This function saves the CPU and the memory into the file core.z80
+ *
+ */
+static void save_core(void)
+{
+ int fd;
+
+ if ((fd = open("core.z80", O_WRONLY | O_CREAT, 0600)) == -1) {
+ puts("can't open file core.z80");
+ return;
+ }
+ write(fd, (char *) &A, sizeof(A));
+ write(fd, (char *) &F, sizeof(F));
+ write(fd, (char *) &B, sizeof(B));
+ write(fd, (char *) &C, sizeof(C));
+ write(fd, (char *) &D, sizeof(D));
+ write(fd, (char *) &E, sizeof(E));
+ write(fd, (char *) &H, sizeof(H));
+ write(fd, (char *) &L, sizeof(L));
+ write(fd, (char *) &A_, sizeof(A_));
+ write(fd, (char *) &F_, sizeof(F_));
+ write(fd, (char *) &B_, sizeof(B_));
+ write(fd, (char *) &C_, sizeof(C_));
+ write(fd, (char *) &D_, sizeof(D_));
+ write(fd, (char *) &E_, sizeof(E_));
+ write(fd, (char *) &H_, sizeof(H_));
+ write(fd, (char *) &L_, sizeof(L_));
+ write(fd, (char *) &I, sizeof(I));
+ write(fd, (char *) &IFF, sizeof(IFF));
+ write(fd, (char *) &R, sizeof(R));
+ write(fd, (char *) &PC, sizeof(PC));
+ write(fd, (char *) &STACK, sizeof(STACK));
+ write(fd, (char *) &IX, sizeof(IX));
+ write(fd, (char *) &IY, sizeof(IY));
+ write(fd, (char *) ram, 32768);
+ write(fd, (char *) ram + 32768, 32768);
+ close(fd);
+}
+
+/*
+ * This function loads the CPU and memory from the file core.z80
+ *
+ */
+static void load_core(void)
+{
+ int fd;
+
+ if ((fd = open("core.z80", O_RDONLY)) == -1) {
+ puts("can't open file core.z80");
+ return;
+ }
+ read(fd, (char *) &A, sizeof(A));
+ read(fd, (char *) &F, sizeof(F));
+ read(fd, (char *) &B, sizeof(B));
+ read(fd, (char *) &C, sizeof(C));
+ read(fd, (char *) &D, sizeof(D));
+ read(fd, (char *) &E, sizeof(E));
+ read(fd, (char *) &H, sizeof(H));
+ read(fd, (char *) &L, sizeof(L));
+ read(fd, (char *) &A_, sizeof(A_));
+ read(fd, (char *) &F_, sizeof(F_));
+ read(fd, (char *) &B_, sizeof(B_));
+ read(fd, (char *) &C_, sizeof(C_));
+ read(fd, (char *) &D_, sizeof(D_));
+ read(fd, (char *) &E_, sizeof(E_));
+ read(fd, (char *) &H_, sizeof(H_));
+ read(fd, (char *) &L_, sizeof(L_));
+ read(fd, (char *) &I, sizeof(I));
+ read(fd, (char *) &IFF, sizeof(IFF));
+ read(fd, (char *) &R, sizeof(R));
+ read(fd, (char *) &PC, sizeof(PC));
+ read(fd, (char *) &STACK, sizeof(STACK));
+ read(fd, (char *) &IX, sizeof(IX));
+ read(fd, (char *) &IY, sizeof(IY));
+ read(fd, (char *) ram, 32768);
+ read(fd, (char *) ram + 32768, 32768);
+ close(fd);
+}
diff --git a/emu/z80pack-1.9/z80sim/sim0.o b/emu/z80pack-1.9/z80sim/sim0.o
new file mode 100644
index 0000000..31bec71
Binary files /dev/null and b/emu/z80pack-1.9/z80sim/sim0.o differ
diff --git a/emu/z80pack-1.9/z80sim/sim1.c b/emu/z80pack-1.9/z80sim/sim1.c
new file mode 100644
index 0000000..d671cc3
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/sim1.c
@@ -0,0 +1,3298 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-JAN-89 Release 1.1
+ * 08-FEB-89 Release 1.2
+ * 13-MAR-89 Release 1.3
+ * 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
+ * 20-DEC-90 Release 1.5 Ported to COHERENT 3.0
+ * 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
+ * and some optimization
+ * 25-JUN-92 Release 1.7 comments in english
+ * 04-OCT-06 Release 1.8 modified to compile on modern POSIX OS's
+ */
+
+#include
+#include
+#include
+#include "sim.h"
+#include "simglb.h"
+
+static int op_notimpl(void);
+static int op_nop(void), op_halt(void), op_scf(void);
+static int op_ccf(void), op_cpl(void), op_daa(void);
+static int op_ei(void), op_di(void);
+static int op_in(void), op_out(void);
+static int op_ldan(void), op_ldbn(void), op_ldcn(void);
+static int op_lddn(void), op_lden(void);
+static int op_ldhn(void), op_ldln(void);
+static int op_ldabc(void), op_ldade(void), op_ldann(void);
+static int op_ldbca(void), op_lddea(void), op_ldnna(void);
+static int op_ldhla(void), op_ldhlb(void), op_ldhlc(void), op_ldhld(void);
+static int op_ldhle(void), op_ldhlh(void), op_ldhll(void), op_ldhl1(void);
+static int op_ldaa(void), op_ldab(void), op_ldac(void);
+static int op_ldad(void), op_ldae(void);
+static int op_ldah(void), op_ldal(void), op_ldahl(void);
+static int op_ldba(void), op_ldbb(void), op_ldbc(void);
+static int op_ldbd(void), op_ldbe(void);
+static int op_ldbh(void), op_ldbl(void), op_ldbhl(void);
+static int op_ldca(void), op_ldcb(void), op_ldcc(void);
+static int op_ldcd(void), op_ldce(void);
+static int op_ldch(void), op_ldcl(void), op_ldchl(void);
+static int op_ldda(void), op_lddb(void), op_lddc(void);
+static int op_lddd(void), op_ldde(void);
+static int op_lddh(void), op_lddl(void), op_lddhl(void);
+static int op_ldea(void), op_ldeb(void), op_ldec(void);
+static int op_lded(void), op_ldee(void);
+static int op_ldeh(void), op_ldel(void), op_ldehl(void);
+static int op_ldha(void), op_ldhb(void), op_ldhc(void);
+static int op_ldhd(void), op_ldhe(void);
+static int op_ldhh(void), op_ldhl(void), op_ldhhl(void);
+static int op_ldla(void), op_ldlb(void), op_ldlc(void);
+static int op_ldld(void), op_ldle(void);
+static int op_ldlh(void), op_ldll(void), op_ldlhl(void);
+static int op_ldbcnn(void), op_lddenn(void), op_ldhlnn(void);
+static int op_ldspnn(void), op_ldsphl(void);
+static int op_ldhlin(void), op_ldinhl(void);
+static int op_incbc(void), op_incde(void), op_inchl(void), op_incsp(void);
+static int op_decbc(void), op_decde(void), op_dechl(void), op_decsp(void);
+static int op_adhlbc(void), op_adhlde(void), op_adhlhl(void), op_adhlsp(void);
+static int op_anda(void), op_andb(void), op_andc(void), op_andd(void), op_ande(void);
+static int op_andh(void), op_andl(void), op_andhl(void), op_andn(void);
+static int op_ora(void), op_orb(void), op_orc(void), op_ord(void), op_ore(void);
+static int op_orh(void), op_orl(void), op_orhl(void), op_orn(void);
+static int op_xora(void), op_xorb(void), op_xorc(void), op_xord(void), op_xore(void);
+static int op_xorh(void), op_xorl(void), op_xorhl(void), op_xorn(void);
+static int op_adda(void), op_addb(void), op_addc(void), op_addd(void), op_adde(void);
+static int op_addh(void), op_addl(void), op_addhl(void), op_addn(void);
+static int op_adca(void), op_adcb(void), op_adcc(void), op_adcd(void), op_adce(void);
+static int op_adch(void), op_adcl(void), op_adchl(void), op_adcn(void);
+static int op_suba(void), op_subb(void), op_subc(void), op_subd(void), op_sube(void);
+static int op_subh(void), op_subl(void), op_subhl(void), op_subn(void);
+static int op_sbca(void), op_sbcb(void), op_sbcc(void), op_sbcd(void), op_sbce(void);
+static int op_sbch(void), op_sbcl(void), op_sbchl(void), op_sbcn(void);
+static int op_cpa(void), op_cpb(void), op_cpc(void), op_cpd(void), op_cpe(void);
+static int op_cph(void), op_cplr(void), op_cphl(void), op_cpn(void);
+static int op_inca(void), op_incb(void), op_incc(void), op_incd(void), op_ince(void);
+static int op_inch(void), op_incl(void), op_incihl(void);
+static int op_deca(void), op_decb(void), op_decc(void), op_decd(void), op_dece(void);
+static int op_dech(void), op_decl(void), op_decihl(void);
+static int op_rlca(void), op_rrca(void),op_rla(void),op_rra(void);
+static int op_exdehl(void), op_exafaf(void), op_exx(void), op_exsphl(void);
+static int op_pushaf(void), op_pushbc(void), op_pushde(void), op_pushhl(void);
+static int op_popaf(void), op_popbc(void), op_popde(void), op_pophl(void);
+static int op_jp(void), op_jphl(void), op_jr(void), op_djnz(void), op_call(void), op_ret(void);
+static int op_jpz(void), op_jpnz(void), op_jpc(void), op_jpnc(void);
+static int op_jppe(void), op_jppo(void), op_jpm(void), op_jpp(void);
+static int op_calz(void), op_calnz(void), op_calc(void), op_calnc(void);
+static int op_calpe(void), op_calpo(void), op_calm(void), op_calp(void);
+static int op_retz(void), op_retnz(void), op_retc(void), op_retnc(void);
+static int op_retpe(void), op_retpo(void), op_retm(void), op_retp(void);
+static int op_jrz(void), op_jrnz(void), op_jrc(void), op_jrnc(void);
+static int op_rst00(void), op_rst08(void), op_rst10(void), op_rst18(void);
+static int op_rst20(void), op_rst28(void), op_rst30(void), op_rst38(void);
+extern int op_cb_handel(void), op_dd_handel(void);
+extern int op_ed_handel(void), op_fd_handel(void);
+
+/*
+ * This function builds the Z80 central processing unit.
+ * The opcode where PC points to is fetched from the memory
+ * and PC incremented by one. The opcode is used as an
+ * index to an array with function pointers, to execute a
+ * function which emulates this Z80 opcode.
+ */
+void cpu(void)
+{
+ static int (*op_sim[256]) (void) = {
+ op_nop, /* 0x00 */
+ op_ldbcnn, /* 0x01 */
+ op_ldbca, /* 0x02 */
+ op_incbc, /* 0x03 */
+ op_incb, /* 0x04 */
+ op_decb, /* 0x05 */
+ op_ldbn, /* 0x06 */
+ op_rlca, /* 0x07 */
+ op_exafaf, /* 0x08 */
+ op_adhlbc, /* 0x09 */
+ op_ldabc, /* 0x0a */
+ op_decbc, /* 0x0b */
+ op_incc, /* 0x0c */
+ op_decc, /* 0x0d */
+ op_ldcn, /* 0x0e */
+ op_rrca, /* 0x0f */
+ op_djnz, /* 0x10 */
+ op_lddenn, /* 0x11 */
+ op_lddea, /* 0x12 */
+ op_incde, /* 0x13 */
+ op_incd, /* 0x14 */
+ op_decd, /* 0x15 */
+ op_lddn, /* 0x16 */
+ op_rla, /* 0x17 */
+ op_jr, /* 0x18 */
+ op_adhlde, /* 0x19 */
+ op_ldade, /* 0x1a */
+ op_decde, /* 0x1b */
+ op_ince, /* 0x1c */
+ op_dece, /* 0x1d */
+ op_lden, /* 0x1e */
+ op_rra, /* 0x1f */
+ op_jrnz, /* 0x20 */
+ op_ldhlnn, /* 0x21 */
+ op_ldinhl, /* 0x22 */
+ op_inchl, /* 0x23 */
+ op_inch, /* 0x24 */
+ op_dech, /* 0x25 */
+ op_ldhn, /* 0x26 */
+ op_daa, /* 0x27 */
+ op_jrz, /* 0x28 */
+ op_adhlhl, /* 0x29 */
+ op_ldhlin, /* 0x2a */
+ op_dechl, /* 0x2b */
+ op_incl, /* 0x2c */
+ op_decl, /* 0x2d */
+ op_ldln, /* 0x2e */
+ op_cpl, /* 0x2f */
+ op_jrnc, /* 0x30 */
+ op_ldspnn, /* 0x31 */
+ op_ldnna, /* 0x32 */
+ op_incsp, /* 0x33 */
+ op_incihl, /* 0x34 */
+ op_decihl, /* 0x35 */
+ op_ldhl1, /* 0x36 */
+ op_scf, /* 0x37 */
+ op_jrc, /* 0x38 */
+ op_adhlsp, /* 0x39 */
+ op_ldann, /* 0x3a */
+ op_decsp, /* 0x3b */
+ op_inca, /* 0x3c */
+ op_deca, /* 0x3d */
+ op_ldan, /* 0x3e */
+ op_ccf, /* 0x3f */
+ op_ldbb, /* 0x40 */
+ op_ldbc, /* 0x41 */
+ op_ldbd, /* 0x42 */
+ op_ldbe, /* 0x43 */
+ op_ldbh, /* 0x44 */
+ op_ldbl, /* 0x45 */
+ op_ldbhl, /* 0x46 */
+ op_ldba, /* 0x47 */
+ op_ldcb, /* 0x48 */
+ op_ldcc, /* 0x49 */
+ op_ldcd, /* 0x4a */
+ op_ldce, /* 0x4b */
+ op_ldch, /* 0x4c */
+ op_ldcl, /* 0x4d */
+ op_ldchl, /* 0x4e */
+ op_ldca, /* 0x4f */
+ op_lddb, /* 0x50 */
+ op_lddc, /* 0x51 */
+ op_lddd, /* 0x52 */
+ op_ldde, /* 0x53 */
+ op_lddh, /* 0x54 */
+ op_lddl, /* 0x55 */
+ op_lddhl, /* 0x56 */
+ op_ldda, /* 0x57 */
+ op_ldeb, /* 0x58 */
+ op_ldec, /* 0x59 */
+ op_lded, /* 0x5a */
+ op_ldee, /* 0x5b */
+ op_ldeh, /* 0x5c */
+ op_ldel, /* 0x5d */
+ op_ldehl, /* 0x5e */
+ op_ldea, /* 0x5f */
+ op_ldhb, /* 0x60 */
+ op_ldhc, /* 0x61 */
+ op_ldhd, /* 0x62 */
+ op_ldhe, /* 0x63 */
+ op_ldhh, /* 0x64 */
+ op_ldhl, /* 0x65 */
+ op_ldhhl, /* 0x66 */
+ op_ldha, /* 0x67 */
+ op_ldlb, /* 0x68 */
+ op_ldlc, /* 0x69 */
+ op_ldld, /* 0x6a */
+ op_ldle, /* 0x6b */
+ op_ldlh, /* 0x6c */
+ op_ldll, /* 0x6d */
+ op_ldlhl, /* 0x6e */
+ op_ldla, /* 0x6f */
+ op_ldhlb, /* 0x70 */
+ op_ldhlc, /* 0x71 */
+ op_ldhld, /* 0x72 */
+ op_ldhle, /* 0x73 */
+ op_ldhlh, /* 0x74 */
+ op_ldhll, /* 0x75 */
+ op_halt, /* 0x76 */
+ op_ldhla, /* 0x77 */
+ op_ldab, /* 0x78 */
+ op_ldac, /* 0x79 */
+ op_ldad, /* 0x7a */
+ op_ldae, /* 0x7b */
+ op_ldah, /* 0x7c */
+ op_ldal, /* 0x7d */
+ op_ldahl, /* 0x7e */
+ op_ldaa, /* 0x7f */
+ op_addb, /* 0x80 */
+ op_addc, /* 0x81 */
+ op_addd, /* 0x82 */
+ op_adde, /* 0x83 */
+ op_addh, /* 0x84 */
+ op_addl, /* 0x85 */
+ op_addhl, /* 0x86 */
+ op_adda, /* 0x87 */
+ op_adcb, /* 0x88 */
+ op_adcc, /* 0x89 */
+ op_adcd, /* 0x8a */
+ op_adce, /* 0x8b */
+ op_adch, /* 0x8c */
+ op_adcl, /* 0x8d */
+ op_adchl, /* 0x8e */
+ op_adca, /* 0x8f */
+ op_subb, /* 0x90 */
+ op_subc, /* 0x91 */
+ op_subd, /* 0x92 */
+ op_sube, /* 0x93 */
+ op_subh, /* 0x94 */
+ op_subl, /* 0x95 */
+ op_subhl, /* 0x96 */
+ op_suba, /* 0x97 */
+ op_sbcb, /* 0x98 */
+ op_sbcc, /* 0x99 */
+ op_sbcd, /* 0x9a */
+ op_sbce, /* 0x9b */
+ op_sbch, /* 0x9c */
+ op_sbcl, /* 0x9d */
+ op_sbchl, /* 0x9e */
+ op_sbca, /* 0x9f */
+ op_andb, /* 0xa0 */
+ op_andc, /* 0xa1 */
+ op_andd, /* 0xa2 */
+ op_ande, /* 0xa3 */
+ op_andh, /* 0xa4 */
+ op_andl, /* 0xa5 */
+ op_andhl, /* 0xa6 */
+ op_anda, /* 0xa7 */
+ op_xorb, /* 0xa8 */
+ op_xorc, /* 0xa9 */
+ op_xord, /* 0xaa */
+ op_xore, /* 0xab */
+ op_xorh, /* 0xac */
+ op_xorl, /* 0xad */
+ op_xorhl, /* 0xae */
+ op_xora, /* 0xaf */
+ op_orb, /* 0xb0 */
+ op_orc, /* 0xb1 */
+ op_ord, /* 0xb2 */
+ op_ore, /* 0xb3 */
+ op_orh, /* 0xb4 */
+ op_orl, /* 0xb5 */
+ op_orhl, /* 0xb6 */
+ op_ora, /* 0xb7 */
+ op_cpb, /* 0xb8 */
+ op_cpc, /* 0xb9 */
+ op_cpd, /* 0xba */
+ op_cpe, /* 0xbb */
+ op_cph, /* 0xbc */
+ op_cplr, /* 0xbd */
+ op_cphl, /* 0xbe */
+ op_cpa, /* 0xbf */
+ op_retnz, /* 0xc0 */
+ op_popbc, /* 0xc1 */
+ op_jpnz, /* 0xc2 */
+ op_jp, /* 0xc3 */
+ op_calnz, /* 0xc4 */
+ op_pushbc, /* 0xc5 */
+ op_addn, /* 0xc6 */
+ op_rst00, /* 0xc7 */
+ op_retz, /* 0xc8 */
+ op_ret, /* 0xc9 */
+ op_jpz, /* 0xca */
+ op_cb_handel, /* 0xcb */
+ op_calz, /* 0xcc */
+ op_call, /* 0xcd */
+ op_adcn, /* 0xce */
+ op_rst08, /* 0xcf */
+ op_retnc, /* 0xd0 */
+ op_popde, /* 0xd1 */
+ op_jpnc, /* 0xd2 */
+ op_out, /* 0xd3 */
+ op_calnc, /* 0xd4 */
+ op_pushde, /* 0xd5 */
+ op_subn, /* 0xd6 */
+ op_rst10, /* 0xd7 */
+ op_retc, /* 0xd8 */
+ op_exx, /* 0xd9 */
+ op_jpc, /* 0xda */
+ op_in, /* 0xdb */
+ op_calc, /* 0xdc */
+ op_dd_handel, /* 0xdd */
+ op_sbcn, /* 0xde */
+ op_rst18, /* 0xdf */
+ op_retpo, /* 0xe0 */
+ op_pophl, /* 0xe1 */
+ op_jppo, /* 0xe2 */
+ op_exsphl, /* 0xe3 */
+ op_calpo, /* 0xe4 */
+ op_pushhl, /* 0xe5 */
+ op_andn, /* 0xe6 */
+ op_rst20, /* 0xe7 */
+ op_retpe, /* 0xe8 */
+ op_jphl, /* 0xe9 */
+ op_jppe, /* 0xea */
+ op_exdehl, /* 0xeb */
+ op_calpe, /* 0xec */
+ op_ed_handel, /* 0xed */
+ op_xorn, /* 0xee */
+ op_rst28, /* 0xef */
+ op_retp, /* 0xf0 */
+ op_popaf, /* 0xf1 */
+ op_jpp, /* 0xf2 */
+ op_di, /* 0xf3 */
+ op_calp, /* 0xf4 */
+ op_pushaf, /* 0xf5 */
+ op_orn, /* 0xf6 */
+ op_rst30, /* 0xf7 */
+ op_retm, /* 0xf8 */
+ op_ldsphl, /* 0xf9 */
+ op_jpm, /* 0xfa */
+ op_ei, /* 0xfb */
+ op_calm, /* 0xfc */
+ op_fd_handel, /* 0xfd */
+ op_cpn, /* 0xfe */
+ op_rst38 /* 0xff */
+ };
+
+#ifdef WANT_TIM
+ register int t;
+#endif
+
+ do {
+
+#ifdef HISIZE /* write history */
+ his[h_next].h_adr = PC - ram;
+ his[h_next].h_af = (A << 8) + F;
+ his[h_next].h_bc = (B << 8) + C;
+ his[h_next].h_de = (D << 8) + E;
+ his[h_next].h_hl = (H << 8) + L;
+ his[h_next].h_ix = IX;
+ his[h_next].h_iy = IY;
+ his[h_next].h_sp = STACK - ram;
+ h_next++;
+ if (h_next == HISIZE) {
+ h_flag = 1;
+ h_next = 0;
+ }
+#endif
+
+#ifdef WANT_TIM /* check for start address of runtime measurement */
+ if (PC == t_start && !t_flag) {
+ t_flag = 1; /* switch measurement on */
+ t_states = 0L; /* initialize counted T-states */
+ }
+#endif
+
+#ifdef WANT_INT /* CPU interrupt handling */
+ if (int_type)
+ switch (int_type) {
+ case INT_NMI: /* non maskable interrupt */
+ int_type = INT_NONE;
+ IFF <<= 1;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram) >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram);
+ PC = ram + 0x66;
+ break;
+ case INT_INT: /* maskable interrupt */
+ if (IFF != 3)
+ break;
+ IFF = 0;
+ switch (int_mode) {
+ case 0:
+ break;
+ case 1:
+ int_type = INT_NONE;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram) >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram);
+ PC = ram + 0x38;
+ break;
+ case 2:
+ break;
+ }
+ break;
+ }
+#endif
+
+#ifdef WANT_TIM
+ t = (*op_sim[*PC++]) ();/* execute next opcode */
+ if (f_flag) { /* adjust CPU speed */
+
+ }
+#else
+ (*op_sim[*PC++]) ();
+#endif
+
+#ifdef WANT_PCC
+ if (PC > ram + 65535) /* check for PC overrun */
+ PC = ram;
+#endif
+
+ R++; /* increment refresh register */
+
+#ifdef WANT_TIM /* do runtime measurement */
+ if (t_flag) {
+ t_states += t; /* add T-states for this opcode */
+ if (PC == t_end) /* check for end address */
+ t_flag = 0; /* if reached, switch off */
+ }
+#endif
+
+ } while (cpu_state);
+}
+
+/*
+ * Trap not implemented opcodes. This function may be usefull
+ * later to trap some wanted opcodes.
+ */
+static int op_notimpl(void)
+{
+ cpu_error = OPTRAP1;
+ cpu_state = STOPPED;
+ return(0);
+}
+
+static int op_nop(void) /* NOP */
+{
+ return(4);
+}
+
+static int op_halt(void) /* HALT */
+{
+ struct timespec timer;
+
+ if (break_flag) {
+ cpu_error = OPHALT;
+ cpu_state = STOPPED;
+ } else
+ while (int_type == 0) {
+ timer.tv_sec = 0;
+ timer.tv_nsec = 10000000;
+ nanosleep(&timer, NULL);
+ R += 99999;
+ }
+ return(0);
+}
+
+static int op_scf(void) /* SCF */
+{
+ F |= C_FLAG;
+ F &= ~(N_FLAG | H_FLAG);
+ return(4);
+}
+
+static int op_ccf(void) /* CCF */
+{
+ if (F & C_FLAG) {
+ F |= H_FLAG;
+ F &= ~C_FLAG;
+ } else {
+ F &= ~H_FLAG;
+ F |= C_FLAG;
+ }
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_cpl(void) /* CPL */
+{
+ A = ~A;
+ F |= H_FLAG | N_FLAG;
+ return(4);
+}
+
+static int op_daa(void) /* DAA */
+{
+ register int old_a;
+
+ old_a = A;
+ if (F & N_FLAG) { /* subtractions */
+ if (((A & 0x0f) > 9) || (F & H_FLAG)) {
+ (((old_a & 0x0f) - 6) < 0) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ A = old_a -= 6;
+ }
+ if (((A & 0xf0) > 0x90) || (F & C_FLAG)) {
+ A -= 0x60;
+ if (old_a - 0x60 < 0)
+ F |= C_FLAG;
+ }
+ } else { /* additions */
+ if (((A & 0x0f) > 9) || (F & H_FLAG)) {
+ (((old_a & 0x0f) + 6) > 0x0f) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ A = old_a += 6;
+ }
+ if (((A & 0xf0) > 0x90) || (F & C_FLAG)) {
+ A += 0x60;
+ if (old_a + 0x60 > 255)
+ F |= C_FLAG;
+ }
+ }
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(4);
+}
+
+static int op_ei(void) /* EI */
+{
+ IFF = 3;
+ return(4);
+}
+
+static int op_di(void) /* DI */
+{
+ IFF = 0;
+ return(4);
+}
+
+static int op_in(void) /* IN A,(n) */
+{
+ BYTE io_in();
+
+ A = io_in(*PC++);
+ return(11);
+}
+
+static int op_out(void) /* OUT (n),A */
+{
+ BYTE io_out();
+
+ io_out(*PC++, A);
+ return(11);
+}
+
+static int op_ldan(void) /* LD A,n */
+{
+ A = *PC++;
+ return(7);
+}
+
+static int op_ldbn(void) /* LD B,n */
+{
+ B = *PC++;
+ return(7);
+}
+
+static int op_ldcn(void) /* LD C,n */
+{
+ C = *PC++;
+ return(7);
+}
+
+static int op_lddn(void) /* LD D,n */
+{
+ D = *PC++;
+ return(7);
+}
+
+static int op_lden(void) /* LD E,n */
+{
+ E = *PC++;
+ return(7);
+}
+
+static int op_ldhn(void) /* LD H,n */
+{
+ H = *PC++;
+ return(7);
+}
+
+static int op_ldln(void) /* LD L,n */
+{
+ L = *PC++;
+ return(7);
+}
+
+static int op_ldabc(void) /* LD A,(BC) */
+{
+ A = *(ram + (B << 8) + C);
+ return(7);
+}
+
+static int op_ldade(void) /* LD A,(DE) */
+{
+ A = *(ram + (D << 8) + E);
+ return(7);
+}
+
+static int op_ldann(void) /* LD A,(nn) */
+{
+ register unsigned i;
+
+ i = *PC++;
+ i += *PC++ << 8;
+ A = *(ram + i);
+ return(13);
+}
+
+static int op_ldbca(void) /* LD (BC),A */
+{
+ *(ram + (B << 8) + C) = A;
+ return(7);
+}
+
+static int op_lddea(void) /* LD (DE),A */
+{
+ *(ram + (D << 8) + E) = A;
+ return(7);
+}
+
+static int op_ldnna(void) /* LD (nn),A */
+{
+ register unsigned i;
+
+ i = *PC++;
+ i += *PC++ << 8;
+ *(ram + i) = A;
+ return(13);
+}
+
+static int op_ldhla(void) /* LD (HL),A */
+{
+ *(ram + (H << 8) + L) = A;
+ return(7);
+}
+
+static int op_ldhlb(void) /* LD (HL),B */
+{
+ *(ram + (H << 8) + L) = B;
+ return(7);
+}
+
+static int op_ldhlc(void) /* LD (HL),C */
+{
+ *(ram + (H << 8) + L) = C;
+ return(7);
+}
+
+static int op_ldhld(void) /* LD (HL),D */
+{
+ *(ram + (H << 8) + L) = D;
+ return(7);
+}
+
+static int op_ldhle(void) /* LD (HL),E */
+{
+ *(ram + (H << 8) + L) = E;
+ return(7);
+}
+
+static int op_ldhlh(void) /* LD (HL),H */
+{
+ *(ram + (H << 8) + L) = H;
+ return(7);
+}
+
+static int op_ldhll(void) /* LD (HL),L */
+{
+ *(ram + (H << 8) + L) = L;
+ return(7);
+}
+
+static int op_ldhl1(void) /* LD (HL),n */
+{
+ *(ram + (H << 8) + L) = *PC++;
+ return(10);
+}
+
+static int op_ldaa(void) /* LD A,A */
+{
+ return(4);
+}
+
+static int op_ldab(void) /* LD A,B */
+{
+ A = B;
+ return(4);
+}
+
+static int op_ldac(void) /* LD A,C */
+{
+ A = C;
+ return(4);
+}
+
+static int op_ldad(void) /* LD A,D */
+{
+ A = D;
+ return(4);
+}
+
+static int op_ldae(void) /* LD A,E */
+{
+ A = E;
+ return(4);
+}
+
+static int op_ldah(void) /* LD A,H */
+{
+ A = H;
+ return(4);
+}
+
+static int op_ldal(void) /* LD A,L */
+{
+ A = L;
+ return(4);
+}
+
+static int op_ldahl(void) /* LD A,(HL) */
+{
+ A = *(ram + (H << 8) + L);
+ return(7);
+}
+
+static int op_ldba(void) /* LD B,A */
+{
+ B = A;
+ return(4);
+}
+
+static int op_ldbb(void) /* LD B,B */
+{
+ return(4);
+}
+
+static int op_ldbc(void) /* LD B,C */
+{
+ B = C;
+ return(4);
+}
+
+static int op_ldbd(void) /* LD B,D */
+{
+ B = D;
+ return(4);
+}
+
+static int op_ldbe(void) /* LD B,E */
+{
+ B = E;
+ return(4);
+}
+
+static int op_ldbh(void) /* LD B,H */
+{
+ B = H;
+ return(4);
+}
+
+static int op_ldbl(void) /* LD B,L */
+{
+ B = L;
+ return(4);
+}
+
+static int op_ldbhl(void) /* LD B,(HL) */
+{
+ B = *(ram + (H << 8) + L);
+ return(7);
+}
+
+static int op_ldca(void) /* LD C,A */
+{
+ C = A;
+ return(4);
+}
+
+static int op_ldcb(void) /* LD C,B */
+{
+ C = B;
+ return(4);
+}
+
+static int op_ldcc(void) /* LD C,C */
+{
+ return(4);
+}
+
+static int op_ldcd(void) /* LD C,D */
+{
+ C = D;
+ return(4);
+}
+
+static int op_ldce(void) /* LD C,E */
+{
+ C = E;
+ return(4);
+}
+
+static int op_ldch(void) /* LD C,H */
+{
+ C = H;
+ return(4);
+}
+
+static int op_ldcl(void) /* LD C,L */
+{
+ C = L;
+ return(4);
+}
+
+static int op_ldchl(void) /* LD C,(HL) */
+{
+ C = *(ram + (H << 8) + L);
+ return(7);
+}
+
+static int op_ldda(void) /* LD D,A */
+{
+ D = A;
+ return(4);
+}
+
+static int op_lddb(void) /* LD D,B */
+{
+ D = B;
+ return(4);
+}
+
+static int op_lddc(void) /* LD D,C */
+{
+ D = C;
+ return(4);
+}
+
+static int op_lddd(void) /* LD D,D */
+{
+ return(4);
+}
+
+static int op_ldde(void) /* LD D,E */
+{
+ D = E;
+ return(4);
+}
+
+static int op_lddh(void) /* LD D,H */
+{
+ D = H;
+ return(4);
+}
+
+static int op_lddl(void) /* LD D,L */
+{
+ D = L;
+ return(4);
+}
+
+static int op_lddhl(void) /* LD D,(HL) */
+{
+ D = *(ram + (H << 8) + L);
+ return(7);
+}
+
+static int op_ldea(void) /* LD E,A */
+{
+ E = A;
+ return(4);
+}
+
+static int op_ldeb(void) /* LD E,B */
+{
+ E = B;
+ return(4);
+}
+
+static int op_ldec(void) /* LD E,C */
+{
+ E = C;
+ return(4);
+}
+
+static int op_lded(void) /* LD E,D */
+{
+ E = D;
+ return(4);
+}
+
+static int op_ldee(void) /* LD E,E */
+{
+ return(4);
+}
+
+static int op_ldeh(void) /* LD E,H */
+{
+ E = H;
+ return(4);
+}
+
+static int op_ldel(void) /* LD E,L */
+{
+ E = L;
+ return(4);
+}
+
+static int op_ldehl(void) /* LD E,(HL) */
+{
+ E = *(ram + (H << 8) + L);
+ return(7);
+}
+
+static int op_ldha(void) /* LD H,A */
+{
+ H = A;
+ return(4);
+}
+
+static int op_ldhb(void) /* LD H,B */
+{
+ H = B;
+ return(4);
+}
+
+static int op_ldhc(void) /* LD H,C */
+{
+ H = C;
+ return(4);
+}
+
+static int op_ldhd(void) /* LD H,D */
+{
+ H = D;
+ return(4);
+}
+
+static int op_ldhe(void) /* LD H,E */
+{
+ H = E;
+ return(4);
+}
+
+static int op_ldhh(void) /* LD H,H */
+{
+ return(4);
+}
+
+static int op_ldhl(void) /* LD H,L */
+{
+ H = L;
+ return(4);
+}
+
+static int op_ldhhl(void) /* LD H,(HL) */
+{
+ H = *(ram + (H << 8) + L);
+ return(7);
+}
+
+static int op_ldla(void) /* LD L,A */
+{
+ L = A;
+ return(4);
+}
+
+static int op_ldlb(void) /* LD L,B */
+{
+ L = B;
+ return(4);
+}
+
+static int op_ldlc(void) /* LD L,C */
+{
+ L = C;
+ return(4);
+}
+
+static int op_ldld(void) /* LD L,D */
+{
+ L = D;
+ return(4);
+}
+
+static int op_ldle(void) /* LD L,E */
+{
+ L = E;
+ return(4);
+}
+
+static int op_ldlh(void) /* LD L,H */
+{
+ L = H;
+ return(4);
+}
+
+static int op_ldll(void) /* LD L,L */
+{
+ return(4);
+}
+
+static int op_ldlhl(void) /* LD L,(HL) */
+{
+ L = *(ram + (H << 8) + L);
+ return(7);
+}
+
+static int op_ldbcnn(void) /* LD BC,nn */
+{
+ C = *PC++;
+ B = *PC++;
+ return(10);
+}
+
+static int op_lddenn(void) /* LD DE,nn */
+{
+ E = *PC++;
+ D = *PC++;
+ return(10);
+}
+
+static int op_ldhlnn(void) /* LD HL,nn */
+{
+ L = *PC++;
+ H = *PC++;
+ return(10);
+}
+
+static int op_ldspnn(void) /* LD SP,nn */
+{
+ STACK = ram + *PC++;
+ STACK += *PC++ << 8;
+ return(10);
+}
+
+static int op_ldsphl(void) /* LD SP,HL */
+{
+ STACK = ram + (H << 8) + L;
+ return(6);
+}
+
+static int op_ldhlin(void) /* LD HL,(nn) */
+{
+ register unsigned i;
+
+ i = *PC++;
+ i += *PC++ << 8;
+ L = *(ram + i);
+ H = *(ram + i + 1);
+ return(16);
+}
+
+static int op_ldinhl(void) /* LD (nn),HL */
+{
+ register unsigned i;
+
+ i = *PC++;
+ i += *PC++ << 8;
+ *(ram + i) = L;
+ *(ram + i + 1) = H;
+ return(16);
+}
+
+static int op_incbc(void) /* INC BC */
+{
+ C++;
+ if (!C)
+ B++;
+ return(6);
+}
+
+static int op_incde(void) /* INC DE */
+{
+ E++;
+ if (!E)
+ D++;
+ return(6);
+}
+
+static int op_inchl(void) /* INC HL */
+{
+ L++;
+ if (!L)
+ H++;
+ return(6);
+}
+
+static int op_incsp(void) /* INC SP */
+{
+ STACK++;
+#ifdef WANT_SPC
+ if (STACK > ram + 65535)
+ STACK = ram;
+#endif
+ return(6);
+}
+
+static int op_decbc(void) /* DEC BC */
+{
+ C--;
+ if (C == 0xff)
+ B--;
+ return(6);
+}
+
+static int op_decde(void) /* DEC DE */
+{
+ E--;
+ if (E == 0xff)
+ D--;
+ return(6);
+}
+
+static int op_dechl(void) /* DEC HL */
+{
+ L--;
+ if (L == 0xff)
+ H--;
+ return(6);
+}
+
+static int op_decsp(void) /* DEC SP */
+{
+ STACK--;
+#ifdef WANT_SPC
+ if (STACK < ram)
+ STACK = ram + 65535;
+#endif
+ return(6);
+}
+
+static int op_adhlbc(void) /* ADD HL,BC */
+{
+ register int carry;
+
+ carry = (L + C > 255) ? 1 : 0;
+ L += C;
+ ((H & 0xf) + (B & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (H + B + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ H += B + carry;
+ F &= ~N_FLAG;
+ return(11);
+}
+
+static int op_adhlde(void) /* ADD HL,DE */
+{
+ register int carry;
+
+ carry = (L + E > 255) ? 1 : 0;
+ L += E;
+ ((H & 0xf) + (D & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (H + D + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ H += D + carry;
+ F &= ~N_FLAG;
+ return(11);
+}
+
+static int op_adhlhl(void) /* ADD HL,HL */
+{
+ register int carry;
+
+ carry = (L << 1 > 255) ? 1 : 0;
+ L <<= 1;
+ ((H & 0xf) + (H & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (H + H + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ H += H + carry;
+ F &= ~N_FLAG;
+ return(11);
+}
+
+static int op_adhlsp(void) /* ADD HL,SP */
+{
+ register int carry;
+ BYTE spl = (STACK - ram) & 0xff;
+ BYTE sph = (STACK - ram) >> 8;
+
+ carry = (L + spl > 255) ? 1 : 0;
+ L += spl;
+ ((H & 0xf) + (sph & 0xf) + carry > 0xf) ? (F |= H_FLAG)
+ : (F &= ~H_FLAG);
+ (H + sph + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ H += sph + carry;
+ F &= ~N_FLAG;
+ return(11);
+}
+
+static int op_anda(void) /* AND A */
+{
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= H_FLAG;
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_andb(void) /* AND B */
+{
+ A &= B;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= H_FLAG;
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_andc(void) /* AND C */
+{
+ A &= C;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= H_FLAG;
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_andd(void) /* AND D */
+{
+ A &= D;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= H_FLAG;
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_ande(void) /* AND E */
+{
+ A &= E;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= H_FLAG;
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_andh(void) /* AND H */
+{
+ A &= H;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= H_FLAG;
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_andl(void) /* AND L */
+{
+ A &= L;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= H_FLAG;
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_andhl(void) /* AND (HL) */
+{
+ A &= *(ram + (H << 8) + L);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= H_FLAG;
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(N_FLAG | C_FLAG);
+ return(7);
+}
+
+static int op_andn(void) /* AND n */
+{
+ A &= *PC++;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= H_FLAG;
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(N_FLAG | C_FLAG);
+ return(7);
+}
+
+static int op_ora(void) /* OR A */
+{
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_orb(void) /* OR B */
+{
+ A |= B;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_orc(void) /* OR C */
+{
+ A |= C;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_ord(void) /* OR D */
+{
+ A |= D;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_ore(void) /* OR E */
+{
+ A |= E;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_orh(void) /* OR H */
+{
+ A |= H;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_orl(void) /* OR L */
+{
+ A |= L;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_orhl(void) /* OR (HL) */
+{
+ A |= *(ram + (H << 8) + L);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(7);
+}
+
+static int op_orn(void) /* OR n */
+{
+ A |= *PC++;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(7);
+}
+
+static int op_xora(void) /* XOR A */
+{
+ A = 0;
+ F &= ~(S_FLAG | H_FLAG | N_FLAG | C_FLAG);
+ F |= Z_FLAG | P_FLAG;
+ return(4);
+}
+
+static int op_xorb(void) /* XOR B */
+{
+ A ^= B;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_xorc(void) /* XOR C */
+{
+ A ^= C;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_xord(void) /* XOR D */
+{
+ A ^= D;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_xore(void) /* XOR E */
+{
+ A ^= E;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_xorh(void) /* XOR H */
+{
+ A ^= H;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_xorl(void) /* XOR L */
+{
+ A ^= L;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(4);
+}
+
+static int op_xorhl(void) /* XOR (HL) */
+{
+ A ^= *(ram + (H << 8) + L);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(7);
+}
+
+static int op_xorn(void) /* XOR n */
+{
+ A ^= *PC++;
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(7);
+}
+
+static int op_adda(void) /* ADD A,A */
+{
+ register int i;
+
+ ((A & 0xf) + (A & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ ((A << 1) > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = ((char) A) << 1;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_addb(void) /* ADD A,B */
+{
+ register int i;
+
+ ((A & 0xf) + (B & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + B > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) B;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_addc(void) /* ADD A,C */
+{
+ register int i;
+
+ ((A & 0xf) + (C & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + C > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) C;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_addd(void) /* ADD A,Dn*/
+{
+ register int i;
+
+ ((A & 0xf) + (D & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + D > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) D;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_adde(void) /* ADD A,E */
+{
+ register int i;
+
+ ((A & 0xf) + (E & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + E > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) E;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_addh(void) /* ADD A,H */
+{
+ register int i;
+
+ ((A & 0xf) + (H & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + H > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) H;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_addl(void) /* ADD A,L */
+{
+ register int i;
+
+ ((A & 0xf) + (L & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + L > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) L;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_addhl(void) /* ADD A,(HL) */
+{
+ register int i;
+ register BYTE P;
+
+ P = *(ram + (H << 8) + L);
+ ((A & 0xf) + (P & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + P > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) P;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(7);
+}
+
+static int op_addn(void) /* ADD A,n */
+{
+ register int i;
+ register BYTE P;
+
+ P = *PC++;
+ ((A & 0xf) + (P & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + P > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) P;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(7);
+}
+
+static int op_adca(void) /* ADC A,A */
+{
+ register int i, carry;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ ((A & 0xf) + (A & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ ((A << 1) + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (((char) A) << 1) + carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_adcb(void) /* ADC A,B */
+{
+ register int i, carry;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ ((A & 0xf) + (B & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + B + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) B + carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_adcc(void) /* ADC A,C */
+{
+ register int i, carry;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ ((A & 0xf) + (C & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + C + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) C + carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_adcd(void) /* ADC A,D */
+{
+ register int i, carry;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ ((A & 0xf) + (D & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + D + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) D + carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_adce(void) /* ADC A,E */
+{
+ register int i, carry;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ ((A & 0xf) + (E & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + E + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) E + carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_adch(void) /* ADC A,H */
+{
+ register int i, carry;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ ((A & 0xf) + (H & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + H + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) H + carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_adcl(void) /* ADC A,L */
+{
+ register int i, carry;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ ((A & 0xf) + (L & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + L + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) L + carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_adchl(void) /* ADC A,(HL) */
+{
+ register int i, carry;
+ register BYTE P;
+
+ P = *(ram + (H << 8) + L);
+ carry = (F & C_FLAG) ? 1 : 0;
+ ((A & 0xf) + (P & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + P + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) P + carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(7);
+}
+
+static int op_adcn(void) /* ADC A,n */
+{
+ register int i, carry;
+ register BYTE P;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ P = *PC++;
+ ((A & 0xf) + (P & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + P + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) P + carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(7);
+}
+
+static int op_suba(void) /* SUB A,A */
+{
+ A = 0;
+ F &= ~(S_FLAG | H_FLAG | P_FLAG | C_FLAG);
+ F |= Z_FLAG | N_FLAG;
+ return(4);
+}
+
+static int op_subb(void) /* SUB A,B */
+{
+ register int i;
+
+ ((B & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (B > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) B;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_subc(void) /* SUB A,C */
+{
+ register int i;
+
+ ((C & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (C > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) C;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_subd(void) /* SUB A,D */
+{
+ register int i;
+
+ ((D & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (D > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) D;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_sube(void) /* SUB A,E */
+{
+ register int i;
+
+ ((E & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (E > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) E;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_subh(void) /* SUB A,H */
+{
+ register int i;
+
+ ((H & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (H > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) H;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_subl(void) /* SUB A,L */
+{
+ register int i;
+
+ ((L & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (L > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) L;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_subhl(void) /* SUB A,(HL) */
+{
+ register int i;
+ register BYTE P;
+
+ P = *(ram + (H << 8) + L);
+ ((P & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (P > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) P;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(7);
+}
+
+static int op_subn(void) /* SUB A,n */
+{
+ register int i;
+ register BYTE P;
+
+ P = *PC++;
+ ((P & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (P > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) P;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(7);
+}
+
+static int op_sbca(void) /* SBC A,A */
+{
+ if (F & C_FLAG) {
+ F |= S_FLAG | H_FLAG | N_FLAG | C_FLAG;
+ F &= ~(Z_FLAG | P_FLAG);
+ A = 255;
+ } else {
+ F |= Z_FLAG | N_FLAG;
+ F &= ~(S_FLAG | H_FLAG | P_FLAG | C_FLAG);
+ A = 0;
+ }
+ return(4);
+}
+
+static int op_sbcb(void) /* SBC A,B */
+{
+ register int i, carry;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ ((B & 0xf) + carry > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (B + carry > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) B - carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_sbcc(void) /* SBC A,C */
+{
+ register int i, carry;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ ((C & 0xf) + carry > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (C + carry > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) C - carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_sbcd(void) /* SBC A,D */
+{
+ register int i, carry;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ ((D & 0xf) + carry > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (D + carry > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) D - carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_sbce(void) /* SBC A,E */
+{
+ register int i, carry;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ ((E & 0xf) + carry > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (E + carry > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) E - carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_sbch(void) /* SBC A,H */
+{
+ register int i, carry;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ ((H & 0xf) + carry > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (H + carry > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) H - carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_sbcl(void) /* SBC A,L */
+{
+ register int i, carry;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ ((L & 0xf) + carry > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (L + carry > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) L - carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_sbchl(void) /* SBC A,(HL) */
+{
+ register int i, carry;
+ register BYTE P;
+
+ P = *(ram + (H << 8) + L);
+ carry = (F & C_FLAG) ? 1 : 0;
+ ((P & 0xf) + carry > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (P + carry > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) P - carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(7);
+}
+
+static int op_sbcn(void) /* SBC A,n */
+{
+ register int i, carry;
+ register BYTE P;
+
+ P = *PC++;
+ carry = (F & C_FLAG) ? 1 : 0;
+ ((P & 0xf) + carry > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (P + carry > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) P - carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(7);
+}
+
+static int op_cpa(void) /* CP A */
+{
+ F &= ~(S_FLAG | H_FLAG | P_FLAG | C_FLAG);
+ F |= Z_FLAG | N_FLAG;
+ return(4);
+}
+
+static int op_cpb(void) /* CP B */
+{
+ register int i;
+
+ ((B & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (B > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ i = (char) A - (char) B;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_cpc(void) /* CP C */
+{
+ register int i;
+
+ ((C & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (C > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ i = (char) A - (char) C;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_cpd(void) /* CP D */
+{
+ register int i;
+
+ ((D & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (D > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ i = (char) A - (char) D;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_cpe(void) /* CP E */
+{
+ register int i;
+
+ ((E & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (E > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ i = (char) A - (char) E;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_cph(void) /* CP H */
+{
+ register int i;
+
+ ((H & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (H > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ i = (char) A - (char) H;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_cplr(void) /* CP L */
+{
+ register int i;
+
+ ((L & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (L > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ i = (char) A - (char) L;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_cphl(void) /* CP (HL) */
+{
+ register int i;
+ register BYTE P;
+
+ P = *(ram + (H << 8) + L);
+ ((P & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (P > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ i = (char) A - (char) P;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(7);
+}
+
+static int op_cpn(void) /* CP n */
+{
+ register int i;
+ register BYTE P;
+
+ P = *PC++;
+ ((P & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (P > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ i = (char) A - (char) P;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(7);
+}
+
+static int op_inca(void) /* INC A */
+{
+ ((A & 0xf) + 1 > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ A++;
+ (A == 128) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_incb(void) /* INC B */
+{
+ ((B & 0xf) + 1 > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ B++;
+ (B == 128) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (B & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (B) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_incc(void) /* INC C */
+{
+ ((C & 0xf) + 1 > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ C++;
+ (C == 128) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (C & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (C) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_incd(void) /* INC D */
+{
+ ((D & 0xf) + 1 > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ D++;
+ (D == 128) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (D & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (D) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_ince(void) /* INC E */
+{
+ ((E & 0xf) + 1 > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ E++;
+ (E == 128) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (E & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (E) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_inch(void) /* INC H */
+{
+ ((H & 0xf) + 1 > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ H++;
+ (H == 128) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (H & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (H) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_incl(void) /* INC L */
+{
+ ((L & 0xf) + 1 > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ L++;
+ (L == 128) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (L & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (L) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(4);
+}
+
+static int op_incihl(void) /* INC (HL) */
+{
+ register BYTE *p;
+
+ p = ram + (H << 8) + L;
+ ((*p & 0xf) + 1 > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (*p)++;
+ (*p == 128) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(11);
+}
+
+static int op_deca(void) /* DEC A */
+{
+ (((A - 1) & 0xf) == 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ A--;
+ (A == 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_decb(void) /* DEC B */
+{
+ (((B - 1) & 0xf) == 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ B--;
+ (B == 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (B & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (B) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_decc(void) /* DEC C */
+{
+ (((C - 1) & 0xf) == 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ C--;
+ (C == 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (C & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (C) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_decd(void) /* DEC D */
+{
+ (((D - 1) & 0xf) == 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ D--;
+ (D == 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (D & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (D) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_dece(void) /* DEC E */
+{
+ (((E - 1) & 0xf) == 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ E--;
+ (E == 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (E & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (E) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_dech(void) /* DEC H */
+{
+ (((H - 1) & 0xf) == 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ H--;
+ (H == 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (H & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (H) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_decl(void) /* DEC L */
+{
+ (((L - 1) & 0xf) == 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ L--;
+ (L == 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (L & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (L) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(4);
+}
+
+static int op_decihl(void) /* DEC (HL) */
+{
+ register BYTE *p;
+
+ p = ram + (H << 8) + L;
+ (((*p - 1) & 0xf) == 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (*p)--;
+ (*p == 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(11);
+}
+
+static int op_rlca(void) /* RLCA */
+{
+ register int i;
+
+ i = (A & 128) ? 1 : 0;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ A <<= 1;
+ A |= i;
+ return(4);
+}
+
+static int op_rrca(void) /* RRCA */
+{
+ register int i;
+
+ i = A & 1;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ A >>= 1;
+ if (i) A |= 128;
+ return(4);
+}
+
+static int op_rla(void) /* RLA */
+{
+ register int old_c_flag;
+
+ old_c_flag = F & C_FLAG;
+ (A & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ A <<= 1;
+ if (old_c_flag) A |= 1;
+ return(4);
+}
+
+static int op_rra(void) /* RRA */
+{
+ register int i, old_c_flag;
+
+ old_c_flag = F & C_FLAG;
+ i = A & 1;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ A >>= 1;
+ if (old_c_flag) A |= 128;
+ return(4);
+}
+
+static int op_exdehl(void) /* EX DE,HL */
+{
+ register unsigned i;
+
+ i = D;
+ D = H;
+ H = i;
+ i = E;
+ E = L;
+ L = i;
+ return(4);
+}
+
+static int op_exafaf(void) /* EX AF,AF' */
+{
+ register unsigned i;
+
+ i = A;
+ A = A_;
+ A_ = i;
+ i = F;
+ F = F_;
+ F_ = i;
+ return(4);
+}
+
+static int op_exx(void) /* EXX */
+{
+ register unsigned i;
+
+ i = B;
+ B = B_;
+ B_ = i;
+ i = C;
+ C = C_;
+ C_ = i;
+ i = D;
+ D = D_;
+ D_ = i;
+ i = E;
+ E = E_;
+ E_ = i;
+ i = H;
+ H = H_;
+ H_ = i;
+ i = L;
+ L = L_;
+ L_ = i;
+ return(4);
+}
+
+static int op_exsphl(void) /* EX (SP),HL */
+{
+ register int i;
+
+ i = *STACK;
+ *STACK = L;
+ L = i;
+ i = *(STACK + 1);
+ *(STACK + 1) = H;
+ H = i;
+ return(19);
+}
+
+static int op_pushaf(void) /* PUSH AF */
+{
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = A;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = F;
+ return(11);
+}
+
+static int op_pushbc(void) /* PUSH BC */
+{
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = B;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = C;
+ return(11);
+}
+
+static int op_pushde(void) /* PUSH DE */
+{
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = D;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = E;
+ return(11);
+}
+
+static int op_pushhl(void) /* PUSH HL */
+{
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = H;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = L;
+ return(11);
+}
+
+static int op_popaf(void) /* POP AF */
+{
+ F = *STACK++;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ A = *STACK++;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ return(10);
+}
+
+static int op_popbc(void) /* POP BC */
+{
+ C = *STACK++;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ B = *STACK++;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ return(10);
+}
+
+static int op_popde(void) /* POP DE */
+{
+ E = *STACK++;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ D = *STACK++;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ return(10);
+}
+
+static int op_pophl(void) /* POP HL */
+{
+ L = *STACK++;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ H = *STACK++;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ return(10);
+}
+
+static int op_jp(void) /* JP */
+{
+ register unsigned i;
+
+ i = *PC++;
+ i += *PC << 8;
+ PC = ram + i;
+ return(10);
+}
+
+static int op_jphl(void) /* JP (HL) */
+{
+ PC = ram + (H << 8) + L;
+ return(4);
+}
+
+static int op_jr(void) /* JR */
+{
+ PC += (char) *PC + 1;
+ return(12);
+}
+
+static int op_djnz(void) /* DJNZ */
+{
+ if (--B) {
+ PC += (char) *PC + 1;
+ return(13);
+ } else {
+ PC++;
+ return(8);
+ }
+}
+
+static int op_call(void) /* CALL */
+{
+ register unsigned i;
+
+ i = *PC++;
+ i += *PC++ << 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram) >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram);
+ PC = ram + i;
+ return(17);
+}
+
+static int op_ret(void) /* RET */
+{
+ register unsigned i;
+
+ i = *STACK++;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ i += *STACK++ << 8;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ PC = ram + i;
+ return(10);
+}
+
+static int op_jpz(void) /* JP Z,nn */
+{
+ register unsigned i;
+
+ if (F & Z_FLAG) {
+ i = *PC++;
+ i += *PC++ << 8;
+ PC = ram + i;
+ } else
+ PC += 2;
+ return(10);
+}
+
+static int op_jpnz(void) /* JP NZ,nn */
+{
+ register unsigned i;
+
+ if (!(F & Z_FLAG)) {
+ i = *PC++;
+ i += *PC++ << 8;
+ PC = ram + i;
+ } else
+ PC += 2;
+ return(10);
+}
+
+static int op_jpc(void) /* JP C,nn */
+{
+ register unsigned i;
+
+ if (F & C_FLAG) {
+ i = *PC++;
+ i += *PC++ << 8;
+ PC = ram + i;
+ } else
+ PC += 2;
+ return(10);
+}
+
+static int op_jpnc(void) /* JP NC,nn */
+{
+ register unsigned i;
+
+ if (!(F & C_FLAG)) {
+ i = *PC++;
+ i += *PC++ << 8;
+ PC = ram + i;
+ } else
+ PC += 2;
+ return(10);
+}
+
+static int op_jppe(void) /* JP PE,nn */
+{
+ register unsigned i;
+
+ if (F & P_FLAG) {
+ i = *PC++;
+ i += *PC++ << 8;
+ PC = ram + i;
+ } else
+ PC += 2;
+ return(10);
+}
+
+static int op_jppo(void) /* JP PO,nn */
+{
+ register unsigned i;
+
+ if (!(F & P_FLAG)) {
+ i = *PC++;
+ i += *PC++ << 8;
+ PC = ram + i;
+ } else
+ PC += 2;
+ return(10);
+}
+
+static int op_jpm(void) /* JP M,nn */
+{
+ register unsigned i;
+
+ if (F & S_FLAG) {
+ i = *PC++;
+ i += *PC++ << 8;
+ PC = ram + i;
+ } else
+ PC += 2;
+ return(10);
+}
+
+static int op_jpp(void) /* JP P,nn */
+{
+ register unsigned i;
+
+ if (!(F & S_FLAG)) {
+ i = *PC++;
+ i += *PC++ << 8;
+ PC = ram + i;
+ } else
+ PC += 2;
+ return(10);
+}
+
+static int op_calz(void) /* CALL Z,nn */
+{
+ register unsigned i;
+
+ if (F & Z_FLAG) {
+ i = *PC++;
+ i += *PC++ << 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram) >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram);
+ PC = ram + i;
+ return(17);
+ } else {
+ PC += 2;
+ return(10);
+ }
+}
+
+static int op_calnz(void) /* CALL NZ,nn */
+{
+ register unsigned i;
+
+ if (!(F & Z_FLAG)) {
+ i = *PC++;
+ i += *PC++ << 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram) >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram);
+ PC = ram + i;
+ return(17);
+ } else {
+ PC += 2;
+ return(10);
+ }
+}
+
+static int op_calc(void) /* CALL C,nn */
+{
+ register unsigned i;
+
+ if (F & C_FLAG) {
+ i = *PC++;
+ i += *PC++ << 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram) >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram);
+ PC = ram + i;
+ return(17);
+ } else {
+ PC += 2;
+ return(10);
+ }
+}
+
+static int op_calnc(void) /* CALL NC,nn */
+{
+ register unsigned i;
+
+ if (!(F & C_FLAG)) {
+ i = *PC++;
+ i += *PC++ << 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram) >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram);
+ PC = ram + i;
+ return(17);
+ } else {
+ PC += 2;
+ return(10);
+ }
+}
+
+static int op_calpe(void) /* CALL PE,nn */
+{
+ register unsigned i;
+
+ if (F & P_FLAG) {
+ i = *PC++;
+ i += *PC++ << 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram) >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram);
+ PC = ram + i;
+ return(17);
+ } else {
+ PC += 2;
+ return(10);
+ }
+}
+
+static int op_calpo(void) /* CALL PO,nn */
+{
+ register unsigned i;
+
+ if (!(F & P_FLAG)) {
+ i = *PC++;
+ i += *PC++ << 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram) >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram);
+ PC = ram + i;
+ return(17);
+ } else {
+ PC += 2;
+ return(10);
+ }
+}
+
+static int op_calm(void) /* CALL M,nn */
+{
+ register unsigned i;
+
+ if (F & S_FLAG) {
+ i = *PC++;
+ i += *PC++ << 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram) >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram);
+ PC = ram + i;
+ return(17);
+ } else {
+ PC += 2;
+ return(10);
+ }
+}
+
+static int op_calp(void) /* CALL P,nn */
+{
+ register unsigned i;
+
+ if (!(F & S_FLAG)) {
+ i = *PC++;
+ i += *PC++ << 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram) >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram);
+ PC = ram + i;
+ return(17);
+ } else {
+ PC += 2;
+ return(10);
+ }
+}
+
+static int op_retz(void) /* RET Z */
+{
+ register unsigned i;
+
+ if (F & Z_FLAG) {
+ i = *STACK++;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ i += *STACK++ << 8;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ PC = ram + i;
+ return(11);
+ } else {
+ return(5);
+ }
+}
+
+static int op_retnz(void) /* RET NZ */
+{
+ register unsigned i;
+
+ if (!(F & Z_FLAG)) {
+ i = *STACK++;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ i += *STACK++ << 8;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ PC = ram + i;
+ return(11);
+ } else {
+ return(5);
+ }
+}
+
+static int op_retc(void) /* RET C */
+{
+ register unsigned i;
+
+ if (F & C_FLAG) {
+ i = *STACK++;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ i += *STACK++ << 8;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ PC = ram + i;
+ return(11);
+ } else {
+ return(5);
+ }
+}
+
+static int op_retnc(void) /* RET NC */
+{
+ register unsigned i;
+
+ if (!(F & C_FLAG)) {
+ i = *STACK++;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ i += *STACK++ << 8;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ PC = ram + i;
+ return(11);
+ } else {
+ return(5);
+ }
+}
+
+static int op_retpe(void) /* RET PE */
+{
+ register unsigned i;
+
+ if (F & P_FLAG) {
+ i = *STACK++;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ i += *STACK++ << 8;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ PC = ram + i;
+ return(11);
+ } else {
+ return(5);
+ }
+}
+
+static int op_retpo(void) /* RET PO */
+{
+ register unsigned i;
+
+ if (!(F & P_FLAG)) {
+ i = *STACK++;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ i += *STACK++ << 8;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ PC = ram + i;
+ return(11);
+ } else {
+ return(5);
+ }
+}
+
+static int op_retm(void) /* RET M */
+{
+ register unsigned i;
+
+ if (F & S_FLAG) {
+ i = *STACK++;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ i += *STACK++ << 8;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ PC = ram + i;
+ return(11);
+ } else {
+ return(5);
+ }
+}
+
+static int op_retp(void) /* RET P */
+{
+ register unsigned i;
+
+ if (!(F & S_FLAG)) {
+ i = *STACK++;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ i += *STACK++ << 8;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ PC = ram + i;
+ return(11);
+ } else {
+ return(5);
+ }
+}
+
+static int op_jrz(void) /* JR Z,n */
+{
+ if (F & Z_FLAG) {
+ PC += (char) *PC + 1;
+ return(12);
+ } else {
+ PC++;
+ return(7);
+ }
+}
+
+static int op_jrnz(void) /* JR NZ,n */
+{
+ if (!(F & Z_FLAG)) {
+ PC += (char) *PC + 1;
+ return(12);
+ } else {
+ PC++;
+ return(7);
+ }
+}
+
+static int op_jrc(void) /* JR C,n */
+{
+ if (F & C_FLAG) {
+ PC += (char) *PC + 1;
+ return(12);
+ } else {
+ PC++;
+ return(7);
+ }
+}
+
+static int op_jrnc(void) /* JR NC,n */
+{
+ if (!(F & C_FLAG)) {
+ PC += (char) *PC + 1;
+ return(12);
+ } else {
+ PC++;
+ return(7);
+ }
+}
+
+static int op_rst00(void) /* RST 00 */
+{
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram) >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram);
+ PC = ram;
+ return(11);
+}
+
+static int op_rst08(void) /* RST 08 */
+{
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram) >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram);
+ PC = ram + 0x08;
+ return(11);
+}
+
+static int op_rst10(void) /* RST 10 */
+{
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram) >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram);
+ PC = ram + 0x10;
+ return(11);
+}
+
+static int op_rst18(void) /* RST 18 */
+{
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram) >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram);
+ PC = ram + 0x18;
+ return(11);
+}
+
+static int op_rst20(void) /* RST 20 */
+{
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram) >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram);
+ PC = ram + 0x20;
+ return(11);
+}
+
+static int op_rst28(void) /* RST 28 */
+{
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram) >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram);
+ PC = ram + 0x28;
+ return(11);
+}
+
+static int op_rst30(void) /* RST 30 */
+{
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram) >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram);
+ PC = ram + 0x30;
+ return(11);
+}
+
+static int op_rst38(void) /* RST 38 */
+{
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram) >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = (PC - ram);
+ PC = ram + 0x38;
+ return(11);
+}
diff --git a/emu/z80pack-1.9/z80sim/sim1.o b/emu/z80pack-1.9/z80sim/sim1.o
new file mode 100644
index 0000000..d2c2f48
Binary files /dev/null and b/emu/z80pack-1.9/z80sim/sim1.o differ
diff --git a/emu/z80pack-1.9/z80sim/sim2.c b/emu/z80pack-1.9/z80sim/sim2.c
new file mode 100644
index 0000000..1c7d3fd
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/sim2.c
@@ -0,0 +1,2511 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-JAN-89 Release 1.1
+ * 08-FEB-89 Release 1.2
+ * 13-MAR-89 Release 1.3
+ * 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
+ * 20-DEC-90 Release 1.5 Ported to COHERENT 3.0
+ * 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
+ * and some optimization
+ * 25-JUN-92 Release 1.7 comments in english
+ * 07-OCT-06 Release 1.8 modified to compile on modern POSIX OS's
+ */
+
+/*
+ * Like the function "cpu()" this one emulates multi byte opcodes
+ * starting with 0xcb
+ */
+
+#include "sim.h"
+#include "simglb.h"
+
+static int trap_cb(void);
+static int op_srla(void), op_srlb(void), op_srlc(void);
+static int op_srld(void), op_srle(void);
+static int op_srlh(void), op_srll(void), op_srlhl(void);
+static int op_slaa(void), op_slab(void), op_slac(void);
+static int op_slad(void), op_slae(void);
+static int op_slah(void), op_slal(void), op_slahl(void);
+static int op_rlra(void), op_rlb(void), op_rlc(void);
+static int op_rld(void), op_rle(void);
+static int op_rlh(void), op_rll(void), op_rlhl(void);
+static int op_rrra(void), op_rrb(void), op_rrc(void);
+static int op_rrd(void), op_rre(void);
+static int op_rrh(void), op_rrl(void), op_rrhl(void);
+static int op_rrcra(void), op_rrcb(void), op_rrcc(void);
+static int op_rrcd(void), op_rrce(void);
+static int op_rrch(void), op_rrcl(void), op_rrchl(void);
+static int op_rlcra(void), op_rlcb(void), op_rlcc(void);
+static int op_rlcd(void), op_rlce(void);
+static int op_rlch(void), op_rlcl(void), op_rlchl(void);
+static int op_sraa(void), op_srab(void), op_srac(void);
+static int op_srad(void), op_srae(void);
+static int op_srah(void), op_sral(void), op_srahl(void);
+static int op_sb0a(void), op_sb1a(void), op_sb2a(void), op_sb3a(void);
+static int op_sb4a(void), op_sb5a(void), op_sb6a(void), op_sb7a(void);
+static int op_sb0b(void), op_sb1b(void), op_sb2b(void), op_sb3b(void);
+static int op_sb4b(void), op_sb5b(void), op_sb6b(void), op_sb7b(void);
+static int op_sb0c(void), op_sb1c(void), op_sb2c(void), op_sb3c(void);
+static int op_sb4c(void), op_sb5c(void), op_sb6c(void), op_sb7c(void);
+static int op_sb0d(void), op_sb1d(void), op_sb2d(void), op_sb3d(void);
+static int op_sb4d(void), op_sb5d(void), op_sb6d(void), op_sb7d(void);
+static int op_sb0e(void), op_sb1e(void), op_sb2e(void), op_sb3e(void);
+static int op_sb4e(void), op_sb5e(void), op_sb6e(void), op_sb7e(void);
+static int op_sb0h(void), op_sb1h(void), op_sb2h(void), op_sb3h(void);
+static int op_sb4h(void), op_sb5h(void), op_sb6h(void), op_sb7h(void);
+static int op_sb0l(void), op_sb1l(void), op_sb2l(void), op_sb3l(void);
+static int op_sb4l(void), op_sb5l(void), op_sb6l(void), op_sb7l(void);
+static int op_sb0hl(void), op_sb1hl(void), op_sb2hl(void), op_sb3hl(void);
+static int op_sb4hl(void), op_sb5hl(void), op_sb6hl(void), op_sb7hl(void);
+static int op_rb0a(void), op_rb1a(void), op_rb2a(void), op_rb3a(void);
+static int op_rb4a(void), op_rb5a(void), op_rb6a(void), op_rb7a(void);
+static int op_rb0b(void), op_rb1b(void), op_rb2b(void), op_rb3b(void);
+static int op_rb4b(void), op_rb5b(void), op_rb6b(void), op_rb7b(void);
+static int op_rb0c(void), op_rb1c(void), op_rb2c(void), op_rb3c(void);
+static int op_rb4c(void), op_rb5c(void), op_rb6c(void), op_rb7c(void);
+static int op_rb0d(void), op_rb1d(void), op_rb2d(void), op_rb3d(void);
+static int op_rb4d(void), op_rb5d(void), op_rb6d(void), op_rb7d(void);
+static int op_rb0e(void), op_rb1e(void), op_rb2e(void), op_rb3e(void);
+static int op_rb4e(void), op_rb5e(void), op_rb6e(void), op_rb7e(void);
+static int op_rb0h(void), op_rb1h(void), op_rb2h(void), op_rb3h(void);
+static int op_rb4h(void), op_rb5h(void), op_rb6h(void), op_rb7h(void);
+static int op_rb0l(void), op_rb1l(void), op_rb2l(void), op_rb3l(void);
+static int op_rb4l(void), op_rb5l(void), op_rb6l(void), op_rb7l(void);
+static int op_rb0hl(void), op_rb1hl(void), op_rb2hl(void), op_rb3hl(void);
+static int op_rb4hl(void), op_rb5hl(void), op_rb6hl(void), op_rb7hl(void);
+static int op_tb0a(void), op_tb1a(void), op_tb2a(void), op_tb3a(void);
+static int op_tb4a(void), op_tb5a(void), op_tb6a(void), op_tb7a(void);
+static int op_tb0b(void), op_tb1b(void), op_tb2b(void), op_tb3b(void);
+static int op_tb4b(void), op_tb5b(void), op_tb6b(void), op_tb7b(void);
+static int op_tb0c(void), op_tb1c(void), op_tb2c(void), op_tb3c(void);
+static int op_tb4c(void), op_tb5c(void), op_tb6c(void), op_tb7c(void);
+static int op_tb0d(void), op_tb1d(void), op_tb2d(void), op_tb3d(void);
+static int op_tb4d(void), op_tb5d(void), op_tb6d(void), op_tb7d(void);
+static int op_tb0e(void), op_tb1e(void), op_tb2e(void), op_tb3e(void);
+static int op_tb4e(void), op_tb5e(void), op_tb6e(void), op_tb7e(void);
+static int op_tb0h(void), op_tb1h(void), op_tb2h(void), op_tb3h(void);
+static int op_tb4h(void), op_tb5h(void), op_tb6h(void), op_tb7h(void);
+static int op_tb0l(void), op_tb1l(void), op_tb2l(void), op_tb3l(void);
+static int op_tb4l(void), op_tb5l(void), op_tb6l(void), op_tb7l(void);
+static int op_tb0hl(void), op_tb1hl(void), op_tb2hl(void), op_tb3hl(void);
+static int op_tb4hl(void), op_tb5hl(void), op_tb6hl(void), op_tb7hl(void);
+
+int op_cb_handel(void)
+{
+ register int t;
+
+ static int (*op_cb[256]) (void) = {
+ op_rlcb, /* 0x00 */
+ op_rlcc, /* 0x01 */
+ op_rlcd, /* 0x02 */
+ op_rlce, /* 0x03 */
+ op_rlch, /* 0x04 */
+ op_rlcl, /* 0x05 */
+ op_rlchl, /* 0x06 */
+ op_rlcra, /* 0x07 */
+ op_rrcb, /* 0x08 */
+ op_rrcc, /* 0x09 */
+ op_rrcd, /* 0x0a */
+ op_rrce, /* 0x0b */
+ op_rrch, /* 0x0c */
+ op_rrcl, /* 0x0d */
+ op_rrchl, /* 0x0e */
+ op_rrcra, /* 0x0f */
+ op_rlb, /* 0x10 */
+ op_rlc, /* 0x11 */
+ op_rld, /* 0x12 */
+ op_rle, /* 0x13 */
+ op_rlh, /* 0x14 */
+ op_rll, /* 0x15 */
+ op_rlhl, /* 0x16 */
+ op_rlra, /* 0x17 */
+ op_rrb, /* 0x18 */
+ op_rrc, /* 0x19 */
+ op_rrd, /* 0x1a */
+ op_rre, /* 0x1b */
+ op_rrh, /* 0x1c */
+ op_rrl, /* 0x1d */
+ op_rrhl, /* 0x1e */
+ op_rrra, /* 0x1f */
+ op_slab, /* 0x20 */
+ op_slac, /* 0x21 */
+ op_slad, /* 0x22 */
+ op_slae, /* 0x23 */
+ op_slah, /* 0x24 */
+ op_slal, /* 0x25 */
+ op_slahl, /* 0x26 */
+ op_slaa, /* 0x27 */
+ op_srab, /* 0x28 */
+ op_srac, /* 0x29 */
+ op_srad, /* 0x2a */
+ op_srae, /* 0x2b */
+ op_srah, /* 0x2c */
+ op_sral, /* 0x2d */
+ op_srahl, /* 0x2e */
+ op_sraa, /* 0x2f */
+ trap_cb, /* 0x30 */
+ trap_cb, /* 0x31 */
+ trap_cb, /* 0x32 */
+ trap_cb, /* 0x33 */
+ trap_cb, /* 0x34 */
+ trap_cb, /* 0x35 */
+ trap_cb, /* 0x36 */
+ trap_cb, /* 0x37 */
+ op_srlb, /* 0x38 */
+ op_srlc, /* 0x39 */
+ op_srld, /* 0x3a */
+ op_srle, /* 0x3b */
+ op_srlh, /* 0x3c */
+ op_srll, /* 0x3d */
+ op_srlhl, /* 0x3e */
+ op_srla, /* 0x3f */
+ op_tb0b, /* 0x40 */
+ op_tb0c, /* 0x41 */
+ op_tb0d, /* 0x42 */
+ op_tb0e, /* 0x43 */
+ op_tb0h, /* 0x44 */
+ op_tb0l, /* 0x45 */
+ op_tb0hl, /* 0x46 */
+ op_tb0a, /* 0x47 */
+ op_tb1b, /* 0x48 */
+ op_tb1c, /* 0x49 */
+ op_tb1d, /* 0x4a */
+ op_tb1e, /* 0x4b */
+ op_tb1h, /* 0x4c */
+ op_tb1l, /* 0x4d */
+ op_tb1hl, /* 0x4e */
+ op_tb1a, /* 0x4f */
+ op_tb2b, /* 0x50 */
+ op_tb2c, /* 0x51 */
+ op_tb2d, /* 0x52 */
+ op_tb2e, /* 0x53 */
+ op_tb2h, /* 0x54 */
+ op_tb2l, /* 0x55 */
+ op_tb2hl, /* 0x56 */
+ op_tb2a, /* 0x57 */
+ op_tb3b, /* 0x58 */
+ op_tb3c, /* 0x59 */
+ op_tb3d, /* 0x5a */
+ op_tb3e, /* 0x5b */
+ op_tb3h, /* 0x5c */
+ op_tb3l, /* 0x5d */
+ op_tb3hl, /* 0x5e */
+ op_tb3a, /* 0x5f */
+ op_tb4b, /* 0x60 */
+ op_tb4c, /* 0x61 */
+ op_tb4d, /* 0x62 */
+ op_tb4e, /* 0x63 */
+ op_tb4h, /* 0x64 */
+ op_tb4l, /* 0x65 */
+ op_tb4hl, /* 0x66 */
+ op_tb4a, /* 0x67 */
+ op_tb5b, /* 0x68 */
+ op_tb5c, /* 0x69 */
+ op_tb5d, /* 0x6a */
+ op_tb5e, /* 0x6b */
+ op_tb5h, /* 0x6c */
+ op_tb5l, /* 0x6d */
+ op_tb5hl, /* 0x6e */
+ op_tb5a, /* 0x6f */
+ op_tb6b, /* 0x70 */
+ op_tb6c, /* 0x71 */
+ op_tb6d, /* 0x72 */
+ op_tb6e, /* 0x73 */
+ op_tb6h, /* 0x74 */
+ op_tb6l, /* 0x75 */
+ op_tb6hl, /* 0x76 */
+ op_tb6a, /* 0x77 */
+ op_tb7b, /* 0x78 */
+ op_tb7c, /* 0x79 */
+ op_tb7d, /* 0x7a */
+ op_tb7e, /* 0x7b */
+ op_tb7h, /* 0x7c */
+ op_tb7l, /* 0x7d */
+ op_tb7hl, /* 0x7e */
+ op_tb7a, /* 0x7f */
+ op_rb0b, /* 0x80 */
+ op_rb0c, /* 0x81 */
+ op_rb0d, /* 0x82 */
+ op_rb0e, /* 0x83 */
+ op_rb0h, /* 0x84 */
+ op_rb0l, /* 0x85 */
+ op_rb0hl, /* 0x86 */
+ op_rb0a, /* 0x87 */
+ op_rb1b, /* 0x88 */
+ op_rb1c, /* 0x89 */
+ op_rb1d, /* 0x8a */
+ op_rb1e, /* 0x8b */
+ op_rb1h, /* 0x8c */
+ op_rb1l, /* 0x8d */
+ op_rb1hl, /* 0x8e */
+ op_rb1a, /* 0x8f */
+ op_rb2b, /* 0x90 */
+ op_rb2c, /* 0x91 */
+ op_rb2d, /* 0x92 */
+ op_rb2e, /* 0x93 */
+ op_rb2h, /* 0x94 */
+ op_rb2l, /* 0x95 */
+ op_rb2hl, /* 0x96 */
+ op_rb2a, /* 0x97 */
+ op_rb3b, /* 0x98 */
+ op_rb3c, /* 0x99 */
+ op_rb3d, /* 0x9a */
+ op_rb3e, /* 0x9b */
+ op_rb3h, /* 0x9c */
+ op_rb3l, /* 0x9d */
+ op_rb3hl, /* 0x9e */
+ op_rb3a, /* 0x9f */
+ op_rb4b, /* 0xa0 */
+ op_rb4c, /* 0xa1 */
+ op_rb4d, /* 0xa2 */
+ op_rb4e, /* 0xa3 */
+ op_rb4h, /* 0xa4 */
+ op_rb4l, /* 0xa5 */
+ op_rb4hl, /* 0xa6 */
+ op_rb4a, /* 0xa7 */
+ op_rb5b, /* 0xa8 */
+ op_rb5c, /* 0xa9 */
+ op_rb5d, /* 0xaa */
+ op_rb5e, /* 0xab */
+ op_rb5h, /* 0xac */
+ op_rb5l, /* 0xad */
+ op_rb5hl, /* 0xae */
+ op_rb5a, /* 0xaf */
+ op_rb6b, /* 0xb0 */
+ op_rb6c, /* 0xb1 */
+ op_rb6d, /* 0xb2 */
+ op_rb6e, /* 0xb3 */
+ op_rb6h, /* 0xb4 */
+ op_rb6l, /* 0xb5 */
+ op_rb6hl, /* 0xb6 */
+ op_rb6a, /* 0xb7 */
+ op_rb7b, /* 0xb8 */
+ op_rb7c, /* 0xb9 */
+ op_rb7d, /* 0xba */
+ op_rb7e, /* 0xbb */
+ op_rb7h, /* 0xbc */
+ op_rb7l, /* 0xbd */
+ op_rb7hl, /* 0xbe */
+ op_rb7a, /* 0xbf */
+ op_sb0b, /* 0xc0 */
+ op_sb0c, /* 0xc1 */
+ op_sb0d, /* 0xc2 */
+ op_sb0e, /* 0xc3 */
+ op_sb0h, /* 0xc4 */
+ op_sb0l, /* 0xc5 */
+ op_sb0hl, /* 0xc6 */
+ op_sb0a, /* 0xc7 */
+ op_sb1b, /* 0xc8 */
+ op_sb1c, /* 0xc9 */
+ op_sb1d, /* 0xca */
+ op_sb1e, /* 0xcb */
+ op_sb1h, /* 0xcc */
+ op_sb1l, /* 0xcd */
+ op_sb1hl, /* 0xce */
+ op_sb1a, /* 0xcf */
+ op_sb2b, /* 0xd0 */
+ op_sb2c, /* 0xd1 */
+ op_sb2d, /* 0xd2 */
+ op_sb2e, /* 0xd3 */
+ op_sb2h, /* 0xd4 */
+ op_sb2l, /* 0xd5 */
+ op_sb2hl, /* 0xd6 */
+ op_sb2a, /* 0xd7 */
+ op_sb3b, /* 0xd8 */
+ op_sb3c, /* 0xd9 */
+ op_sb3d, /* 0xda */
+ op_sb3e, /* 0xdb */
+ op_sb3h, /* 0xdc */
+ op_sb3l, /* 0xdd */
+ op_sb3hl, /* 0xde */
+ op_sb3a, /* 0xdf */
+ op_sb4b, /* 0xe0 */
+ op_sb4c, /* 0xe1 */
+ op_sb4d, /* 0xe2 */
+ op_sb4e, /* 0xe3 */
+ op_sb4h, /* 0xe4 */
+ op_sb4l, /* 0xe5 */
+ op_sb4hl, /* 0xe6 */
+ op_sb4a, /* 0xe7 */
+ op_sb5b, /* 0xe8 */
+ op_sb5c, /* 0xe9 */
+ op_sb5d, /* 0xea */
+ op_sb5e, /* 0xeb */
+ op_sb5h, /* 0xec */
+ op_sb5l, /* 0xed */
+ op_sb5hl, /* 0xee */
+ op_sb5a, /* 0xef */
+ op_sb6b, /* 0xf0 */
+ op_sb6c, /* 0xf1 */
+ op_sb6d, /* 0xf2 */
+ op_sb6e, /* 0xf3 */
+ op_sb6h, /* 0xf4 */
+ op_sb6l, /* 0xf5 */
+ op_sb6hl, /* 0xf6 */
+ op_sb6a, /* 0xf7 */
+ op_sb7b, /* 0xf8 */
+ op_sb7c, /* 0xf9 */
+ op_sb7d, /* 0xfa */
+ op_sb7e, /* 0xfb */
+ op_sb7h, /* 0xfc */
+ op_sb7l, /* 0xfd */
+ op_sb7hl, /* 0xfe */
+ op_sb7a /* 0xff */
+ };
+
+#ifdef WANT_TIM
+ t = (*op_cb[*PC++]) (); /* execute next opcode */
+#else
+ (*op_cb[*PC++]) ();
+#endif
+
+#ifdef WANT_PCC
+ if (PC > ram + 65535) /* correct PC overrun */
+ PC = ram;
+#endif
+
+ return(t);
+}
+
+/*
+ * This function traps all illegal opcodes following the
+ * initial 0xcb of a multi byte opcode.
+ */
+static int trap_cb(void)
+{
+ cpu_error = OPTRAP2;
+ cpu_state = STOPPED;
+ return(0);
+}
+
+static int op_srla(void) /* SRL A */
+{
+ (A & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A >>= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_srlb(void) /* SRL B */
+{
+ (B & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ B >>= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (B) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (B & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[B]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_srlc(void) /* SRL C */
+{
+ (C & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ C >>= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (C) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (C & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[C]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_srld(void) /* SRL D */
+{
+ (D & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ D >>= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (D) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (D & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[D]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_srle(void) /* SRL E */
+{
+ (E & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ E >>= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (E) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (E & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[E]) ? (F &= ~P_FLAG) :(F |= P_FLAG);
+ return(8);
+}
+
+static int op_srlh(void) /* SRL H */
+{
+ (H & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ H >>= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (H) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (H & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[H]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_srll(void) /* SRL L */
+{
+ (L & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ L >>= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (L) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (L & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[L]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_srlhl(void) /* SRL (HL) */
+{
+ register BYTE *p;
+
+ p = ram + (H << 8) + L;
+ (*p & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ *p >>= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(15);
+}
+
+static int op_slaa(void) /* SLA A */
+{
+ (A & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A <<= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_slab(void) /* SLA B */
+{
+ (B & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ B <<= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (B) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (B & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[B]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_slac(void) /* SLA C */
+{
+ (C & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ C <<= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (C) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (C & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[C]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_slad(void) /* SLA D */
+{
+ (D & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ D <<= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (D) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (D & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[D]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_slae(void) /* SLA E */
+{
+ (E & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ E <<= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (E) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (E & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[E]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_slah(void) /* SLA H */
+{
+ (H & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ H <<= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (H) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (H & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[H]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_slal(void) /* SLA L */
+{
+ (L & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ L <<= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (L) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (L & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[L]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_slahl(void) /* SLA (HL) */
+{
+ register BYTE *p;
+
+ p = ram + (H << 8) + L;
+ (*p & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ *p <<= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(15);
+}
+
+static int op_rlra(void) /* RL A */
+{
+ register int old_c_flag;
+
+ old_c_flag = F & C_FLAG;
+ (A & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A <<= 1;
+ if (old_c_flag) A |= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rlb(void) /* RL B */
+{
+ register int old_c_flag;
+
+ old_c_flag = F & C_FLAG;
+ (B & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ B <<= 1;
+ if (old_c_flag) B |= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (B) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (B & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[B]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rlc(void) /* RL C */
+{
+ register int old_c_flag;
+
+ old_c_flag = F & C_FLAG;
+ (C & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ C <<= 1;
+ if (old_c_flag) C |= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (C) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (C & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[C]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rld(void) /* RL D */
+{
+ register int old_c_flag;
+
+ old_c_flag = F & C_FLAG;
+ (D & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ D <<= 1;
+ if (old_c_flag) D |= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (D) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (D & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[D]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rle(void) /* RL E */
+{
+ register int old_c_flag;
+
+ old_c_flag = F & C_FLAG;
+ (E & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ E <<= 1;
+ if (old_c_flag) E |= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (E) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (E & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[E]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rlh(void) /* RL H */
+{
+ register int old_c_flag;
+
+ old_c_flag = F & C_FLAG;
+ (H & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ H <<= 1;
+ if (old_c_flag) H |= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (H) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (H & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[H]) ? (F &= ~P_FLAG) :(F |= P_FLAG);
+ return(8);
+}
+
+static int op_rll(void) /* RL L */
+{
+ register int old_c_flag;
+
+ old_c_flag = F & C_FLAG;
+ (L & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ L <<= 1;
+ if (old_c_flag) L |= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (L) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (L & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[L]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rlhl(void) /* RL (HL) */
+{
+ register int old_c_flag;
+ register BYTE *p;
+
+ p = ram + (H << 8) + L;
+ old_c_flag = F & C_FLAG;
+ (*p & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ *p <<= 1;
+ if (old_c_flag) *p |= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(15);
+}
+
+static int op_rrra(void) /* RR A */
+{
+ register int old_c_flag;
+
+ old_c_flag = F & C_FLAG;
+ (A & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A >>= 1;
+ if (old_c_flag) A |= 128;
+ F &= ~(H_FLAG | N_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rrb(void) /* RR B */
+{
+ register int old_c_flag;
+
+ old_c_flag = F & C_FLAG;
+ (B & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ B >>= 1;
+ if (old_c_flag) B |= 128;
+ F &= ~(H_FLAG | N_FLAG);
+ (B) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (B & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[B]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rrc(void) /* RR C */
+{
+ register int old_c_flag;
+
+ old_c_flag = F & C_FLAG;
+ (C & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ C >>= 1;
+ if (old_c_flag) C |= 128;
+ F &= ~(H_FLAG | N_FLAG);
+ (C) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (C & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[C]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rrd(void) /* RR D */
+{
+ register int old_c_flag;
+
+ old_c_flag = F & C_FLAG;
+ (D & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ D >>= 1;
+ if (old_c_flag) D |= 128;
+ F &= ~(H_FLAG | N_FLAG);
+ (D) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (D & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[D]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rre(void) /* RR E */
+{
+ register int old_c_flag;
+
+ old_c_flag = F & C_FLAG;
+ (E & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ E >>= 1;
+ if (old_c_flag) E |= 128;
+ F &= ~(H_FLAG | N_FLAG);
+ (E) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (E & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[E]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rrh(void) /* RR H */
+{
+ register int old_c_flag;
+
+ old_c_flag = F & C_FLAG;
+ (H & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ H >>= 1;
+ if (old_c_flag) H |= 128;
+ F &= ~(H_FLAG | N_FLAG);
+ (H) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (H & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[H]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rrl(void) /* RR L */
+{
+ register int old_c_flag;
+
+ old_c_flag = F & C_FLAG;
+ (L & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ L >>= 1;
+ if (old_c_flag) L |= 128;
+ F &= ~(H_FLAG | N_FLAG);
+ (L) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (L & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[L]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rrhl(void) /* RR (HL) */
+{
+ register int old_c_flag;
+ register BYTE *p;
+
+ old_c_flag = F & C_FLAG;
+ p = ram + (H << 8) + L;
+ (*p & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ *p >>= 1;
+ if (old_c_flag) *p |= 128;
+ F &= ~(H_FLAG | N_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(15);
+}
+
+static int op_rrcra(void) /* RRC A */
+{
+ register int i;
+
+ i = A & 1;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ A >>= 1;
+ if (i) A |= 128;
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rrcb(void) /* RRC B */
+{
+ register int i;
+
+ i = B & 1;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ B >>= 1;
+ if (i) B |= 128;
+ (B) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (B & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[B]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rrcc(void) /* RRC C */
+{
+ register int i;
+
+ i = C & 1;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ C >>= 1;
+ if (i) C |= 128;
+ (C) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (C & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[C]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rrcd(void) /* RRC D */
+{
+ register int i;
+
+ i = D & 1;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ D >>= 1;
+ if (i) D |= 128;
+ (D) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (D & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[D]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rrce(void) /* RRC E */
+{
+ register int i;
+
+ i = E & 1;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ E >>= 1;
+ if (i) E |= 128;
+ (E) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (E & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[E]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rrch(void) /* RRC H */
+{
+ register int i;
+
+ i = H & 1;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ H >>= 1;
+ if (i) H |= 128;
+ (H) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (H & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[H]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rrcl(void) /* RRC L */
+{
+ register int i;
+
+ i = L & 1;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ L >>= 1;
+ if (i) L |= 128;
+ (L) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (L & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[L]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rrchl(void) /* RRC (HL) */
+{
+ register int i;
+ register BYTE *p;
+
+ p = ram + (H << 8) + L;
+ i = *p & 1;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ *p >>= 1;
+ if (i) *p |= 128;
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(15);
+}
+
+static int op_rlcra(void) /* RLC A */
+{
+ register int i;
+
+ i = A & 128;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ A <<= 1;
+ if (i) A |= 1;
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rlcb(void) /* RLC B */
+{
+ register int i;
+
+ i = B & 128;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ B <<= 1;
+ if (i) B |= 1;
+ (B) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (B & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[B]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rlcc(void) /* RLC C */
+{
+ register int i;
+
+ i = C & 128;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ C <<= 1;
+ if (i) C |= 1;
+ (C) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (C & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[C]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rlcd(void) /* RLC D */
+{
+ register int i;
+
+ i = D & 128;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ D <<= 1;
+ if (i) D |= 1;
+ (D) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (D & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[D]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rlce(void) /* RLC E */
+{
+ register int i;
+
+ i = E & 128;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ E <<= 1;
+ if (i) E |= 1;
+ (E) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (E & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[E]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rlch(void) /* RLC H */
+{
+ register int i;
+
+ i = H & 128;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ H <<= 1;
+ if (i) H |= 1;
+ (H) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (H & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[H]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rlcl(void) /* RLC L */
+{
+ register int i;
+
+ i = L & 128;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ L <<= 1;
+ if (i) L |= 1;
+ (L) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (L & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[L]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_rlchl(void) /* RLC (HL) */
+{
+ register int i;
+ register BYTE *p;
+
+ p = ram + (H << 8) + L;
+ i = *p & 128;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ *p <<= 1;
+ if (i) *p |= 1;
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(15);
+}
+
+static int op_sraa(void) /* SRA A */
+{
+ register int i;
+
+ i = A & 128;
+ (A & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A >>= 1;
+ A |= i;
+ F &= ~(H_FLAG | N_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_srab(void) /* SRA B */
+{
+ register int i;
+
+ i = B & 128;
+ (B & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ B >>= 1;
+ B |= i;
+ F &= ~(H_FLAG | N_FLAG);
+ (B) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (B & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[B]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_srac(void) /* SRA C */
+{
+ register int i;
+
+ i = C & 128;
+ (C & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ C >>= 1;
+ C |= i;
+ F &= ~(H_FLAG | N_FLAG);
+ (C) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (C & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[C]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_srad(void) /* SRA D */
+{
+ register int i;
+
+ i = D & 128;
+ (D & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ D >>= 1;
+ D |= i;
+ F &= ~(H_FLAG | N_FLAG);
+ (D) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (D & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[D]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_srae(void) /* SRA E */
+{
+ register int i;
+
+ i = E & 128;
+ (E & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ E >>= 1;
+ E |= i;
+ F &= ~(H_FLAG | N_FLAG);
+ (E) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (E & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[E]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_srah(void) /* SRA H */
+{
+ register int i;
+
+ i = H & 128;
+ (H & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ H >>= 1;
+ H |= i;
+ F &= ~(H_FLAG | N_FLAG);
+ (H) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (H & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[H]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_sral(void) /* SRA L */
+{
+ register int i;
+
+ i = L & 128;
+ (L & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ L >>= 1;
+ L |= i;
+ F &= ~(H_FLAG | N_FLAG);
+ (L) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (L & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[L]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(8);
+}
+
+static int op_srahl(void) /* SRA (HL) */
+{
+ register int i;
+ register BYTE *p;
+
+ p = ram + (H << 8) + L;
+ i = *p & 128;
+ (*p & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ *p >>= 1;
+ *p |= i;
+ F &= ~(H_FLAG | N_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(15);
+}
+
+static int op_sb0a(void) /* SET 0,A */
+{
+ A |= 1;
+ return(8);
+}
+
+static int op_sb1a(void) /* SET 1,A */
+{
+ A |= 2;
+ return(8);
+}
+
+static int op_sb2a(void) /* SET 2,A */
+{
+ A |= 4;
+ return(8);
+}
+
+static int op_sb3a(void) /* SET 3,A */
+{
+ A |= 8;
+ return(8);
+}
+
+static int op_sb4a(void) /* SET 4,A */
+{
+ A |= 16;
+ return(8);
+}
+
+static int op_sb5a(void) /* SET 5,A */
+{
+ A |= 32;
+ return(8);
+}
+
+static int op_sb6a(void) /* SET 6,A */
+{
+ A |= 64;
+ return(8);
+}
+
+static int op_sb7a(void) /* SET 7,A */
+{
+ A |= 128;
+ return(8);
+}
+
+static int op_sb0b(void) /* SET 0,B */
+{
+ B |= 1;
+ return(8);
+}
+
+static int op_sb1b(void) /* SET 1,B */
+{
+ B |= 2;
+ return(8);
+}
+
+static int op_sb2b(void) /* SET 2,B */
+{
+ B |= 4;
+ return(8);
+}
+
+static int op_sb3b(void) /* SET 3,B */
+{
+ B |= 8;
+ return(8);
+}
+
+static int op_sb4b(void) /* SET 4,B */
+{
+ B |= 16;
+ return(8);
+}
+
+static int op_sb5b(void) /* SET 5,B */
+{
+ B |= 32;
+ return(8);
+}
+
+static int op_sb6b(void) /* SET 6,B */
+{
+ B |= 64;
+ return(8);
+}
+
+static int op_sb7b(void) /* SET 7,B */
+{
+ B |= 128;
+ return(8);
+}
+
+static int op_sb0c(void) /* SET 0,C */
+{
+ C |= 1;
+ return(8);
+}
+
+static int op_sb1c(void) /* SET 1,C */
+{
+ C |= 2;
+ return(8);
+}
+
+static int op_sb2c(void) /* SET 2,C */
+{
+ C |= 4;
+ return(8);
+}
+
+static int op_sb3c(void) /* SET 3,C */
+{
+ C |= 8;
+ return(8);
+}
+
+static int op_sb4c(void) /* SET 4,C */
+{
+ C |= 16;
+ return(8);
+}
+
+static int op_sb5c(void) /* SET 5,C */
+{
+ C |= 32;
+ return(8);
+}
+
+static int op_sb6c(void) /* SET 6,C */
+{
+ C |= 64;
+ return(8);
+}
+
+static int op_sb7c(void) /* SET 7,C */
+{
+ C |= 128;
+ return(8);
+}
+
+static int op_sb0d(void) /* SET 0,D */
+{
+ D |= 1;
+ return(8);
+}
+
+static int op_sb1d(void) /* SET 1,D */
+{
+ D |= 2;
+ return(8);
+}
+
+static int op_sb2d(void) /* SET 2,D */
+{
+ D |= 4;
+ return(8);
+}
+
+static int op_sb3d(void) /* SET 3,D */
+{
+ D |= 8;
+ return(8);
+}
+
+static int op_sb4d(void) /* SET 4,D */
+{
+ D |= 16;
+ return(8);
+}
+
+static int op_sb5d(void) /* SET 5,D */
+{
+ D |= 32;
+ return(8);
+}
+
+static int op_sb6d(void) /* SET 6,D */
+{
+ D |= 64;
+ return(8);
+}
+
+static int op_sb7d(void) /* SET 7,D */
+{
+ D |= 128;
+ return(8);
+}
+
+static int op_sb0e(void) /* SET 0,E */
+{
+ E |= 1;
+ return(8);
+}
+
+static int op_sb1e(void) /* SET 1,E */
+{
+ E |= 2;
+ return(8);
+}
+
+static int op_sb2e(void) /* SET 2,E */
+{
+ E |= 4;
+ return(8);
+}
+
+static int op_sb3e(void) /* SET 3,E */
+{
+ E |= 8;
+ return(8);
+}
+
+static int op_sb4e(void) /* SET 4,E */
+{
+ E |= 16;
+ return(8);
+}
+
+static int op_sb5e(void) /* SET 5,E */
+{
+ E |= 32;
+ return(8);
+}
+
+static int op_sb6e(void) /* SET 6,E */
+{
+ E |= 64;
+ return(8);
+}
+
+static int op_sb7e(void) /* SET 7,E */
+{
+ E |= 128;
+ return(8);
+}
+
+static int op_sb0h(void) /* SET 0,H */
+{
+ H |= 1;
+ return(8);
+}
+
+static int op_sb1h(void) /* SET 1,H */
+{
+ H |= 2;
+ return(8);
+}
+
+static int op_sb2h(void) /* SET 2,H */
+{
+ H |= 4;
+ return(8);
+}
+
+static int op_sb3h(void) /* SET 3,H */
+{
+ H |= 8;
+ return(8);
+}
+
+static int op_sb4h(void) /* SET 4,H */
+{
+ H |= 16;
+ return(8);
+}
+
+static int op_sb5h(void) /* SET 5,H */
+{
+ H |= 32;
+ return(8);
+}
+
+static int op_sb6h(void) /* SET 6,H */
+{
+ H |= 64;
+ return(8);
+}
+
+static int op_sb7h(void) /* SET 7,H */
+{
+ H |= 128;
+ return(8);
+}
+
+static int op_sb0l(void) /* SET 0,L */
+{
+ L |= 1;
+ return(8);
+}
+
+static int op_sb1l(void) /* SET 1,L */
+{
+ L |= 2;
+ return(8);
+}
+
+static int op_sb2l(void) /* SET 2,L */
+{
+ L |= 4;
+ return(8);
+}
+
+static int op_sb3l(void) /* SET 3,L */
+{
+ L |= 8;
+ return(8);
+}
+
+static int op_sb4l(void) /* SET 4,L */
+{
+ L |= 16;
+ return(8);
+}
+
+static int op_sb5l(void) /* SET 5,L */
+{
+ L |= 32;
+ return(8);
+}
+
+static int op_sb6l(void) /* SET 6,L */
+{
+ L |= 64;
+ return(8);
+}
+
+static int op_sb7l(void) /* SET 7,L */
+{
+ L |= 128;
+ return(8);
+}
+
+static int op_sb0hl(void) /* SET 0,(HL) */
+{
+ *(ram + (H << 8) + L) |= 1;
+ return(15);
+}
+
+static int op_sb1hl(void) /* SET 1,(HL) */
+{
+ *(ram + (H << 8) + L) |= 2;
+ return(15);
+}
+
+static int op_sb2hl(void) /* SET 2,(HL) */
+{
+ *(ram + (H << 8) + L) |= 4;
+ return(15);
+}
+
+static int op_sb3hl(void) /* SET 3,(HL) */
+{
+ *(ram + (H << 8) + L) |= 8;
+ return(15);
+}
+
+static int op_sb4hl(void) /* SET 4,(HL) */
+{
+ *(ram + (H << 8) + L) |= 16;
+ return(15);
+}
+
+static int op_sb5hl(void) /* SET 5,(HL) */
+{
+ *(ram + (H << 8) + L) |= 32;
+ return(15);
+}
+
+static int op_sb6hl(void) /* SET 6,(HL) */
+{
+ *(ram + (H << 8) + L) |= 64;
+ return(15);
+}
+
+static int op_sb7hl(void) /* SET 7,(HL) */
+{
+ *(ram + (H << 8) + L) |= 128;
+ return(15);
+}
+
+static int op_rb0a(void) /* RES 0,A */
+{
+ A &= ~1;
+ return(8);
+}
+
+static int op_rb1a(void) /* RES 1,A */
+{
+ A &= ~2;
+ return(8);
+}
+
+static int op_rb2a(void) /* RES 2,A */
+{
+ A &= ~4;
+ return(8);
+}
+
+static int op_rb3a(void) /* RES 3,A */
+{
+ A &= ~8;
+ return(8);
+}
+
+static int op_rb4a(void) /* RES 4,A */
+{
+ A &= ~16;
+ return(8);
+}
+
+static int op_rb5a(void) /* RES 5,A */
+{
+ A &= ~32;
+ return(8);
+}
+
+static int op_rb6a(void) /* RES 6,A */
+{
+ A &= ~64;
+ return(8);
+}
+
+static int op_rb7a(void) /* RES 7,A */
+{
+ A &= ~128;
+ return(8);
+}
+
+static int op_rb0b(void) /* RES 0,B */
+{
+ B &= ~1;
+ return(8);
+}
+
+static int op_rb1b(void) /* RES 1,B */
+{
+ B &= ~2;
+ return(8);
+}
+
+static int op_rb2b(void) /* RES 2,B */
+{
+ B &= ~4;
+ return(8);
+}
+
+static int op_rb3b(void) /* RES 3,B */
+{
+ B &= ~8;
+ return(8);
+}
+
+static int op_rb4b(void) /* RES 4,B */
+{
+ B &= ~16;
+ return(8);
+}
+
+static int op_rb5b(void) /* RES 5,B */
+{
+ B &= ~32;
+ return(8);
+}
+
+static int op_rb6b(void) /* RES 6,B */
+{
+ B &= ~64;
+ return(8);
+}
+
+static int op_rb7b(void) /* RES 7,B */
+{
+ B &= ~128;
+ return(8);
+}
+
+static int op_rb0c(void) /* RES 0,C */
+{
+ C &= ~1;
+ return(8);
+}
+
+static int op_rb1c(void) /* RES 1,C */
+{
+ C &= ~2;
+ return(8);
+}
+
+static int op_rb2c(void) /* RES 2,C */
+{
+ C &= ~4;
+ return(8);
+}
+
+static int op_rb3c(void) /* RES 3,C */
+{
+ C &= ~8;
+ return(8);
+}
+
+static int op_rb4c(void) /* RES 4,C */
+{
+ C &= ~16;
+ return(8);
+}
+
+static int op_rb5c(void) /* RES 5,C */
+{
+ C &= ~32;
+ return(8);
+}
+
+static int op_rb6c(void) /* RES 6,C */
+{
+ C &= ~64;
+ return(8);
+}
+
+static int op_rb7c(void) /* RES 7,C */
+{
+ C &= ~128;
+ return(8);
+}
+
+static int op_rb0d(void) /* RES 0,D */
+{
+ D &= ~1;
+ return(8);
+}
+
+static int op_rb1d(void) /* RES 1,D */
+{
+ D &= ~2;
+ return(8);
+}
+
+static int op_rb2d(void) /* RES 2,D */
+{
+ D &= ~4;
+ return(8);
+}
+
+static int op_rb3d(void) /* RES 3,D */
+{
+ D &= ~8;
+ return(8);
+}
+
+static int op_rb4d(void) /* RES 4,D */
+{
+ D &= ~16;
+ return(8);
+}
+
+static int op_rb5d(void) /* RES 5,D */
+{
+ D &= ~32;
+ return(8);
+}
+
+static int op_rb6d(void) /* RES 6,D */
+{
+ D &= ~64;
+ return(8);
+}
+
+static int op_rb7d(void) /* RES 7,D */
+{
+ D &= ~128;
+ return(8);
+}
+
+static int op_rb0e(void) /* RES 0,E */
+{
+ E &= ~1;
+ return(8);
+}
+
+static int op_rb1e(void) /* RES 1,E */
+{
+ E &= ~2;
+ return(8);
+}
+
+static int op_rb2e(void) /* RES 2,E */
+{
+ E &= ~4;
+ return(8);
+}
+
+static int op_rb3e(void) /* RES 3,E */
+{
+ E &= ~8;
+ return(8);
+}
+
+static int op_rb4e(void) /* RES 4,E */
+{
+ E &= ~16;
+ return(8);
+}
+
+static int op_rb5e(void) /* RES 5,E */
+{
+ E &= ~32;
+ return(8);
+}
+
+static int op_rb6e(void) /* RES 6,E */
+{
+ E &= ~64;
+ return(8);
+}
+
+static int op_rb7e(void) /* RES 7,E */
+{
+ E &= ~128;
+ return(8);
+}
+
+static int op_rb0h(void) /* RES 0,H */
+{
+ H &= ~1;
+ return(8);
+}
+
+static int op_rb1h(void) /* RES 1,H */
+{
+ H &= ~2;
+ return(8);
+}
+
+static int op_rb2h(void) /* RES 2,H */
+{
+ H &= ~4;
+ return(8);
+}
+
+static int op_rb3h(void) /* RES 3,H */
+{
+ H &= ~8;
+ return(8);
+}
+
+static int op_rb4h(void) /* RES 4,H */
+{
+ H &= ~16;
+ return(8);
+}
+
+static int op_rb5h(void) /* RES 5,H */
+{
+ H &= ~32;
+ return(8);
+}
+
+static int op_rb6h(void) /* RES 6,H */
+{
+ H &= ~64;
+ return(8);
+}
+
+static int op_rb7h(void) /* RES 7,H */
+{
+ H &= ~128;
+ return(8);
+}
+
+static int op_rb0l(void) /* RES 0,L */
+{
+ L &= ~1;
+ return(8);
+}
+
+static int op_rb1l(void) /* RES 1,L */
+{
+ L &= ~2;
+ return(8);
+}
+
+static int op_rb2l(void) /* RES 2,L */
+{
+ L &= ~4;
+ return(8);
+}
+
+static int op_rb3l(void) /* RES 3,L */
+{
+ L &= ~8;
+ return(8);
+}
+
+static int op_rb4l(void) /* RES 4,L */
+{
+ L &= ~16;
+ return(8);
+}
+
+static int op_rb5l(void) /* RES 5,L */
+{
+ L &= ~32;
+ return(8);
+}
+
+static int op_rb6l(void) /* RES 6,L */
+{
+ L &= ~64;
+ return(8);
+}
+
+static int op_rb7l(void) /* RES 7,L */
+{
+ L &= ~128;
+ return(8);
+}
+
+static int op_rb0hl(void) /* RES 0,(HL) */
+{
+ *(ram + (H << 8) + L) &= ~1;
+ return(15);
+}
+
+static int op_rb1hl(void) /* RES 1,(HL) */
+{
+ *(ram + (H << 8) + L) &= ~2;
+ return(15);
+}
+
+static int op_rb2hl(void) /* RES 2,(HL) */
+{
+ *(ram + (H << 8) + L) &= ~4;
+ return(15);
+}
+
+static int op_rb3hl(void) /* RES 3,(HL) */
+{
+ *(ram + (H << 8) + L) &= ~8;
+ return(15);
+}
+
+static int op_rb4hl(void) /* RES 4,(HL) */
+{
+ *(ram + (H << 8) + L) &= ~16;
+ return(15);
+}
+
+static int op_rb5hl(void) /* RES 5,(HL) */
+{
+ *(ram + (H << 8) + L) &= ~32;
+ return(15);
+}
+
+static int op_rb6hl(void) /* RES 6,(HL) */
+{
+ *(ram + (H << 8) + L) &= ~64;
+ return(15);
+}
+
+static int op_rb7hl(void) /* RES 7,(HL) */
+{
+ *(ram + (H << 8) + L) &= ~128;
+ return(15);
+}
+
+static int op_tb0a(void) /* BIT 0,A */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (A & 1) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb1a(void) /* BIT 1,A */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (A & 2) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb2a(void) /* BIT 2,A */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (A & 4) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb3a(void) /* BIT 3,A */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (A & 8) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb4a(void) /* BIT 4,A */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (A & 16) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb5a(void) /* BIT 5,A */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (A & 32) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb6a(void) /* BIT 6,A */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (A & 64) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb7a(void) /* BIT 7,A */
+{
+ F &= ~N_FLAG;
+ F |= H_FLAG;
+ if (A & 128) {
+ F &= ~(Z_FLAG | P_FLAG);
+ F |= S_FLAG;
+ } else {
+ F |= (Z_FLAG | P_FLAG);
+ F &= ~S_FLAG;
+ }
+ return(8);
+}
+
+static int op_tb0b(void) /* BIT 0,B */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (B & 1) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb1b(void) /* BIT 1,B */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (B & 2) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb2b(void) /* BIT 2,B */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (B & 4) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb3b(void) /* BIT 3,B */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (B & 8) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb4b(void) /* BIT 4,B */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (B & 16) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb5b(void) /* BIT 5,B */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (B & 32) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb6b(void) /* BIT 6,B */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (B & 64) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb7b(void) /* BIT 7,B */
+{
+ F &= ~N_FLAG;
+ F |= H_FLAG;
+ if (B & 128) {
+ F &= ~(Z_FLAG | P_FLAG);
+ F |= S_FLAG;
+ } else {
+ F |= (Z_FLAG | P_FLAG);
+ F &= ~S_FLAG;
+ }
+ return(8);
+}
+
+static int op_tb0c(void) /* BIT 0,C */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (C & 1) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb1c(void) /* BIT 1,C */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (C & 2) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb2c(void) /* BIT 2,C */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (C & 4) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb3c(void) /* BIT 3,C */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (C & 8) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb4c(void) /* BIT 4,C */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (C & 16) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb5c(void) /* BIT 5,C */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (C & 32) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb6c(void) /* BIT 6,C */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (C & 64) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb7c(void) /* BIT 7,C */
+{
+ F &= ~N_FLAG;
+ F |= H_FLAG;
+ if (C & 128) {
+ F &= ~(Z_FLAG | P_FLAG);
+ F |= S_FLAG;
+ } else {
+ F |= (Z_FLAG | P_FLAG);
+ F &= ~S_FLAG;
+ }
+ return(8);
+}
+
+static int op_tb0d(void) /* BIT 0,D */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (D & 1) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb1d(void) /* BIT 1,D */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (D & 2) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb2d(void) /* BIT 2,D */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (D & 4) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb3d(void) /* BIT 3,D */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (D & 8) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb4d(void) /* BIT 4,D */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (D & 16) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb5d(void) /* BIT 5,D */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (D & 32) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb6d(void) /* BIT 6,D */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (D & 64) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb7d(void) /* BIT 7,D */
+{
+ F &= ~N_FLAG;
+ F |= H_FLAG;
+ if (D & 128) {
+ F &= ~(Z_FLAG | P_FLAG);
+ F |= S_FLAG;
+ } else {
+ F |= (Z_FLAG | P_FLAG);
+ F &= ~S_FLAG;
+ }
+ return(8);
+}
+
+static int op_tb0e(void) /* BIT 0,E */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (E & 1) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb1e(void) /* BIT 1,E */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (E & 2) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb2e(void) /* BIT 2,E */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (E & 4) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb3e(void) /* BIT 3,E */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (E & 8) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb4e(void) /* BIT 4,E */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (E & 16) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb5e(void) /* BIT 5,E */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (E & 32) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb6e(void) /* BIT 6,E */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (E & 64) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb7e(void) /* BIT 7,E */
+{
+ F &= ~N_FLAG;
+ F |= H_FLAG;
+ if (E & 128) {
+ F &= ~(Z_FLAG | P_FLAG);
+ F |= S_FLAG;
+ } else {
+ F |= (Z_FLAG | P_FLAG);
+ F &= ~S_FLAG;
+ }
+ return(8);
+}
+
+static int op_tb0h(void) /* BIT 0,H */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (H & 1) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb1h(void) /* BIT 1,H */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (H & 2) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb2h(void) /* BIT 2,H */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (H & 4) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb3h(void) /* BIT 3,H */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (H & 8) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb4h(void) /* BIT 4,H */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (H & 16) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb5h(void) /* BIT 5,H */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (H & 32) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb6h(void) /* BIT 6,H */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (H & 64) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb7h(void) /* BIT 7,H */
+{
+ F &= ~N_FLAG;
+ F |= H_FLAG;
+ if (H & 128) {
+ F &= ~(Z_FLAG | P_FLAG);
+ F |= S_FLAG;
+ } else {
+ F |= (Z_FLAG | P_FLAG);
+ F &= ~S_FLAG;
+ }
+ return(8);
+}
+
+static int op_tb0l(void) /* BIT 0,L */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (L & 1) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb1l(void) /* BIT 1,L */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (L & 2) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb2l(void) /* BIT 2,L */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (L & 4) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb3l(void) /* BIT 3,L */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (L & 8) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb4l(void) /* BIT 4,L */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (L & 16) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb5l(void) /* BIT 5,L */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (L & 32) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb6l(void) /* BIT 6,L */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (L & 64) ? (F &= ~(Z_FLAG | P_FLAG)) : (F |= (Z_FLAG | P_FLAG));
+ return(8);
+}
+
+static int op_tb7l(void) /* BIT 7,L */
+{
+ F &= ~N_FLAG;
+ F |= H_FLAG;
+ if (L & 128) {
+ F &= ~(Z_FLAG | P_FLAG);
+ F |= S_FLAG;
+ } else {
+ F |= (Z_FLAG | P_FLAG);
+ F &= ~S_FLAG;
+ }
+ return(8);
+}
+
+static int op_tb0hl(void) /* BIT 0,(HL) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + (H << 8) + L) & 1) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(12);
+}
+
+static int op_tb1hl(void) /* BIT 1,(HL) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + (H << 8) + L) & 2) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(12);
+}
+
+static int op_tb2hl(void) /* BIT 2,(HL) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + (H << 8) + L) & 4) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(12);
+}
+
+static int op_tb3hl(void) /* BIT 3,(HL) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + (H << 8) + L) & 8) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(12);
+}
+
+static int op_tb4hl(void) /* BIT 4,(HL) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + (H << 8) + L) & 16) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(12);
+}
+
+static int op_tb5hl(void) /* BIT 5,(HL) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + (H << 8) + L) & 32) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(12);
+}
+
+static int op_tb6hl(void) /* BIT 6,(HL) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + (H << 8) + L) & 64) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(12);
+}
+
+static int op_tb7hl(void) /* BIT 7,(HL) */
+{
+ F &= ~N_FLAG;
+ F |= H_FLAG;
+ if (*(ram + (H << 8) + L) & 128) {
+ F &= ~(Z_FLAG | P_FLAG);
+ F |= S_FLAG;
+ } else {
+ F |= (Z_FLAG | P_FLAG);
+ F &= ~S_FLAG;
+ }
+ return(12);
+}
diff --git a/emu/z80pack-1.9/z80sim/sim2.o b/emu/z80pack-1.9/z80sim/sim2.o
new file mode 100644
index 0000000..3183a5e
Binary files /dev/null and b/emu/z80pack-1.9/z80sim/sim2.o differ
diff --git a/emu/z80pack-1.9/z80sim/sim3.c b/emu/z80pack-1.9/z80sim/sim3.c
new file mode 100644
index 0000000..e7940f9
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/sim3.c
@@ -0,0 +1,727 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-JAN-89 Release 1.1
+ * 08-FEB-89 Release 1.2
+ * 13-MAR-89 Release 1.3
+ * 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
+ * 20-DEC-90 Release 1.5 Ported to COHERENT 3.0
+ * 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
+ * and some optimization
+ * 25-JUN-92 Release 1.7 comments in english
+ * 07-OCT-06 Release 1.8 modified to compile on modern POSIX OS's
+ */
+
+/*
+ * Like the function "cpu()" this one emulates multi byte opcodes
+ * starting with 0xdd
+ */
+
+#include "sim.h"
+#include "simglb.h"
+
+static int trap_dd(void);
+static int op_popix(void), op_pusix(void);
+static int op_jpix(void);
+static int op_exspx(void);
+static int op_ldspx(void);
+static int op_ldixnn(void), op_ldixinn(void), op_ldinx(void);
+static int op_adaxd(void), op_acaxd(void), op_suaxd(void), op_scaxd(void);
+static int op_andxd(void), op_xorxd(void), op_orxd(void), op_cpxd(void);
+static int op_decxd(void), op_incxd(void);
+static int op_addxb(void), op_addxd(void), op_addxs(void), op_addxx();
+static int op_incix(void), op_decix(void);
+static int op_ldaxd(void), op_ldbxd(void), op_ldcxd(void);
+static int op_lddxd(), op_ldexd(void);
+static int op_ldhxd(void), op_ldlxd(void);
+static int op_ldxda(void), op_ldxdb(void), op_ldxdc(void);
+static int op_ldxdd(), op_ldxde(void);
+static int op_ldxdh(void), op_ldxdl(void), op_ldxdn(void);
+extern int op_ddcb_handel(void);
+
+long op_dd_handel(void)
+{
+ register int t;
+
+ static int (*op_dd[256]) (void) = {
+ trap_dd, /* 0x00 */
+ trap_dd, /* 0x01 */
+ trap_dd, /* 0x02 */
+ trap_dd, /* 0x03 */
+ trap_dd, /* 0x04 */
+ trap_dd, /* 0x05 */
+ trap_dd, /* 0x06 */
+ trap_dd, /* 0x07 */
+ trap_dd, /* 0x08 */
+ op_addxb, /* 0x09 */
+ trap_dd, /* 0x0a */
+ trap_dd, /* 0x0b */
+ trap_dd, /* 0x0c */
+ trap_dd, /* 0x0d */
+ trap_dd, /* 0x0e */
+ trap_dd, /* 0x0f */
+ trap_dd, /* 0x10 */
+ trap_dd, /* 0x11 */
+ trap_dd, /* 0x12 */
+ trap_dd, /* 0x13 */
+ trap_dd, /* 0x14 */
+ trap_dd, /* 0x15 */
+ trap_dd, /* 0x16 */
+ trap_dd, /* 0x17 */
+ trap_dd, /* 0x18 */
+ op_addxd, /* 0x19 */
+ trap_dd, /* 0x1a */
+ trap_dd, /* 0x1b */
+ trap_dd, /* 0x1c */
+ trap_dd, /* 0x1d */
+ trap_dd, /* 0x1e */
+ trap_dd, /* 0x1f */
+ trap_dd, /* 0x20 */
+ op_ldixnn, /* 0x21 */
+ op_ldinx, /* 0x22 */
+ op_incix, /* 0x23 */
+ trap_dd, /* 0x24 */
+ trap_dd, /* 0x25 */
+ trap_dd, /* 0x26 */
+ trap_dd, /* 0x27 */
+ trap_dd, /* 0x28 */
+ op_addxx, /* 0x29 */
+ op_ldixinn, /* 0x2a */
+ op_decix, /* 0x2b */
+ trap_dd, /* 0x2c */
+ trap_dd, /* 0x2d */
+ trap_dd, /* 0x2e */
+ trap_dd, /* 0x2f */
+ trap_dd, /* 0x30 */
+ trap_dd, /* 0x31 */
+ trap_dd, /* 0x32 */
+ trap_dd, /* 0x33 */
+ op_incxd, /* 0x34 */
+ op_decxd, /* 0x35 */
+ op_ldxdn, /* 0x36 */
+ trap_dd, /* 0x37 */
+ trap_dd, /* 0x38 */
+ op_addxs, /* 0x39 */
+ trap_dd, /* 0x3a */
+ trap_dd, /* 0x3b */
+ trap_dd, /* 0x3c */
+ trap_dd, /* 0x3d */
+ trap_dd, /* 0x3e */
+ trap_dd, /* 0x3f */
+ trap_dd, /* 0x40 */
+ trap_dd, /* 0x41 */
+ trap_dd, /* 0x42 */
+ trap_dd, /* 0x43 */
+ trap_dd, /* 0x44 */
+ trap_dd, /* 0x45 */
+ op_ldbxd, /* 0x46 */
+ trap_dd, /* 0x47 */
+ trap_dd, /* 0x48 */
+ trap_dd, /* 0x49 */
+ trap_dd, /* 0x4a */
+ trap_dd, /* 0x4b */
+ trap_dd, /* 0x4c */
+ trap_dd, /* 0x4d */
+ op_ldcxd, /* 0x4e */
+ trap_dd, /* 0x4f */
+ trap_dd, /* 0x50 */
+ trap_dd, /* 0x51 */
+ trap_dd, /* 0x52 */
+ trap_dd, /* 0x53 */
+ trap_dd, /* 0x54 */
+ trap_dd, /* 0x55 */
+ op_lddxd, /* 0x56 */
+ trap_dd, /* 0x57 */
+ trap_dd, /* 0x58 */
+ trap_dd, /* 0x59 */
+ trap_dd, /* 0x5a */
+ trap_dd, /* 0x5b */
+ trap_dd, /* 0x5c */
+ trap_dd, /* 0x5d */
+ op_ldexd, /* 0x5e */
+ trap_dd, /* 0x5f */
+ trap_dd, /* 0x60 */
+ trap_dd, /* 0x61 */
+ trap_dd, /* 0x62 */
+ trap_dd, /* 0x63 */
+ trap_dd, /* 0x64 */
+ trap_dd, /* 0x65 */
+ op_ldhxd, /* 0x66 */
+ trap_dd, /* 0x67 */
+ trap_dd, /* 0x68 */
+ trap_dd, /* 0x69 */
+ trap_dd, /* 0x6a */
+ trap_dd, /* 0x6b */
+ trap_dd, /* 0x6c */
+ trap_dd, /* 0x6d */
+ op_ldlxd, /* 0x6e */
+ trap_dd, /* 0x6f */
+ op_ldxdb, /* 0x70 */
+ op_ldxdc, /* 0x71 */
+ op_ldxdd, /* 0x72 */
+ op_ldxde, /* 0x73 */
+ op_ldxdh, /* 0x74 */
+ op_ldxdl, /* 0x75 */
+ trap_dd, /* 0x76 */
+ op_ldxda, /* 0x77 */
+ trap_dd, /* 0x78 */
+ trap_dd, /* 0x79 */
+ trap_dd, /* 0x7a */
+ trap_dd, /* 0x7b */
+ trap_dd, /* 0x7c */
+ trap_dd, /* 0x7d */
+ op_ldaxd, /* 0x7e */
+ trap_dd, /* 0x7f */
+ trap_dd, /* 0x80 */
+ trap_dd, /* 0x81 */
+ trap_dd, /* 0x82 */
+ trap_dd, /* 0x83 */
+ trap_dd, /* 0x84 */
+ trap_dd, /* 0x85 */
+ op_adaxd, /* 0x86 */
+ trap_dd, /* 0x87 */
+ trap_dd, /* 0x88 */
+ trap_dd, /* 0x89 */
+ trap_dd, /* 0x8a */
+ trap_dd, /* 0x8b */
+ trap_dd, /* 0x8c */
+ trap_dd, /* 0x8d */
+ op_acaxd, /* 0x8e */
+ trap_dd, /* 0x8f */
+ trap_dd, /* 0x90 */
+ trap_dd, /* 0x91 */
+ trap_dd, /* 0x92 */
+ trap_dd, /* 0x93 */
+ trap_dd, /* 0x94 */
+ trap_dd, /* 0x95 */
+ op_suaxd, /* 0x96 */
+ trap_dd, /* 0x97 */
+ trap_dd, /* 0x98 */
+ trap_dd, /* 0x99 */
+ trap_dd, /* 0x9a */
+ trap_dd, /* 0x9b */
+ trap_dd, /* 0x9c */
+ trap_dd, /* 0x9d */
+ op_scaxd, /* 0x9e */
+ trap_dd, /* 0x9f */
+ trap_dd, /* 0xa0 */
+ trap_dd, /* 0xa1 */
+ trap_dd, /* 0xa2 */
+ trap_dd, /* 0xa3 */
+ trap_dd, /* 0xa4 */
+ trap_dd, /* 0xa5 */
+ op_andxd, /* 0xa6 */
+ trap_dd, /* 0xa7 */
+ trap_dd, /* 0xa8 */
+ trap_dd, /* 0xa9 */
+ trap_dd, /* 0xaa */
+ trap_dd, /* 0xab */
+ trap_dd, /* 0xac */
+ trap_dd, /* 0xad */
+ op_xorxd, /* 0xae */
+ trap_dd, /* 0xaf */
+ trap_dd, /* 0xb0 */
+ trap_dd, /* 0xb1 */
+ trap_dd, /* 0xb2 */
+ trap_dd, /* 0xb3 */
+ trap_dd, /* 0xb4 */
+ trap_dd, /* 0xb5 */
+ op_orxd, /* 0xb6 */
+ trap_dd, /* 0xb7 */
+ trap_dd, /* 0xb8 */
+ trap_dd, /* 0xb9 */
+ trap_dd, /* 0xba */
+ trap_dd, /* 0xbb */
+ trap_dd, /* 0xbc */
+ trap_dd, /* 0xbd */
+ op_cpxd, /* 0xbe */
+ trap_dd, /* 0xbf */
+ trap_dd, /* 0xc0 */
+ trap_dd, /* 0xc1 */
+ trap_dd, /* 0xc2 */
+ trap_dd, /* 0xc3 */
+ trap_dd, /* 0xc4 */
+ trap_dd, /* 0xc5 */
+ trap_dd, /* 0xc6 */
+ trap_dd, /* 0xc7 */
+ trap_dd, /* 0xc8 */
+ trap_dd, /* 0xc9 */
+ trap_dd, /* 0xca */
+ op_ddcb_handel, /* 0xcb */
+ trap_dd, /* 0xcc */
+ trap_dd, /* 0xcd */
+ trap_dd, /* 0xce */
+ trap_dd, /* 0xcf */
+ trap_dd, /* 0xd0 */
+ trap_dd, /* 0xd1 */
+ trap_dd, /* 0xd2 */
+ trap_dd, /* 0xd3 */
+ trap_dd, /* 0xd4 */
+ trap_dd, /* 0xd5 */
+ trap_dd, /* 0xd6 */
+ trap_dd, /* 0xd7 */
+ trap_dd, /* 0xd8 */
+ trap_dd, /* 0xd9 */
+ trap_dd, /* 0xda */
+ trap_dd, /* 0xdb */
+ trap_dd, /* 0xdc */
+ trap_dd, /* 0xdd */
+ trap_dd, /* 0xde */
+ trap_dd, /* 0xdf */
+ trap_dd, /* 0xe0 */
+ op_popix, /* 0xe1 */
+ trap_dd, /* 0xe2 */
+ op_exspx, /* 0xe3 */
+ trap_dd, /* 0xe4 */
+ op_pusix, /* 0xe5 */
+ trap_dd, /* 0xe6 */
+ trap_dd, /* 0xe7 */
+ trap_dd, /* 0xe8 */
+ op_jpix, /* 0xe9 */
+ trap_dd, /* 0xea */
+ trap_dd, /* 0xeb */
+ trap_dd, /* 0xec */
+ trap_dd, /* 0xed */
+ trap_dd, /* 0xee */
+ trap_dd, /* 0xef */
+ trap_dd, /* 0xf0 */
+ trap_dd, /* 0xf1 */
+ trap_dd, /* 0xf2 */
+ trap_dd, /* 0xf3 */
+ trap_dd, /* 0xf4 */
+ trap_dd, /* 0xf5 */
+ trap_dd, /* 0xf6 */
+ trap_dd, /* 0xf7 */
+ trap_dd, /* 0xf8 */
+ op_ldspx, /* 0xf9 */
+ trap_dd, /* 0xfa */
+ trap_dd, /* 0xfb */
+ trap_dd, /* 0xfc */
+ trap_dd, /* 0xfd */
+ trap_dd, /* 0xfe */
+ trap_dd /* 0xff */
+ };
+
+
+#ifdef WANT_TIM
+ t = (*op_dd[*PC++]) (); /* execute next opcode */
+#else
+ (*op_dd[*PC++]) ();
+#endif
+
+#ifdef WANT_PCC
+ if (PC > ram + 65535) /* correct PC overrun */
+ PC = ram;
+#endif
+
+ return(t);
+}
+
+/*
+ * This function traps all illegal opcodes following the
+ * initial 0xdd of a multi byte opcode.
+ */
+static int trap_dd(void)
+{
+ cpu_error = OPTRAP2;
+ cpu_state = STOPPED;
+ return(0);
+}
+
+static int op_popix(void) /* POP IX */
+{
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ IX = *STACK++;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ IX += *STACK++ << 8;
+ return(14);
+}
+
+static int op_pusix(void) /* PUSH IX */
+{
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = IX >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = IX;
+ return(15);
+}
+
+static int op_jpix(void) /* JP (IX) */
+{
+ PC = ram + IX;
+ return(8);
+}
+
+static int op_exspx(void) /* EX (SP),IX */
+{
+ register int i;
+
+ i = *STACK + (*(STACK + 1) << 8);
+ *STACK = IX;
+ *(STACK + 1) = IX >> 8;
+ IX = i;
+ return(23);
+}
+
+static int op_ldspx(void) /* LD SP,IX */
+{
+ STACK = ram + IX;
+ return(10);
+}
+
+static int op_ldixnn(void) /* LD IX,nn */
+{
+ IX = *PC++;
+ IX += *PC++ << 8;
+ return(14);
+}
+
+static int op_ldixinn(void) /* LD IX,(nn) */
+{
+ register BYTE *p;
+
+ p = ram + *PC++;
+ p += *PC++ << 8;
+ IX = *p++;
+ IX += *p << 8;
+ return(20);
+}
+
+static int op_ldinx(void) /* LD (nn),IX */
+{
+ register BYTE *p;
+
+ p = ram + *PC++;
+ p += *PC++ << 8;
+ *p++ = IX;
+ *p = IX >> 8;
+ return(20);
+}
+
+static int op_adaxd(void) /* ADD A,(IX+d) */
+{
+ register int i;
+ register BYTE P;
+
+ P = *(ram + IX + (char) *PC++);
+ ((A & 0xf) + (P & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + P > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) P;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(19);
+}
+
+static int op_acaxd(void) /* ADC A,(IX+d) */
+{
+ register int i, carry;
+ register BYTE P;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ P = *(ram + IX + (char) *PC++);
+ ((A & 0xf) + (P & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + P + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) P + carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(19);
+}
+
+static int op_suaxd(void) /* SUB A,(IX+d) */
+{
+ register int i;
+ register BYTE P;
+
+ P = *(ram + IX + (char) *PC++);
+ ((P & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (P > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) P;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(19);
+}
+
+static int op_scaxd(void) /* SBC A,(IX+d) */
+{
+ register int i, carry;
+ register BYTE P;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ P = *(ram + IX + (char) *PC++);
+ ((P & 0xf) + carry > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (P + carry > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) P - carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(19);
+}
+
+static int op_andxd(void) /* AND (IX+d) */
+{
+ A &= *(ram + IX + (char) *PC++);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= H_FLAG;
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(N_FLAG | C_FLAG);
+ return(19);
+}
+
+static int op_xorxd(void) /* XOR (IX+d) */
+{
+ A ^= *(ram + IX + (char) *PC++);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(19);
+}
+
+static int op_orxd(void) /* OR (IX+d) */
+{
+ A |= *(ram + IX + (char) *PC++);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(19);
+}
+
+static int op_cpxd(void) /* CP (IX+d) */
+{
+ register int i;
+ register BYTE P;
+
+ P = *(ram + IX + (char) *PC++);
+ ((P & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (P > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ i = (char) A - (char) P;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(19);
+}
+
+static int op_incxd(void) /* INC (IX+d) */
+{
+ register BYTE *p;
+
+ p = ram + IX + (char) *PC++;
+ ((*p & 0xf) + 1 > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (*p)++;
+ (*p == 128) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(23);
+}
+
+static int op_decxd(void) /* DEC (IX+d) */
+{
+ register BYTE *p;
+
+ p = ram + IX + (char) *PC++;
+ (((*p - 1) & 0xf) == 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (*p)--;
+ (*p == 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(23);
+}
+
+static int op_addxb(void) /* ADD IX,BC */
+{
+ register int carry;
+ BYTE ixl = IX & 0xff;
+ BYTE ixh = IX >> 8;
+
+ carry = (ixl + C > 255) ? 1 : 0;
+ ixl += C;
+ ((ixh & 0xf) + (B & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (ixh + B + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ ixh += B + carry;
+ IX = (ixh << 8) + ixl;
+ F &= ~N_FLAG;
+ return(15);
+}
+
+static int op_addxd(void) /* ADD IX,DE */
+{
+ register int carry;
+ BYTE ixl = IX & 0xff;
+ BYTE ixh = IX >> 8;
+
+ carry = (ixl + E > 255) ? 1 : 0;
+ ixl += E;
+ ((ixh & 0xf) + (D & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (ixh + D + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ ixh += D + carry;
+ IX = (ixh << 8) + ixl;
+ F &= ~N_FLAG;
+ return(15);
+}
+
+static int op_addxs(void) /* ADD IX,SP */
+{
+ register int carry;
+ BYTE ixl = IX & 0xff;
+ BYTE ixh = IX >> 8;
+ BYTE spl = (STACK - ram) & 0xff;
+ BYTE sph = (STACK - ram) >> 8;
+
+ carry = (ixl + spl > 255) ? 1 : 0;
+ ixl += spl;
+ ((ixh & 0xf) + (sph & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (ixh + sph + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ ixh += sph + carry;
+ IX = (ixh << 8) + ixl;
+ F &= ~N_FLAG;
+ return(15);
+}
+
+static int op_addxx(void) /* ADD IX,IX */
+{
+ register int carry;
+ BYTE ixl = IX & 0xff;
+ BYTE ixh = IX >> 8;
+
+ carry = (ixl << 1 > 255) ? 1 : 0;
+ ixl <<= 1;
+ ((ixh & 0xf) + (ixh & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (ixh + ixh + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ ixh += ixh + carry;
+ IX = (ixh << 8) + ixl;
+ F &= ~N_FLAG;
+ return(15);
+}
+
+static int op_incix(void) /* INC IX */
+{
+ IX++;
+ return(10);
+}
+
+static int op_decix(void) /* DEC IX */
+{
+ IX--;
+ return(10);
+}
+
+static int op_ldaxd(void) /* LD A,(IX+d) */
+{
+ A = *(IX + (char) *PC++ + ram);
+ return(19);
+}
+
+static int op_ldbxd(void) /* LD B,(IX+d) */
+{
+ B = *(IX + (char) *PC++ + ram);
+ return(19);
+}
+
+static int op_ldcxd(void) /* LD C,(IX+d) */
+{
+ C = *(IX + (char) *PC++ + ram);
+ return(19);
+}
+
+static int op_lddxd(void) /* LD D,(IX+d) */
+{
+ D = *(IX + (char) *PC++ + ram);
+ return(19);
+}
+
+static int op_ldexd(void) /* LD E,(IX+d) */
+{
+ E = *(IX + (char) *PC++ + ram);
+ return(19);
+}
+
+static int op_ldhxd(void) /* LD H,(IX+d) */
+{
+ H = *(IX + (char) *PC++ + ram);
+ return(19);
+}
+
+static int op_ldlxd(void) /* LD L,(IX+d) */
+{
+ L = *(IX + (char) *PC++ + ram);
+ return(19);
+}
+
+static int op_ldxda(void) /* LD (IX+d),A */
+{
+ *(IX + (char) *PC++ + ram) = A;
+ return(19);
+}
+
+static int op_ldxdb(void) /* LD (IX+d),B */
+{
+ *(IX + (char) *PC++ + ram) = B;
+ return(19);
+}
+
+static int op_ldxdc(void) /* LD (IX+d),C */
+{
+ *(IX + (char) *PC++ + ram) = C;
+ return(19);
+}
+
+static int op_ldxdd(void) /* LD (IX+d),D */
+{
+ *(IX + (char) *PC++ + ram) = D;
+ return(19);
+}
+
+static int op_ldxde(void) /* LD (IX+d),E */
+{
+ *(IX + (char) *PC++ + ram) = E;
+ return(19);
+}
+
+static int op_ldxdh(void) /* LD (IX+d),H */
+{
+ *(IX + (char) *PC++ + ram) = H;
+ return(19);
+}
+
+static int op_ldxdl(void) /* LD (IX+d),L */
+{
+ *(IX + (char) *PC++ + ram) = L;
+ return(19);
+}
+
+static int op_ldxdn(void) /* LD (IX+d),n */
+{
+ register int d;
+
+ d = (char) *PC++;
+ *(IX + d + ram) = *PC++;
+ return(19);
+}
diff --git a/emu/z80pack-1.9/z80sim/sim3.o b/emu/z80pack-1.9/z80sim/sim3.o
new file mode 100644
index 0000000..a481850
Binary files /dev/null and b/emu/z80pack-1.9/z80sim/sim3.o differ
diff --git a/emu/z80pack-1.9/z80sim/sim4.c b/emu/z80pack-1.9/z80sim/sim4.c
new file mode 100644
index 0000000..1785c71
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/sim4.c
@@ -0,0 +1,1151 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-JAN-89 Release 1.1
+ * 08-FEB-89 Release 1.2
+ * 13-MAR-89 Release 1.3
+ * 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
+ * 20-DEC-90 Release 1.5 Ported to COHERENT 3.0
+ * 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
+ * and some optimization
+ * 25-JUN-92 Release 1.7 comments in english
+ * 07-OCT-06 Release 1.8 modified to compile on modern POSIX OS's
+ */
+
+/*
+ * Like the function "cpu()" this one emulates multi byte opcodes
+ * starting with 0xed
+ */
+
+#include "sim.h"
+#include "simglb.h"
+
+static int trap_ed(void);
+static int op_im0(void), op_im1(void), op_im2(void);
+static int op_reti(void), op_retn(void);
+static int op_neg(void);
+static int op_inaic(void), op_inbic(void), op_incic(void);
+static int op_indic(void), op_ineic(void);
+static int op_inhic(void), op_inlic(void);
+static int op_outca(void), op_outcb(void), op_outcc(void);
+static int op_outcd(void), op_outce(void);
+static int op_outch(void), op_outcl(void);
+static int op_ini(void), op_inir(void), op_ind(void), op_indr(void);
+static int op_outi(void), op_otir(void), op_outd(void), op_otdr(void);
+static int op_ldai(void), op_ldar(void), op_ldia(void), op_ldra(void);
+static int op_ldbcinn(void), op_lddeinn(void), op_ldspinn(void);
+static int op_ldinbc(void), op_ldinde(void), op_ldinsp(void);
+static int op_adchb(void), op_adchd(void), op_adchh(void), op_adchs(void);
+static int op_sbchb(void), op_sbchd(void), op_sbchh(void), op_sbchs(void);
+static int op_ldi(void), op_ldir(void), op_ldd(void), op_lddr(void);
+static int op_cpi(void), op_cpir(void), op_cpdop(void), op_cpdr(void);
+static int op_oprld(void), op_oprrd(void);
+
+int op_ed_handel(void)
+{
+ register int t;
+
+ static int (*op_ed[256]) (void) = {
+ trap_ed, /* 0x00 */
+ trap_ed, /* 0x01 */
+ trap_ed, /* 0x02 */
+ trap_ed, /* 0x03 */
+ trap_ed, /* 0x04 */
+ trap_ed, /* 0x05 */
+ trap_ed, /* 0x06 */
+ trap_ed, /* 0x07 */
+ trap_ed, /* 0x08 */
+ trap_ed, /* 0x09 */
+ trap_ed, /* 0x0a */
+ trap_ed, /* 0x0b */
+ trap_ed, /* 0x0c */
+ trap_ed, /* 0x0d */
+ trap_ed, /* 0x0e */
+ trap_ed, /* 0x0f */
+ trap_ed, /* 0x10 */
+ trap_ed, /* 0x11 */
+ trap_ed, /* 0x12 */
+ trap_ed, /* 0x13 */
+ trap_ed, /* 0x14 */
+ trap_ed, /* 0x15 */
+ trap_ed, /* 0x16 */
+ trap_ed, /* 0x17 */
+ trap_ed, /* 0x18 */
+ trap_ed, /* 0x19 */
+ trap_ed, /* 0x1a */
+ trap_ed, /* 0x1b */
+ trap_ed, /* 0x1c */
+ trap_ed, /* 0x1d */
+ trap_ed, /* 0x1e */
+ trap_ed, /* 0x1f */
+ trap_ed, /* 0x20 */
+ trap_ed, /* 0x21 */
+ trap_ed, /* 0x22 */
+ trap_ed, /* 0x23 */
+ trap_ed, /* 0x24 */
+ trap_ed, /* 0x25 */
+ trap_ed, /* 0x26 */
+ trap_ed, /* 0x27 */
+ trap_ed, /* 0x28 */
+ trap_ed, /* 0x29 */
+ trap_ed, /* 0x2a */
+ trap_ed, /* 0x2b */
+ trap_ed, /* 0x2c */
+ trap_ed, /* 0x2d */
+ trap_ed, /* 0x2e */
+ trap_ed, /* 0x2f */
+ trap_ed, /* 0x30 */
+ trap_ed, /* 0x31 */
+ trap_ed, /* 0x32 */
+ trap_ed, /* 0x33 */
+ trap_ed, /* 0x34 */
+ trap_ed, /* 0x35 */
+ trap_ed, /* 0x36 */
+ trap_ed, /* 0x37 */
+ trap_ed, /* 0x38 */
+ trap_ed, /* 0x39 */
+ trap_ed, /* 0x3a */
+ trap_ed, /* 0x3b */
+ trap_ed, /* 0x3c */
+ trap_ed, /* 0x3d */
+ trap_ed, /* 0x3e */
+ trap_ed, /* 0x3f */
+ op_inbic, /* 0x40 */
+ op_outcb, /* 0x41 */
+ op_sbchb, /* 0x42 */
+ op_ldinbc, /* 0x43 */
+ op_neg, /* 0x44 */
+ op_retn, /* 0x45 */
+ op_im0, /* 0x46 */
+ op_ldia, /* 0x47 */
+ op_incic, /* 0x48 */
+ op_outcc, /* 0x49 */
+ op_adchb, /* 0x4a */
+ op_ldbcinn, /* 0x4b */
+ trap_ed, /* 0x4c */
+ op_reti, /* 0x4d */
+ trap_ed, /* 0x4e */
+ op_ldra, /* 0x4f */
+ op_indic, /* 0x50 */
+ op_outcd, /* 0x51 */
+ op_sbchd, /* 0x52 */
+ op_ldinde, /* 0x53 */
+ trap_ed, /* 0x54 */
+ trap_ed, /* 0x55 */
+ op_im1, /* 0x56 */
+ op_ldai, /* 0x57 */
+ op_ineic, /* 0x58 */
+ op_outce, /* 0x59 */
+ op_adchd, /* 0x5a */
+ op_lddeinn, /* 0x5b */
+ trap_ed, /* 0x5c */
+ trap_ed, /* 0x5d */
+ op_im2, /* 0x5e */
+ op_ldar, /* 0x5f */
+ op_inhic, /* 0x60 */
+ op_outch, /* 0x61 */
+ op_sbchh, /* 0x62 */
+ trap_ed, /* 0x63 */
+ trap_ed, /* 0x64 */
+ trap_ed, /* 0x65 */
+ trap_ed, /* 0x66 */
+ op_oprrd, /* 0x67 */
+ op_inlic, /* 0x68 */
+ op_outcl, /* 0x69 */
+ op_adchh, /* 0x6a */
+ trap_ed, /* 0x6b */
+ trap_ed, /* 0x6c */
+ trap_ed, /* 0x6d */
+ trap_ed, /* 0x6e */
+ op_oprld, /* 0x6f */
+ trap_ed, /* 0x70 */
+ trap_ed, /* 0x71 */
+ op_sbchs, /* 0x72 */
+ op_ldinsp, /* 0x73 */
+ trap_ed, /* 0x74 */
+ trap_ed, /* 0x75 */
+ trap_ed, /* 0x76 */
+ trap_ed, /* 0x77 */
+ op_inaic, /* 0x78 */
+ op_outca, /* 0x79 */
+ op_adchs, /* 0x7a */
+ op_ldspinn, /* 0x7b */
+ trap_ed, /* 0x7c */
+ trap_ed, /* 0x7d */
+ trap_ed, /* 0x7e */
+ trap_ed, /* 0x7f */
+ trap_ed, /* 0x80 */
+ trap_ed, /* 0x81 */
+ trap_ed, /* 0x82 */
+ trap_ed, /* 0x83 */
+ trap_ed, /* 0x84 */
+ trap_ed, /* 0x85 */
+ trap_ed, /* 0x86 */
+ trap_ed, /* 0x87 */
+ trap_ed, /* 0x88 */
+ trap_ed, /* 0x89 */
+ trap_ed, /* 0x8a */
+ trap_ed, /* 0x8b */
+ trap_ed, /* 0x8c */
+ trap_ed, /* 0x8d */
+ trap_ed, /* 0x8e */
+ trap_ed, /* 0x8f */
+ trap_ed, /* 0x90 */
+ trap_ed, /* 0x91 */
+ trap_ed, /* 0x92 */
+ trap_ed, /* 0x93 */
+ trap_ed, /* 0x94 */
+ trap_ed, /* 0x95 */
+ trap_ed, /* 0x96 */
+ trap_ed, /* 0x97 */
+ trap_ed, /* 0x98 */
+ trap_ed, /* 0x99 */
+ trap_ed, /* 0x9a */
+ trap_ed, /* 0x9b */
+ trap_ed, /* 0x9c */
+ trap_ed, /* 0x9d */
+ trap_ed, /* 0x9e */
+ trap_ed, /* 0x9f */
+ op_ldi, /* 0xa0 */
+ op_cpi, /* 0xa1 */
+ op_ini, /* 0xa2 */
+ op_outi, /* 0xa3 */
+ trap_ed, /* 0xa4 */
+ trap_ed, /* 0xa5 */
+ trap_ed, /* 0xa6 */
+ trap_ed, /* 0xa7 */
+ op_ldd, /* 0xa8 */
+ op_cpdop, /* 0xa9 */
+ op_ind, /* 0xaa */
+ op_outd, /* 0xab */
+ trap_ed, /* 0xac */
+ trap_ed, /* 0xad */
+ trap_ed, /* 0xae */
+ trap_ed, /* 0xaf */
+ op_ldir, /* 0xb0 */
+ op_cpir, /* 0xb1 */
+ op_inir, /* 0xb2 */
+ op_otir, /* 0xb3 */
+ trap_ed, /* 0xb4 */
+ trap_ed, /* 0xb5 */
+ trap_ed, /* 0xb6 */
+ trap_ed, /* 0xb7 */
+ op_lddr, /* 0xb8 */
+ op_cpdr, /* 0xb9 */
+ op_indr, /* 0xba */
+ op_otdr, /* 0xbb */
+ trap_ed, /* 0xbc */
+ trap_ed, /* 0xbd */
+ trap_ed, /* 0xbe */
+ trap_ed, /* 0xbf */
+ trap_ed, /* 0xc0 */
+ trap_ed, /* 0xc1 */
+ trap_ed, /* 0xc2 */
+ trap_ed, /* 0xc3 */
+ trap_ed, /* 0xc4 */
+ trap_ed, /* 0xc5 */
+ trap_ed, /* 0xc6 */
+ trap_ed, /* 0xc7 */
+ trap_ed, /* 0xc8 */
+ trap_ed, /* 0xc9 */
+ trap_ed, /* 0xca */
+ trap_ed, /* 0xcb */
+ trap_ed, /* 0xcc */
+ trap_ed, /* 0xcd */
+ trap_ed, /* 0xce */
+ trap_ed, /* 0xcf */
+ trap_ed, /* 0xd0 */
+ trap_ed, /* 0xd1 */
+ trap_ed, /* 0xd2 */
+ trap_ed, /* 0xd3 */
+ trap_ed, /* 0xd4 */
+ trap_ed, /* 0xd5 */
+ trap_ed, /* 0xd6 */
+ trap_ed, /* 0xd7 */
+ trap_ed, /* 0xd8 */
+ trap_ed, /* 0xd9 */
+ trap_ed, /* 0xda */
+ trap_ed, /* 0xdb */
+ trap_ed, /* 0xdc */
+ trap_ed, /* 0xdd */
+ trap_ed, /* 0xde */
+ trap_ed, /* 0xdf */
+ trap_ed, /* 0xe0 */
+ trap_ed, /* 0xe1 */
+ trap_ed, /* 0xe2 */
+ trap_ed, /* 0xe3 */
+ trap_ed, /* 0xe4 */
+ trap_ed, /* 0xe5 */
+ trap_ed, /* 0xe6 */
+ trap_ed, /* 0xe7 */
+ trap_ed, /* 0xe8 */
+ trap_ed, /* 0xe9 */
+ trap_ed, /* 0xea */
+ trap_ed, /* 0xeb */
+ trap_ed, /* 0xec */
+ trap_ed, /* 0xed */
+ trap_ed, /* 0xee */
+ trap_ed, /* 0xef */
+ trap_ed, /* 0xf0 */
+ trap_ed, /* 0xf1 */
+ trap_ed, /* 0xf2 */
+ trap_ed, /* 0xf3 */
+ trap_ed, /* 0xf4 */
+ trap_ed, /* 0xf5 */
+ trap_ed, /* 0xf6 */
+ trap_ed, /* 0xf7 */
+ trap_ed, /* 0xf8 */
+ trap_ed, /* 0xf9 */
+ trap_ed, /* 0xfa */
+ trap_ed, /* 0xfb */
+ trap_ed, /* 0xfc */
+ trap_ed, /* 0xfd */
+ trap_ed, /* 0xfe */
+ trap_ed /* 0xff */
+ };
+
+#ifdef WANT_TIM
+ t = (*op_ed[*PC++]) (); /* execute next opcode */
+#else
+ (*op_ed[*PC++]) ();
+#endif
+
+#ifdef WANT_PCC
+ if (PC > ram + 65535) /* correct PC overrun */
+ PC = ram;
+#endif
+
+ return(t);
+}
+
+/*
+ * This function traps all illegal opcodes following the
+ * initial 0xed of a multi byte opcode.
+ */
+static int trap_ed(void)
+{
+ cpu_error = OPTRAP2;
+ cpu_state = STOPPED;
+ return(0);
+}
+
+static int op_im0(void) /* IM 0 */
+{
+ int_mode = 0;
+ return(8);
+}
+
+static int op_im1(void) /* IM 1 */
+{
+ int_mode = 1;
+ return(8);
+}
+
+static int op_im2(void) /* IM 2 */
+{
+ int_mode = 2;
+ return(8);
+}
+
+static int op_reti(void) /* RETI */
+{
+ register unsigned i;
+
+ i = *STACK++;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ i += *STACK++ << 8;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ PC = ram + i;
+ return(14);
+}
+
+static int op_retn(void) /* RETN */
+{
+ register unsigned i;
+
+ i = *STACK++;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ i += *STACK++ << 8;
+#ifdef WANT_SPC
+ if (STACK >= ram + 65536L)
+ STACK = ram;
+#endif
+ PC = ram + i;
+ if (IFF & 2)
+ IFF |= 1;
+ return(14);
+}
+
+static int op_neg(void) /* NEG */
+{
+ (A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ (A == 0x80) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (0 - ((char) A & 0xf) < 0) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ A = 0 - A;
+ F |= N_FLAG;
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ return(8);
+}
+
+static int op_inaic(void) /* IN A,(C) */
+{
+ BYTE io_in();
+
+ A = io_in(C);
+ F &= ~(N_FLAG | H_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(12);
+}
+
+static int op_inbic(void) /* IN B,(C) */
+{
+ BYTE io_in();
+
+ B = io_in(C);
+ F &= ~(N_FLAG | H_FLAG);
+ (B) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (B & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[B]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(12);
+}
+
+static int op_incic(void) /* IN C,(C) */
+{
+ BYTE io_in();
+
+ C = io_in(C);
+ F &= ~(N_FLAG | H_FLAG);
+ (C) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (C & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[C]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(12);
+}
+
+static int op_indic(void) /* IN D,(C) */
+{
+ BYTE io_in();
+
+ D = io_in(C);
+ F &= ~(N_FLAG | H_FLAG);
+ (D) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (D & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[D]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(12);
+}
+
+static int op_ineic(void) /* IN E,(C) */
+{
+ BYTE io_in();
+
+ E = io_in(C);
+ F &= ~(N_FLAG | H_FLAG);
+ (E) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (E & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[E]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(12);
+}
+
+static int op_inhic(void) /* IN H,(C) */
+{
+ BYTE io_in();
+
+ H = io_in(C);
+ F &= ~(N_FLAG | H_FLAG);
+ (H) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (H & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[H]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(12);
+}
+
+static int op_inlic(void) /* IN L,(C) */
+{
+ BYTE io_in();
+
+ L = io_in(C);
+ F &= ~(N_FLAG | H_FLAG);
+ (L) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (L & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[L]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(12);
+}
+
+static int op_outca(void) /* OUT (C),A */
+{
+ BYTE io_out();
+
+ io_out(C, A);
+ return(12);
+}
+
+static int op_outcb(void) /* OUT (C),B */
+{
+ BYTE io_out();
+
+ io_out(C, B);
+ return(12);
+}
+
+static int op_outcc(void) /* OUT (C),C */
+{
+ BYTE io_out();
+
+ io_out(C, C);
+ return(12);
+}
+
+static int op_outcd(void) /* OUT (C),D */
+{
+ BYTE io_out();
+
+ io_out(C, D);
+ return(12);
+}
+
+static int op_outce(void) /* OUT (C),E */
+{
+ BYTE io_out();
+
+ io_out(C, E);
+ return(12);
+}
+
+static int op_outch(void) /* OUT (C),H */
+{
+ BYTE io_out();
+
+ io_out(C, H);
+ return(12);
+}
+
+static int op_outcl(void) /* OUT (C),L */
+{
+ BYTE io_out();
+
+ io_out(C, L);
+ return(12);
+}
+
+static int op_ini(void) /* INI */
+{
+ BYTE io_in();
+
+ *(ram + (H << 8) + L) = io_in(C);
+ L++;
+ if (!L)
+ H++;
+ B--;
+ F |= N_FLAG;
+ (B) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ return(16);
+}
+
+static int op_inir(void) /* INIR */
+{
+ register int t = -21;
+ register BYTE *d;
+ BYTE io_in();
+
+ d = ram + (H << 8) + L;
+ do {
+ *d++ = io_in(C);
+ B--;
+ t += 21;
+ } while (B);
+ H = (d - ram) >> 8;
+ L = d - ram;
+ F |= N_FLAG | Z_FLAG;
+ return(t + 16);
+}
+
+static int op_ind(void) /* IND */
+{
+ BYTE io_in();
+
+ *(ram + (H << 8) + L) = io_in(C);
+ L--;
+ if (L == 0xff)
+ H--;
+ B--;
+ F |= N_FLAG;
+ (B) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ return(16);
+}
+
+static int op_indr(void) /* INDR */
+{
+ register int t = -21;
+ register BYTE *d;
+ BYTE io_in();
+
+ d = ram + (H << 8) + L;
+ do {
+ *d-- = io_in(C);
+ B--;
+ t += 21;
+ } while (B);
+ H = (d - ram) >> 8;
+ L = d - ram;
+ F |= N_FLAG | Z_FLAG;
+ return(t + 16);
+}
+
+static int op_outi(void) /* OUTI */
+{
+ BYTE io_out();
+
+ io_out(C, *(ram + (H << 8) * L));
+ L++;
+ if (!L)
+ H++;
+ B--;
+ F |= N_FLAG;
+ (B) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ return(16);
+}
+
+static int op_otir(void) /* OTIR */
+{
+ register int t = -21;
+ register BYTE *d;
+ BYTE io_out();
+
+ d = ram + (H << 8) + L;
+ do {
+ io_out(C, *d++);
+ B--;
+ t += 21;
+ } while (B);
+ H = (d - ram) >> 8;
+ L = d - ram;
+ F |= N_FLAG | Z_FLAG;
+ return(t + 16);
+}
+
+static int op_outd(void) /* OUTD */
+{
+ BYTE io_out();
+
+ io_out(C, *(ram + (H << 8) * L));
+ L--;
+ if (L == 0xff)
+ H--;
+ B--;
+ F |= N_FLAG;
+ (B) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ return(16);
+}
+
+static int op_otdr(void) /* OTDR */
+{
+ register int t = -21;
+ register BYTE *d;
+ BYTE io_out();
+
+ d = ram + (H << 8) + L;
+ do {
+ io_out(C, *d--);
+ B--;
+ t += 21;
+ } while (B);
+ H = (d - ram) >> 8;
+ L = d - ram;
+ F |= N_FLAG | Z_FLAG;
+ return(t + 16);
+}
+
+static int op_ldai(void) /* LD A,I */
+{
+ A = I;
+ F &= ~(N_FLAG | H_FLAG);
+ (IFF & 2) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ return(9);
+}
+
+static int op_ldar(void) /* LD A,R */
+{
+ A = (BYTE) R;
+ F &= ~(N_FLAG | H_FLAG);
+ (IFF & 2) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ return(9);
+}
+
+static int op_ldia(void) /* LD I,A */
+{
+ I = A;
+ return(9);
+}
+
+static int op_ldra(void) /* LD R,A */
+{
+ R = A;
+ return(9);
+}
+
+static int op_ldbcinn(void) /* LD BC,(nn) */
+{
+ register BYTE *p;
+
+ p = ram + *PC++;
+ p += *PC++ << 8;
+ C = *p++;
+ B = *p;
+ return(20);
+}
+
+static int op_lddeinn(void) /* LD DE,(nn) */
+{
+ register BYTE *p;
+
+ p = ram + *PC++;
+ p += *PC++ << 8;
+ E = *p++;
+ D = *p;
+ return(20);
+}
+
+static int op_ldspinn(void) /* LD SP,(nn) */
+{
+ register BYTE *p;
+
+ p = ram + *PC++;
+ p += *PC++ << 8;
+ STACK = ram + *p++;
+ STACK += *p << 8;
+ return(20);
+}
+
+static int op_ldinbc(void) /* LD (nn),BC */
+{
+ register BYTE *p;
+
+ p = ram + *PC++;
+ p += *PC++ << 8;
+ *p++ = C;
+ *p = B;
+ return(20);
+}
+
+static int op_ldinde(void) /* LD (nn),DE */
+{
+ register BYTE *p;
+
+ p = ram + *PC++;
+ p += *PC++ << 8;
+ *p++ = E;
+ *p = D;
+ return(20);
+}
+
+static int op_ldinsp(void) /* LD (nn),SP */
+{
+ register BYTE *p;
+ register int i;
+
+ p = ram + *PC++;
+ p += *PC++ << 8;
+ i = STACK - ram;
+ *p++ = i;
+ *p = i >> 8;
+ return(20);
+}
+
+static int op_adchb(void) /* ADC HL,BC */
+{
+ register int carry;
+ int lcarry;
+ register WORD hl, bc;
+ register long i;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ lcarry = (L + C > 255) ? 1 : 0;
+ ((H & 0xf) + (B & 0xf) + carry + lcarry > 0xf) ? (F |= H_FLAG)
+ : (F &= ~H_FLAG);
+ hl = (H << 8) + L;
+ bc = (B << 8) + C;
+ i = ((long)hl) + ((long)bc) + carry;
+ ((hl < 0x8000) && (i > 0x7fffL)) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i > 0xffffL) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ (i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ H = i >> 8;
+ L = i;
+ F &= ~N_FLAG;
+ (H & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ return(15);
+}
+
+static int op_adchd(void) /* ADC HL,DE */
+{
+ register int carry;
+ int lcarry;
+ register WORD hl, de;
+ register long i;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ lcarry = (L + E > 255) ? 1 : 0;
+ ((H & 0xf) + (D & 0xf) + carry + lcarry > 0xf) ? (F |= H_FLAG)
+ : (F &= ~H_FLAG);
+ hl = (H << 8) + L;
+ de = (D << 8) + E;
+ i = ((long)hl) + ((long)de) + carry;
+ ((hl < 0x8000) && (i > 0x7fffL)) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i > 0xffffL) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ (i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ H = i >> 8;
+ L = i;
+ F &= ~N_FLAG;
+ (H & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ return(15);
+}
+
+static int op_adchh(void) /* ADC HL,HL */
+{
+ register int carry;
+ int lcarry;
+ register WORD hl;
+ register long i;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ lcarry = (L + L > 255) ? 1 : 0;
+ ((H & 0xf) + (H & 0xf) + carry + lcarry > 0xf) ? (F |= H_FLAG)
+ : (F &= ~H_FLAG);
+ hl = (H << 8) + L;
+ i = ((((long)hl) << 1) + carry);
+ ((hl < 0x8000) && (i > 0x7fffL)) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i > 0xffffL) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ (i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ H = i >> 8;
+ L = i;
+ F &= ~N_FLAG;
+ (H & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ return(15);
+}
+
+static int op_adchs(void) /* ADC HL,SP */
+{
+ register int carry;
+ int lcarry;
+ register WORD hl, sp;
+ register long i;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ hl = (H << 8) + L;
+ sp = STACK - ram;
+ lcarry = (L + (sp & 0xff) > 255) ? 1 : 0;
+ ((H & 0xf) + ((sp >> 8) & 0xf) + carry + lcarry > 0xf) ? (F |= H_FLAG)
+ : (F &= ~H_FLAG);
+ i = ((long)hl) + ((long)sp) + carry;
+ ((hl < 0x8000) && (i > 0x7fffL)) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i > 0xffffL) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ (i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ H = i >> 8;
+ L = i;
+ F &= ~N_FLAG;
+ (H & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ return(15);
+}
+
+static int op_sbchb(void) /* SBC HL,BC */
+{
+ register int carry;
+ int lcarry;
+ register WORD hl, bc;
+ register long i;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ lcarry = (C > L) ? 1 : 0;
+ ((B & 0xf) + carry + lcarry > (H & 0xf)) ? (F |= H_FLAG)
+ : (F &= ~H_FLAG);
+ hl = (H << 8) + L;
+ bc = (B << 8) + C;
+ i = ((long)hl) - ((long)bc) - carry;
+ ((hl > 0x7fff) && (i < 0x8000L)) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i < 0L) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ (i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ H = i >> 8;
+ L = i;
+ F |= N_FLAG;
+ (H & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ return(15);
+}
+
+static int op_sbchd(void) /* SBC HL,DE */
+{
+ register int carry;
+ int lcarry;
+ register WORD hl, de;
+ register long i;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ lcarry = (E > L) ? 1 : 0;
+ ((D & 0xf) + carry + lcarry > (H & 0xf)) ? (F |= H_FLAG)
+ : (F &= ~H_FLAG);
+ hl = (H << 8) + L;
+ de = (D << 8) + E;
+ i = ((long)hl) - ((long)de) - carry;
+ ((hl > 0x7fff) && (i < 0x8000L)) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i < 0L) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ (i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ H = i >> 8;
+ L = i;
+ F |= N_FLAG;
+ (H & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ return(15);
+}
+
+static int op_sbchh(void) /* SBC HL,HL */
+{
+ if (F & C_FLAG) {
+ F |= S_FLAG | P_FLAG | N_FLAG | C_FLAG | H_FLAG;
+ F &= ~Z_FLAG;
+ H = L = 255;
+ } else {
+ F |= Z_FLAG | N_FLAG;
+ F &= ~(S_FLAG | P_FLAG | C_FLAG | H_FLAG);
+ H = L = 0;
+ }
+ return(15);
+}
+
+static int op_sbchs(void) /* SBC HL,SP */
+{
+ register int carry;
+ int lcarry;
+ register WORD hl, sp;
+ register long i;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ hl = (H << 8) + L;
+ sp = STACK - ram;
+ lcarry = ((sp & 0xff) > L) ? 1 : 0;
+ (((sp >> 8) & 0xf) + carry + lcarry > (H & 0xf)) ? (F |= H_FLAG)
+ : (F &= ~H_FLAG);
+ i = ((long)hl) - ((long)sp) - carry;
+ ((hl > 0x7fff) && (i < 0x8000L)) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i < 0L) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ (i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ H = i >> 8;
+ L = i;
+ F |= N_FLAG;
+ (H & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ return(15);
+}
+
+static int op_ldi(void) /* LDI */
+{
+ *(ram + (D << 8) + E) = *(ram + (H << 8) + L);
+ E++;
+ if (!E)
+ D++;
+ L++;
+ if (!L)
+ H++;
+ C--;
+ if (C == 0xff)
+ B--;
+ (B | C) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ F &= ~(N_FLAG | H_FLAG);
+ return(16);
+}
+
+static int op_ldir(void) /* LDIR */
+{
+ register int t = -21;
+ register WORD i;
+ register BYTE *s, *d;
+
+ i = (B << 8) + C;
+ d = ram + (D << 8) + E;
+ s = ram + (H << 8) + L;
+ do {
+ *d++ = *s++;
+ t += 21;
+ } while (--i);
+ B = C = 0;
+ D = (d - ram) >> 8;
+ E = d - ram;
+ H = (s - ram) >> 8;
+ L = s - ram;
+ F &= ~(N_FLAG | P_FLAG | H_FLAG);
+ return(t + 16);
+}
+
+static int op_ldd(void) /* LDD */
+{
+ *(ram + (D << 8) + E) = *(ram + (H << 8) + L);
+ E--;
+ if (E == 0xff)
+ D--;
+ L--;
+ if (L == 0xff)
+ H--;
+ C--;
+ if (C == 0xff)
+ B--;
+ (B | C) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ F &= ~(N_FLAG | H_FLAG);
+ return(16);
+}
+
+static int op_lddr(void) /* LDDR */
+{
+ register int t = -21;
+ register WORD i;
+ register BYTE *s, *d;
+
+ i = (B << 8) + C;
+ d = ram + (D << 8) + E;
+ s = ram + (H << 8) + L;
+ do {
+ *d-- = *s--;
+ t += 21;
+ } while (--i);
+ B = C = 0;
+ D = (d - ram) >> 8;
+ E = d - ram;
+ H = (s - ram) >> 8;
+ L = s - ram;
+ F &= ~(N_FLAG | P_FLAG | H_FLAG);
+ return(t + 16);
+}
+
+static int op_cpi(void) /* CPI */
+{
+ register BYTE i;
+
+ i = *(ram + ((H << 8) + L));
+ ((i & 0xf) > (A & 0xF)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ i = A - i;
+ L++;
+ if (!L)
+ H++;
+ C--;
+ if (C == 0xff)
+ B--;
+ F |= N_FLAG;
+ (B | C) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ return(16);
+}
+
+static int op_cpir(void) /* CPIR */
+ /* H Flag not set!!! */
+{
+ register int t = -21;
+ register BYTE *s;
+ register BYTE d;
+ register WORD i;
+
+ i = (B << 8) + C;
+ s = ram + (H << 8) + L;
+ do {
+ d = A - *s++;
+ t += 21;
+ } while (--i && d);
+ F |= N_FLAG;
+ B = i >> 8;
+ C = i;
+ H = (s - ram) >> 8;
+ L = s - ram;
+ (i) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (d) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (d & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ return(t + 16);
+}
+
+static int op_cpdop(void) /* CPD */
+{
+ register BYTE i;
+
+ i = *(ram + ((H << 8) + L));
+ ((i & 0xf) > (A & 0xF)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ i = A - i;
+ L--;
+ if (L == 0xff)
+ H--;
+ C--;
+ if (C == 0xff)
+ B--;
+ F |= N_FLAG;
+ (B | C) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ return(16);
+}
+
+static int op_cpdr(void) /* CPDR */
+ /* H Flag not set!!! */
+{
+ register int t = -21;
+ register BYTE *s;
+ register BYTE d;
+ register WORD i;
+
+ i = (B << 8) + C;
+ s = ram + (H << 8) + L;
+ do {
+ d = A - *s--;
+ t += 21;
+ } while (--i && d);
+ F |= N_FLAG;
+ B = i >> 8;
+ C = i;
+ H = (s - ram) >> 8;
+ L = s - ram;
+ (i) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (d) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (d & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ return(t + 16);
+}
+
+static int op_oprld(void) /* RLD (HL) */
+{
+ register int i, j;
+
+ i = *(ram + (H << 8) + L);
+ j = A & 0x0f;
+ A = (A & 0xf0) | (i >> 4);
+ i = (i << 4) | j;
+ *(ram + (H << 8) + L) = i;
+ F &= ~(H_FLAG | N_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(18);
+}
+
+static int op_oprrd(void) /* RRD (HL) */
+{
+ register int i, j;
+
+ i = *(ram + (H << 8) + L);
+ j = A & 0x0f;
+ A = (A & 0xf0) | (i & 0x0f);
+ i = (i >> 4) | (j << 4);
+ *(ram + (H << 8) + L) = i;
+ F &= ~(H_FLAG | N_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(18);
+}
diff --git a/emu/z80pack-1.9/z80sim/sim4.o b/emu/z80pack-1.9/z80sim/sim4.o
new file mode 100644
index 0000000..cd636e2
Binary files /dev/null and b/emu/z80pack-1.9/z80sim/sim4.o differ
diff --git a/emu/z80pack-1.9/z80sim/sim5.c b/emu/z80pack-1.9/z80sim/sim5.c
new file mode 100644
index 0000000..a485feb
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/sim5.c
@@ -0,0 +1,728 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-JAN-89 Release 1.1
+ * 08-FEB-89 Release 1.2
+ * 13-MAR-89 Release 1.3
+ * 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
+ * 20-DEC-90 Release 1.5 Ported to COHERENT 3.0
+ * 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
+ * and some optimization
+ * 25-JUN-92 Release 1.7 comments in english
+ * 07-OCT-06 Release 1.8 modified to compile on modern POSIX OS's
+ */
+
+/*
+ * Like the function "cpu()" this one emulates multi byte opcodes
+ * starting with 0xfd
+ */
+
+#include "sim.h"
+#include "simglb.h"
+
+static int trap_fd(void);
+static int op_popiy(void), op_pusiy(void);
+static int op_jpiy(void);
+static int op_exspy(void);
+static int op_ldspy(void);
+static int op_ldiynn(void), op_ldiyinn(void), op_ldiny(void);
+static int op_adayd(void), op_acayd(void), op_suayd(void), op_scayd(void);
+static int op_andyd(void), op_xoryd(void), op_oryd(void), op_cpyd(void);
+static int op_decyd(void), op_incyd(void);
+static int op_addyb(void), op_addyd(void), op_addys(void), op_addyy(void);
+static int op_andyd(void), op_xoryd(void), op_oryd(void), op_cpyd(void);
+static int op_decyd(void), op_incyd(void);
+static int op_inciy(void), op_deciy(void);
+static int op_ldayd(void), op_ldbyd(void), op_ldcyd(void);
+static int op_lddyd(void), op_ldeyd(void);
+static int op_ldhyd(void), op_ldlyd(void);
+static int op_ldyda(void), op_ldydb(void), op_ldydc(void);
+static int op_ldydd(void), op_ldyde(void);
+static int op_ldydh(void), op_ldydl(void), op_ldydn(void);
+extern int op_fdcb_handel(void);
+
+int op_fd_handel(void)
+{
+ register int t;
+
+ static int (*op_fd[256]) () = {
+ trap_fd, /* 0x00 */
+ trap_fd, /* 0x01 */
+ trap_fd, /* 0x02 */
+ trap_fd, /* 0x03 */
+ trap_fd, /* 0x04 */
+ trap_fd, /* 0x05 */
+ trap_fd, /* 0x06 */
+ trap_fd, /* 0x07 */
+ trap_fd, /* 0x08 */
+ op_addyb, /* 0x09 */
+ trap_fd, /* 0x0a */
+ trap_fd, /* 0x0b */
+ trap_fd, /* 0x0c */
+ trap_fd, /* 0x0d */
+ trap_fd, /* 0x0e */
+ trap_fd, /* 0x0f */
+ trap_fd, /* 0x10 */
+ trap_fd, /* 0x11 */
+ trap_fd, /* 0x12 */
+ trap_fd, /* 0x13 */
+ trap_fd, /* 0x14 */
+ trap_fd, /* 0x15 */
+ trap_fd, /* 0x16 */
+ trap_fd, /* 0x17 */
+ trap_fd, /* 0x18 */
+ op_addyd, /* 0x19 */
+ trap_fd, /* 0x1a */
+ trap_fd, /* 0x1b */
+ trap_fd, /* 0x1c */
+ trap_fd, /* 0x1d */
+ trap_fd, /* 0x1e */
+ trap_fd, /* 0x1f */
+ trap_fd, /* 0x20 */
+ op_ldiynn, /* 0x21 */
+ op_ldiny, /* 0x22 */
+ op_inciy, /* 0x23 */
+ trap_fd, /* 0x24 */
+ trap_fd, /* 0x25 */
+ trap_fd, /* 0x26 */
+ trap_fd, /* 0x27 */
+ trap_fd, /* 0x28 */
+ op_addyy, /* 0x29 */
+ op_ldiyinn, /* 0x2a */
+ op_deciy, /* 0x2b */
+ trap_fd, /* 0x2c */
+ trap_fd, /* 0x2d */
+ trap_fd, /* 0x2e */
+ trap_fd, /* 0x2f */
+ trap_fd, /* 0x30 */
+ trap_fd, /* 0x31 */
+ trap_fd, /* 0x32 */
+ trap_fd, /* 0x33 */
+ op_incyd, /* 0x34 */
+ op_decyd, /* 0x35 */
+ op_ldydn, /* 0x36 */
+ trap_fd, /* 0x37 */
+ trap_fd, /* 0x38 */
+ op_addys, /* 0x39 */
+ trap_fd, /* 0x3a */
+ trap_fd, /* 0x3b */
+ trap_fd, /* 0x3c */
+ trap_fd, /* 0x3d */
+ trap_fd, /* 0x3e */
+ trap_fd, /* 0x3f */
+ trap_fd, /* 0x40 */
+ trap_fd, /* 0x41 */
+ trap_fd, /* 0x42 */
+ trap_fd, /* 0x43 */
+ trap_fd, /* 0x44 */
+ trap_fd, /* 0x45 */
+ op_ldbyd, /* 0x46 */
+ trap_fd, /* 0x47 */
+ trap_fd, /* 0x48 */
+ trap_fd, /* 0x49 */
+ trap_fd, /* 0x4a */
+ trap_fd, /* 0x4b */
+ trap_fd, /* 0x4c */
+ trap_fd, /* 0x4d */
+ op_ldcyd, /* 0x4e */
+ trap_fd, /* 0x4f */
+ trap_fd, /* 0x50 */
+ trap_fd, /* 0x51 */
+ trap_fd, /* 0x52 */
+ trap_fd, /* 0x53 */
+ trap_fd, /* 0x54 */
+ trap_fd, /* 0x55 */
+ op_lddyd, /* 0x56 */
+ trap_fd, /* 0x57 */
+ trap_fd, /* 0x58 */
+ trap_fd, /* 0x59 */
+ trap_fd, /* 0x5a */
+ trap_fd, /* 0x5b */
+ trap_fd, /* 0x5c */
+ trap_fd, /* 0x5d */
+ op_ldeyd, /* 0x5e */
+ trap_fd, /* 0x5f */
+ trap_fd, /* 0x60 */
+ trap_fd, /* 0x61 */
+ trap_fd, /* 0x62 */
+ trap_fd, /* 0x63 */
+ trap_fd, /* 0x64 */
+ trap_fd, /* 0x65 */
+ op_ldhyd, /* 0x66 */
+ trap_fd, /* 0x67 */
+ trap_fd, /* 0x68 */
+ trap_fd, /* 0x69 */
+ trap_fd, /* 0x6a */
+ trap_fd, /* 0x6b */
+ trap_fd, /* 0x6c */
+ trap_fd, /* 0x6d */
+ op_ldlyd, /* 0x6e */
+ trap_fd, /* 0x6f */
+ op_ldydb, /* 0x70 */
+ op_ldydc, /* 0x71 */
+ op_ldydd, /* 0x72 */
+ op_ldyde, /* 0x73 */
+ op_ldydh, /* 0x74 */
+ op_ldydl, /* 0x75 */
+ trap_fd, /* 0x76 */
+ op_ldyda, /* 0x77 */
+ trap_fd, /* 0x78 */
+ trap_fd, /* 0x79 */
+ trap_fd, /* 0x7a */
+ trap_fd, /* 0x7b */
+ trap_fd, /* 0x7c */
+ trap_fd, /* 0x7d */
+ op_ldayd, /* 0x7e */
+ trap_fd, /* 0x7f */
+ trap_fd, /* 0x80 */
+ trap_fd, /* 0x81 */
+ trap_fd, /* 0x82 */
+ trap_fd, /* 0x83 */
+ trap_fd, /* 0x84 */
+ trap_fd, /* 0x85 */
+ op_adayd, /* 0x86 */
+ trap_fd, /* 0x87 */
+ trap_fd, /* 0x88 */
+ trap_fd, /* 0x89 */
+ trap_fd, /* 0x8a */
+ trap_fd, /* 0x8b */
+ trap_fd, /* 0x8c */
+ trap_fd, /* 0x8d */
+ op_acayd, /* 0x8e */
+ trap_fd, /* 0x8f */
+ trap_fd, /* 0x90 */
+ trap_fd, /* 0x91 */
+ trap_fd, /* 0x92 */
+ trap_fd, /* 0x93 */
+ trap_fd, /* 0x94 */
+ trap_fd, /* 0x95 */
+ op_suayd, /* 0x96 */
+ trap_fd, /* 0x97 */
+ trap_fd, /* 0x98 */
+ trap_fd, /* 0x99 */
+ trap_fd, /* 0x9a */
+ trap_fd, /* 0x9b */
+ trap_fd, /* 0x9c */
+ trap_fd, /* 0x9d */
+ op_scayd, /* 0x9e */
+ trap_fd, /* 0x9f */
+ trap_fd, /* 0xa0 */
+ trap_fd, /* 0xa1 */
+ trap_fd, /* 0xa2 */
+ trap_fd, /* 0xa3 */
+ trap_fd, /* 0xa4 */
+ trap_fd, /* 0xa5 */
+ op_andyd, /* 0xa6 */
+ trap_fd, /* 0xa7 */
+ trap_fd, /* 0xa8 */
+ trap_fd, /* 0xa9 */
+ trap_fd, /* 0xaa */
+ trap_fd, /* 0xab */
+ trap_fd, /* 0xac */
+ trap_fd, /* 0xad */
+ op_xoryd, /* 0xae */
+ trap_fd, /* 0xaf */
+ trap_fd, /* 0xb0 */
+ trap_fd, /* 0xb1 */
+ trap_fd, /* 0xb2 */
+ trap_fd, /* 0xb3 */
+ trap_fd, /* 0xb4 */
+ trap_fd, /* 0xb5 */
+ op_oryd, /* 0xb6 */
+ trap_fd, /* 0xb7 */
+ trap_fd, /* 0xb8 */
+ trap_fd, /* 0xb9 */
+ trap_fd, /* 0xba */
+ trap_fd, /* 0xbb */
+ trap_fd, /* 0xbc */
+ trap_fd, /* 0xbd */
+ op_cpyd, /* 0xbe */
+ trap_fd, /* 0xbf */
+ trap_fd, /* 0xc0 */
+ trap_fd, /* 0xc1 */
+ trap_fd, /* 0xc2 */
+ trap_fd, /* 0xc3 */
+ trap_fd, /* 0xc4 */
+ trap_fd, /* 0xc5 */
+ trap_fd, /* 0xc6 */
+ trap_fd, /* 0xc7 */
+ trap_fd, /* 0xc8 */
+ trap_fd, /* 0xc9 */
+ trap_fd, /* 0xca */
+ op_fdcb_handel, /* 0xcb */
+ trap_fd, /* 0xcc */
+ trap_fd, /* 0xcd */
+ trap_fd, /* 0xce */
+ trap_fd, /* 0xcf */
+ trap_fd, /* 0xd0 */
+ trap_fd, /* 0xd1 */
+ trap_fd, /* 0xd2 */
+ trap_fd, /* 0xd3 */
+ trap_fd, /* 0xd4 */
+ trap_fd, /* 0xd5 */
+ trap_fd, /* 0xd6 */
+ trap_fd, /* 0xd7 */
+ trap_fd, /* 0xd8 */
+ trap_fd, /* 0xd9 */
+ trap_fd, /* 0xda */
+ trap_fd, /* 0xdb */
+ trap_fd, /* 0xdc */
+ trap_fd, /* 0xdd */
+ trap_fd, /* 0xde */
+ trap_fd, /* 0xdf */
+ trap_fd, /* 0xe0 */
+ op_popiy, /* 0xe1 */
+ trap_fd, /* 0xe2 */
+ op_exspy, /* 0xe3 */
+ trap_fd, /* 0xe4 */
+ op_pusiy, /* 0xe5 */
+ trap_fd, /* 0xe6 */
+ trap_fd, /* 0xe7 */
+ trap_fd, /* 0xe8 */
+ op_jpiy, /* 0xe9 */
+ trap_fd, /* 0xea */
+ trap_fd, /* 0xeb */
+ trap_fd, /* 0xec */
+ trap_fd, /* 0xed */
+ trap_fd, /* 0xee */
+ trap_fd, /* 0xef */
+ trap_fd, /* 0xf0 */
+ trap_fd, /* 0xf1 */
+ trap_fd, /* 0xf2 */
+ trap_fd, /* 0xf3 */
+ trap_fd, /* 0xf4 */
+ trap_fd, /* 0xf5 */
+ trap_fd, /* 0xf6 */
+ trap_fd, /* 0xf7 */
+ trap_fd, /* 0xf8 */
+ op_ldspy, /* 0xf9 */
+ trap_fd, /* 0xfa */
+ trap_fd, /* 0xfb */
+ trap_fd, /* 0xfc */
+ trap_fd, /* 0xfd */
+ trap_fd, /* 0xfe */
+ trap_fd /* 0xff */
+ };
+
+#ifdef WANT_TIM
+ t = (*op_fd[*PC++]) (); /* execute next opcode */
+#else
+ (*op_fd[*PC++]) ();
+#endif
+
+#ifdef WANT_PCC
+ if (PC > ram + 65535) /* correct PC overrun */
+ PC = ram;
+#endif
+
+ return(t);
+}
+
+/*
+ * This function traps all illegal opcodes following the
+ * initial 0xfd of a multi byte opcode.
+ */
+static int trap_fd(void)
+{
+ cpu_error = OPTRAP2;
+ cpu_state = STOPPED;
+ return(0);
+}
+
+static int op_popiy(void) /* POP IY */
+{
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ IY = *STACK++;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ IY += *STACK++ << 8;
+ return(14);
+}
+
+static int op_pusiy(void) /* PUSH IY */
+{
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = IY >> 8;
+#ifdef WANT_SPC
+ if (STACK <= ram)
+ STACK = ram + 65536L;
+#endif
+ *--STACK = IY;
+ return(15);
+}
+
+static int op_jpiy(void) /* JP (IY) */
+{
+ PC = ram + IY;
+ return(8);
+}
+
+static int op_exspy(void) /* EX (SP),IY */
+{
+ register int i;
+
+ i = *STACK + (*(STACK + 1) << 8);
+ *STACK = IY;
+ *(STACK + 1) = IY >> 8;
+ IY = i;
+ return(23);
+}
+
+static int op_ldspy(void) /* LD SP,IY */
+{
+ STACK = ram + IY;
+ return(10);
+}
+
+static int op_ldiynn(void) /* LD IY,nn */
+{
+ IY = *PC++;
+ IY += *PC++ << 8;
+ return(14);
+}
+
+static int op_ldiyinn(void) /* LD IY,(nn) */
+{
+ register BYTE *p;
+
+ p = ram + *PC++;
+ p += *PC++ << 8;
+ IY = *p++;
+ IY += *p << 8;
+ return(20);
+}
+
+static int op_ldiny(void) /* LD (nn),IY */
+{
+ register BYTE *p;
+
+ p = ram + *PC++;
+ p += *PC++ << 8;
+ *p++ = IY;
+ *p = IY >> 8;
+ return(20);
+}
+
+static int op_adayd(void) /* ADD A,(IY+d) */
+{
+ register int i;
+ register BYTE P;
+
+ P = *(ram + IY + (char) *PC++);
+ ((A & 0xf) + (P & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + P > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) P;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(19);
+}
+
+static int op_acayd(void) /* ADC A,(IY+d) */
+{
+ register int i, carry;
+ register BYTE P;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ P = *(ram + IY + (char) *PC++);
+ ((A & 0xf) + (P & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (A + P + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A + (char) P + carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(19);
+}
+
+static int op_suayd(void) /* SUB A,(IY+d) */
+{
+ register int i;
+ register BYTE P;
+
+ P = *(ram + IY + (char) *PC++);
+ ((P & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (P > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) P;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(19);
+}
+
+static int op_scayd(void) /* SBC A,(IY+d) */
+{
+ register int i, carry;
+ register BYTE P;
+
+ carry = (F & C_FLAG) ? 1 : 0;
+ P = *(ram + IY + (char) *PC++);
+ ((P & 0xf) + carry > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (P + carry > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ A = i = (char) A - (char) P - carry;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(19);
+}
+
+static int op_andyd(void) /* AND (IY+d) */
+{
+ A &= *(ram + IY + (char) *PC++);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= H_FLAG;
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(N_FLAG | C_FLAG);
+ return(19);
+}
+
+static int op_xoryd(void) /* XOR (IY+d) */
+{
+ A ^= *(ram + IY + (char) *PC++);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(19);
+}
+
+static int op_oryd(void) /* OR (IY+d) */
+{
+ A |= *(ram + IY + (char) *PC++);
+ (A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ F &= ~(H_FLAG | N_FLAG | C_FLAG);
+ return(19);
+}
+
+static int op_cpyd(void) /* CP (IY+d) */
+{
+ register int i;
+ register BYTE P;
+
+ P = *(ram + IY + (char) *PC++);
+ ((P & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (P > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ i = (char) A - (char) P;
+ (i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(19);
+}
+
+static int op_incyd(void) /* INC (IY+d) */
+{
+ register BYTE *p;
+
+ p = ram + IY + (char) *PC++;
+ ((*p & 0xf) + 1 > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (*p)++;
+ (*p == 128) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F &= ~N_FLAG;
+ return(23);
+}
+
+static int op_decyd(void) /* DEC (IY+d) */
+{
+ register BYTE *p;
+
+ p = ram + IY + (char) *PC++;
+ (((*p - 1) & 0xf) == 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (*p)--;
+ (*p == 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ F |= N_FLAG;
+ return(23);
+}
+
+static int op_addyb(void) /* ADD IY,BC */
+{
+ register int carry;
+ BYTE iyl = IY & 0xff;
+ BYTE iyh = IY >> 8;
+
+ carry = (iyl + C > 255) ? 1 : 0;
+ iyl += C;
+ ((iyh & 0xf) + (B & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (iyh + B + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ iyh += B + carry;
+ IY = (iyh << 8) + iyl;
+ F &= ~N_FLAG;
+ return(15);
+}
+
+static int op_addyd(void) /* ADD IY,DE */
+{
+ register int carry;
+ BYTE iyl = IY & 0xff;
+ BYTE iyh = IY >> 8;
+
+ carry = (iyl + E > 255) ? 1 : 0;
+ iyl += E;
+ ((iyh & 0xf) + (D & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (iyh + D + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ iyh += D + carry;
+ IY = (iyh << 8) + iyl;
+ F &= ~N_FLAG;
+ return(15);
+}
+
+static int op_addys(void) /* ADD IY,SP */
+{
+ register int carry;
+ BYTE iyl = IY & 0xff;
+ BYTE iyh = IY >> 8;
+ BYTE spl = (STACK - ram) & 0xff;
+ BYTE sph = (STACK - ram) >> 8;
+
+ carry = (iyl + spl > 255) ? 1 : 0;
+ iyl += spl;
+ ((iyh & 0xf) + (sph & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (iyh + sph + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ iyh += sph + carry;
+ IY = (iyh << 8) + iyl;
+ F &= ~N_FLAG;
+ return(15);
+}
+
+static int op_addyy(void) /* ADD IY,IY */
+{
+ register int carry;
+ BYTE iyl = IY & 0xff;
+ BYTE iyh = IY >> 8;
+
+ carry = (iyl << 1 > 255) ? 1 : 0;
+ iyl <<= 1;
+ ((iyh & 0xf) + (iyh & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
+ (iyh + iyh + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ iyh += iyh + carry;
+ IY = (iyh << 8) + iyl;
+ F &= ~N_FLAG;
+ return(15);
+}
+
+static int op_inciy(void) /* INC IY */
+{
+ IY++;
+ return(10);
+}
+
+static int op_deciy(void) /* DEC IY */
+{
+ IY--;
+ return(10);
+}
+
+static int op_ldayd(void) /* LD A,(IY+d) */
+{
+ A = *(IY + (char) *PC++ + ram);
+ return(19);
+}
+
+static int op_ldbyd(void) /* LD B,(IY+d) */
+{
+ B = *(IY + (char) *PC++ + ram);
+ return(19);
+}
+
+static int op_ldcyd(void) /* LD C,(IY+d) */
+{
+ C = *(IY + (char) *PC++ + ram);
+ return(19);
+}
+
+static int op_lddyd(void) /* LD D,(IY+d) */
+{
+ D = *(IY + (char) *PC++ + ram);
+ return(19);
+}
+
+static int op_ldeyd(void) /* LD E,(IY+d) */
+{
+ E = *(IY + (char) *PC++ + ram);
+ return(19);
+}
+
+static int op_ldhyd(void) /* LD H,(IY+d) */
+{
+ H = *(IY + (char) *PC++ + ram);
+ return(19);
+}
+
+static int op_ldlyd(void) /* LD L,(IY+d) */
+{
+ L = *(IY + (char) *PC++ + ram);
+ return(19);
+}
+
+static int op_ldyda(void) /* LD (IY+d),A */
+{
+ *(IY + (char) *PC++ + ram) = A;
+ return(19);
+}
+
+static int op_ldydb(void) /* LD (IY+d),B */
+{
+ *(IY + (char) *PC++ + ram) = B;
+ return(19);
+}
+
+static int op_ldydc(void) /* LD (IY+d),C */
+{
+ *(IY + (char) *PC++ + ram) = C;
+ return(19);
+}
+
+static int op_ldydd(void) /* LD (IY+d),D */
+{
+ *(IY + (char) *PC++ + ram) = D;
+ return(19);
+}
+
+static int op_ldyde(void) /* LD (IY+d),E */
+{
+ *(IY + (char) *PC++ + ram) = E;
+ return(19);
+}
+
+static int op_ldydh(void) /* LD (IY+d),H */
+{
+ *(IY + (char) *PC++ + ram) = H;
+ return(19);
+}
+
+static int op_ldydl(void) /* LD (IY+d),L */
+{
+ *(IY + (char) *PC++ + ram) = L;
+ return(19);
+}
+
+static int op_ldydn(void) /* LD (IY+d),n */
+{
+ register int d;
+
+ d = (char) *PC++;
+ *(IY + d + ram) = *PC++;
+ return(19);
+}
diff --git a/emu/z80pack-1.9/z80sim/sim5.o b/emu/z80pack-1.9/z80sim/sim5.o
new file mode 100644
index 0000000..2fa3608
Binary files /dev/null and b/emu/z80pack-1.9/z80sim/sim5.o differ
diff --git a/emu/z80pack-1.9/z80sim/sim6.c b/emu/z80pack-1.9/z80sim/sim6.c
new file mode 100644
index 0000000..509b8e5
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/sim6.c
@@ -0,0 +1,617 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-JAN-89 Release 1.1
+ * 08-FEB-89 Release 1.2
+ * 13-MAR-89 Release 1.3
+ * 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
+ * 20-DEC-90 Release 1.5 Ported to COHERENT 3.0
+ * 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
+ * and some optimization
+ * 25-JUN-92 Release 1.7 comments in english
+ * 07-OCT-06 Release 1.8 modified to compile on modern POSIX OS's
+ */
+
+/*
+ * Like the function "cpu()" this one emulates 4 byte opcodes
+ * starting with 0xdd 0xcb
+ */
+
+#include "sim.h"
+#include "simglb.h"
+
+static int trap_ddcb(void);
+static int op_tb0ixd(int), op_tb1ixd(int), op_tb2ixd(int), op_tb3ixd(int);
+static int op_tb4ixd(int), op_tb5ixd(int), op_tb6ixd(int), op_tb7ixd(int);
+static int op_rb0ixd(int), op_rb1ixd(int), op_rb2ixd(int), op_rb3ixd(int);
+static int op_rb4ixd(int), op_rb5ixd(int), op_rb6ixd(int), op_rb7ixd(int);
+static int op_sb0ixd(int), op_sb1ixd(int), op_sb2ixd(int), op_sb3ixd(int);
+static int op_sb4ixd(int), op_sb5ixd(int), op_sb6ixd(int), op_sb7ixd(int);
+static int op_rlcixd(int), op_rrcixd(int), op_rlixd(int), op_rrixd(int);
+static int op_slaixd(int), op_sraixd(int), op_srlixd(int);
+
+int op_ddcb_handel(void)
+{
+ static int (*op_ddcb[256]) () = {
+ trap_ddcb, /* 0x00 */
+ trap_ddcb, /* 0x01 */
+ trap_ddcb, /* 0x02 */
+ trap_ddcb, /* 0x03 */
+ trap_ddcb, /* 0x04 */
+ trap_ddcb, /* 0x05 */
+ op_rlcixd, /* 0x06 */
+ trap_ddcb, /* 0x07 */
+ trap_ddcb, /* 0x08 */
+ trap_ddcb, /* 0x09 */
+ trap_ddcb, /* 0x0a */
+ trap_ddcb, /* 0x0b */
+ trap_ddcb, /* 0x0c */
+ trap_ddcb, /* 0x0d */
+ op_rrcixd, /* 0x0e */
+ trap_ddcb, /* 0x0f */
+ trap_ddcb, /* 0x10 */
+ trap_ddcb, /* 0x11 */
+ trap_ddcb, /* 0x12 */
+ trap_ddcb, /* 0x13 */
+ trap_ddcb, /* 0x14 */
+ trap_ddcb, /* 0x15 */
+ op_rlixd, /* 0x16 */
+ trap_ddcb, /* 0x17 */
+ trap_ddcb, /* 0x18 */
+ trap_ddcb, /* 0x19 */
+ trap_ddcb, /* 0x1a */
+ trap_ddcb, /* 0x1b */
+ trap_ddcb, /* 0x1c */
+ trap_ddcb, /* 0x1d */
+ op_rrixd, /* 0x1e */
+ trap_ddcb, /* 0x1f */
+ trap_ddcb, /* 0x20 */
+ trap_ddcb, /* 0x21 */
+ trap_ddcb, /* 0x22 */
+ trap_ddcb, /* 0x23 */
+ trap_ddcb, /* 0x24 */
+ trap_ddcb, /* 0x25 */
+ op_slaixd, /* 0x26 */
+ trap_ddcb, /* 0x27 */
+ trap_ddcb, /* 0x28 */
+ trap_ddcb, /* 0x29 */
+ trap_ddcb, /* 0x2a */
+ trap_ddcb, /* 0x2b */
+ trap_ddcb, /* 0x2c */
+ trap_ddcb, /* 0x2d */
+ op_sraixd, /* 0x2e */
+ trap_ddcb, /* 0x2f */
+ trap_ddcb, /* 0x30 */
+ trap_ddcb, /* 0x31 */
+ trap_ddcb, /* 0x32 */
+ trap_ddcb, /* 0x33 */
+ trap_ddcb, /* 0x34 */
+ trap_ddcb, /* 0x35 */
+ trap_ddcb, /* 0x36 */
+ trap_ddcb, /* 0x37 */
+ trap_ddcb, /* 0x38 */
+ trap_ddcb, /* 0x39 */
+ trap_ddcb, /* 0x3a */
+ trap_ddcb, /* 0x3b */
+ trap_ddcb, /* 0x3c */
+ trap_ddcb, /* 0x3d */
+ op_srlixd, /* 0x3e */
+ trap_ddcb, /* 0x3f */
+ trap_ddcb, /* 0x40 */
+ trap_ddcb, /* 0x41 */
+ trap_ddcb, /* 0x42 */
+ trap_ddcb, /* 0x43 */
+ trap_ddcb, /* 0x44 */
+ trap_ddcb, /* 0x45 */
+ op_tb0ixd, /* 0x46 */
+ trap_ddcb, /* 0x47 */
+ trap_ddcb, /* 0x48 */
+ trap_ddcb, /* 0x49 */
+ trap_ddcb, /* 0x4a */
+ trap_ddcb, /* 0x4b */
+ trap_ddcb, /* 0x4c */
+ trap_ddcb, /* 0x4d */
+ op_tb1ixd, /* 0x4e */
+ trap_ddcb, /* 0x4f */
+ trap_ddcb, /* 0x50 */
+ trap_ddcb, /* 0x51 */
+ trap_ddcb, /* 0x52 */
+ trap_ddcb, /* 0x53 */
+ trap_ddcb, /* 0x54 */
+ trap_ddcb, /* 0x55 */
+ op_tb2ixd, /* 0x56 */
+ trap_ddcb, /* 0x57 */
+ trap_ddcb, /* 0x58 */
+ trap_ddcb, /* 0x59 */
+ trap_ddcb, /* 0x5a */
+ trap_ddcb, /* 0x5b */
+ trap_ddcb, /* 0x5c */
+ trap_ddcb, /* 0x5d */
+ op_tb3ixd, /* 0x5e */
+ trap_ddcb, /* 0x5f */
+ trap_ddcb, /* 0x60 */
+ trap_ddcb, /* 0x61 */
+ trap_ddcb, /* 0x62 */
+ trap_ddcb, /* 0x63 */
+ trap_ddcb, /* 0x64 */
+ trap_ddcb, /* 0x65 */
+ op_tb4ixd, /* 0x66 */
+ trap_ddcb, /* 0x67 */
+ trap_ddcb, /* 0x68 */
+ trap_ddcb, /* 0x69 */
+ trap_ddcb, /* 0x6a */
+ trap_ddcb, /* 0x6b */
+ trap_ddcb, /* 0x6c */
+ trap_ddcb, /* 0x6d */
+ op_tb5ixd, /* 0x6e */
+ trap_ddcb, /* 0x6f */
+ trap_ddcb, /* 0x70 */
+ trap_ddcb, /* 0x71 */
+ trap_ddcb, /* 0x72 */
+ trap_ddcb, /* 0x73 */
+ trap_ddcb, /* 0x74 */
+ trap_ddcb, /* 0x75 */
+ op_tb6ixd, /* 0x76 */
+ trap_ddcb, /* 0x77 */
+ trap_ddcb, /* 0x78 */
+ trap_ddcb, /* 0x79 */
+ trap_ddcb, /* 0x7a */
+ trap_ddcb, /* 0x7b */
+ trap_ddcb, /* 0x7c */
+ trap_ddcb, /* 0x7d */
+ op_tb7ixd, /* 0x7e */
+ trap_ddcb, /* 0x7f */
+ trap_ddcb, /* 0x80 */
+ trap_ddcb, /* 0x81 */
+ trap_ddcb, /* 0x82 */
+ trap_ddcb, /* 0x83 */
+ trap_ddcb, /* 0x84 */
+ trap_ddcb, /* 0x85 */
+ op_rb0ixd, /* 0x86 */
+ trap_ddcb, /* 0x87 */
+ trap_ddcb, /* 0x88 */
+ trap_ddcb, /* 0x89 */
+ trap_ddcb, /* 0x8a */
+ trap_ddcb, /* 0x8b */
+ trap_ddcb, /* 0x8c */
+ trap_ddcb, /* 0x8d */
+ op_rb1ixd, /* 0x8e */
+ trap_ddcb, /* 0x8f */
+ trap_ddcb, /* 0x90 */
+ trap_ddcb, /* 0x91 */
+ trap_ddcb, /* 0x92 */
+ trap_ddcb, /* 0x93 */
+ trap_ddcb, /* 0x94 */
+ trap_ddcb, /* 0x95 */
+ op_rb2ixd, /* 0x96 */
+ trap_ddcb, /* 0x97 */
+ trap_ddcb, /* 0x98 */
+ trap_ddcb, /* 0x99 */
+ trap_ddcb, /* 0x9a */
+ trap_ddcb, /* 0x9b */
+ trap_ddcb, /* 0x9c */
+ trap_ddcb, /* 0x9d */
+ op_rb3ixd, /* 0x9e */
+ trap_ddcb, /* 0x9f */
+ trap_ddcb, /* 0xa0 */
+ trap_ddcb, /* 0xa1 */
+ trap_ddcb, /* 0xa2 */
+ trap_ddcb, /* 0xa3 */
+ trap_ddcb, /* 0xa4 */
+ trap_ddcb, /* 0xa5 */
+ op_rb4ixd, /* 0xa6 */
+ trap_ddcb, /* 0xa7 */
+ trap_ddcb, /* 0xa8 */
+ trap_ddcb, /* 0xa9 */
+ trap_ddcb, /* 0xaa */
+ trap_ddcb, /* 0xab */
+ trap_ddcb, /* 0xac */
+ trap_ddcb, /* 0xad */
+ op_rb5ixd, /* 0xae */
+ trap_ddcb, /* 0xaf */
+ trap_ddcb, /* 0xb0 */
+ trap_ddcb, /* 0xb1 */
+ trap_ddcb, /* 0xb2 */
+ trap_ddcb, /* 0xb3 */
+ trap_ddcb, /* 0xb4 */
+ trap_ddcb, /* 0xb5 */
+ op_rb6ixd, /* 0xb6 */
+ trap_ddcb, /* 0xb7 */
+ trap_ddcb, /* 0xb8 */
+ trap_ddcb, /* 0xb9 */
+ trap_ddcb, /* 0xba */
+ trap_ddcb, /* 0xbb */
+ trap_ddcb, /* 0xbc */
+ trap_ddcb, /* 0xbd */
+ op_rb7ixd, /* 0xbe */
+ trap_ddcb, /* 0xbf */
+ trap_ddcb, /* 0xc0 */
+ trap_ddcb, /* 0xc1 */
+ trap_ddcb, /* 0xc2 */
+ trap_ddcb, /* 0xc3 */
+ trap_ddcb, /* 0xc4 */
+ trap_ddcb, /* 0xc5 */
+ op_sb0ixd, /* 0xc6 */
+ trap_ddcb, /* 0xc7 */
+ trap_ddcb, /* 0xc8 */
+ trap_ddcb, /* 0xc9 */
+ trap_ddcb, /* 0xca */
+ trap_ddcb, /* 0xcb */
+ trap_ddcb, /* 0xcc */
+ trap_ddcb, /* 0xcd */
+ op_sb1ixd, /* 0xce */
+ trap_ddcb, /* 0xcf */
+ trap_ddcb, /* 0xd0 */
+ trap_ddcb, /* 0xd1 */
+ trap_ddcb, /* 0xd2 */
+ trap_ddcb, /* 0xd3 */
+ trap_ddcb, /* 0xd4 */
+ trap_ddcb, /* 0xd5 */
+ op_sb2ixd, /* 0xd6 */
+ trap_ddcb, /* 0xd7 */
+ trap_ddcb, /* 0xd8 */
+ trap_ddcb, /* 0xd9 */
+ trap_ddcb, /* 0xda */
+ trap_ddcb, /* 0xdb */
+ trap_ddcb, /* 0xdc */
+ trap_ddcb, /* 0xdd */
+ op_sb3ixd, /* 0xde */
+ trap_ddcb, /* 0xdf */
+ trap_ddcb, /* 0xe0 */
+ trap_ddcb, /* 0xe1 */
+ trap_ddcb, /* 0xe2 */
+ trap_ddcb, /* 0xe3 */
+ trap_ddcb, /* 0xe4 */
+ trap_ddcb, /* 0xe5 */
+ op_sb4ixd, /* 0xe6 */
+ trap_ddcb, /* 0xe7 */
+ trap_ddcb, /* 0xe8 */
+ trap_ddcb, /* 0xe9 */
+ trap_ddcb, /* 0xea */
+ trap_ddcb, /* 0xeb */
+ trap_ddcb, /* 0xec */
+ trap_ddcb, /* 0xed */
+ op_sb5ixd, /* 0xee */
+ trap_ddcb, /* 0xef */
+ trap_ddcb, /* 0xf0 */
+ trap_ddcb, /* 0xf1 */
+ trap_ddcb, /* 0xf2 */
+ trap_ddcb, /* 0xf3 */
+ trap_ddcb, /* 0xf4 */
+ trap_ddcb, /* 0xf5 */
+ op_sb6ixd, /* 0xf6 */
+ trap_ddcb, /* 0xf7 */
+ trap_ddcb, /* 0xf8 */
+ trap_ddcb, /* 0xf9 */
+ trap_ddcb, /* 0xfa */
+ trap_ddcb, /* 0xfb */
+ trap_ddcb, /* 0xfc */
+ trap_ddcb, /* 0xfd */
+ op_sb7ixd, /* 0xfe */
+ trap_ddcb /* 0xff */
+ };
+
+ register int d;
+ register int t;
+
+ d = (char) *PC++;
+
+#ifdef WANT_PCC
+ if (PC > ram + 65535) /* correct PC overrun */
+ PC = ram;
+#endif
+
+#ifdef WANT_TIM
+ t = (*op_ddcb[*PC++]) (d); /* execute next opcode */
+#else
+ (*op_ddcb[*PC++]) (d);
+#endif
+
+#ifdef WANT_PCC
+ if (PC > ram + 65535) /* again correct PC overrun */
+ PC = ram;
+#endif
+
+ return(t);
+}
+
+/*
+ * This function traps all illegal opcodes following the
+ * initial 0xdd 0xcb of a 4 byte opcode.
+ */
+static int trap_ddcb(void)
+{
+ cpu_error = OPTRAP4;
+ cpu_state = STOPPED;
+ return(0);
+}
+
+static int op_tb0ixd(int data) /* BIT 0,(IX+d) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + IX + data) & 1) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(20);
+}
+
+static int op_tb1ixd(int data) /* BIT 1,(IX+d) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + IX + data) & 2) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(20);
+}
+
+static int op_tb2ixd(int data) /* BIT 2,(IX+d) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + IX + data) & 4) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(20);
+}
+
+static int op_tb3ixd(int data) /* BIT 3,(IX+d) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + IX + data) & 8) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(20);
+}
+
+static int op_tb4ixd(int data) /* BIT 4,(IX+d) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + IX + data) & 16) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(20);
+}
+
+static int op_tb5ixd(int data) /* BIT 5,(IX+d) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + IX + data) & 32) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(20);
+}
+
+static int op_tb6ixd(int data) /* BIT 6,(IX+d) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + IX + data) & 64) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(20);
+}
+
+static int op_tb7ixd(int data) /* BIT 7,(IX+d) */
+{
+ F &= ~N_FLAG;
+ F |= H_FLAG;
+ if (*(ram + IX + data) & 128) {
+ F &= ~(Z_FLAG | P_FLAG);
+ F |= S_FLAG;
+ } else {
+ F |= (Z_FLAG | P_FLAG);
+ F &= ~S_FLAG;
+ }
+ return(20);
+}
+
+static int op_rb0ixd(int data) /* RES 0,(IX+d) */
+{
+ *(ram + IX + data) &= ~1;
+ return(23);
+}
+
+static int op_rb1ixd(int data) /* RES 1,(IX+d) */
+{
+ *(ram + IX + data) &= ~2;
+ return(23);
+}
+
+static int op_rb2ixd(int data) /* RES 2,(IX+d) */
+{
+ *(ram + IX + data) &= ~4;
+ return(23);
+}
+
+static int op_rb3ixd(int data) /* RES 3,(IX+d) */
+{
+ *(ram + IX + data) &= ~8;
+ return(23);
+}
+
+static int op_rb4ixd(int data) /* RES 4,(IX+d) */
+{
+ *(ram + IX + data) &= ~16;
+ return(23);
+}
+
+static int op_rb5ixd(int data) /* RES 5,(IX+d) */
+{
+ *(ram + IX + data) &= ~32;
+ return(23);
+}
+
+static int op_rb6ixd(int data) /* RES 6,(IX+d) */
+{
+ *(ram + IX + data) &= ~64;
+ return(23);
+}
+
+static int op_rb7ixd(int data) /* RES 7,(IX+d) */
+{
+ *(ram + IX + data) &= ~128;
+ return(23);
+}
+
+static int op_sb0ixd(int data) /* SET 0,(IX+d) */
+{
+ *(ram + IX + data) |= 1;
+ return(23);
+}
+
+static int op_sb1ixd(int data) /* SET 1,(IX+d) */
+{
+ *(ram + IX + data) |= 2;
+ return(23);
+}
+
+static int op_sb2ixd(int data) /* SET 2,(IX+d) */
+{
+ *(ram + IX + data) |= 4;
+ return(23);
+}
+
+static int op_sb3ixd(int data) /* SET 3,(IX+d) */
+{
+ *(ram + IX + data) |= 8;
+ return(23);
+}
+
+static int op_sb4ixd(int data) /* SET 4,(IX+d) */
+{
+ *(ram + IX + data) |= 16;
+ return(23);
+}
+
+static int op_sb5ixd(int data) /* SET 5,(IX+d) */
+{
+ *(ram + IX + data) |= 32;
+ return(23);
+}
+
+static int op_sb6ixd(int data) /* SET 6,(IX+d) */
+{
+ *(ram + IX + data) |= 64;
+ return(23);
+}
+
+static int op_sb7ixd(int data) /* SET 7,(IX+d) */
+{
+ *(ram + IX + data) |= 128;
+ return(23);
+}
+
+static int op_rlcixd(int data) /* RLC (IX+d) */
+{
+ register int i;
+ register BYTE *p;
+
+ p = ram + IX + data;
+ i = *p & 128;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ *p <<= 1;
+ if (i) *p |= 1;
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(23);
+}
+
+static int op_rrcixd(int data) /* RRC (IX+d) */
+{
+ register int i;
+ register BYTE *p;
+
+ p = ram + IX + data;
+ i = *p & 1;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ *p >>= 1;
+ if (i) *p |= 128;
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(23);
+}
+
+static int op_rlixd(int data) /* RL (IX+d) */
+{
+ register int old_c_flag;
+ register BYTE *p;
+
+ p = ram + IX + data;
+ old_c_flag = F & C_FLAG;
+ (*p & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ *p <<= 1;
+ if (old_c_flag) *p |= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(23);
+}
+
+static int op_rrixd(int data) /* RR (IX+d) */
+{
+ register int old_c_flag;
+ register BYTE *p;
+
+ old_c_flag = F & C_FLAG;
+ p = ram + IX + data;
+ (*p & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ *p >>= 1;
+ if (old_c_flag) *p |= 128;
+ F &= ~(H_FLAG | N_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(23);
+}
+
+static int op_slaixd(int data) /* SLA (IX+d) */
+{
+ register BYTE *p;
+
+ p = ram + IX + data;
+ (*p & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ *p <<= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(23);
+}
+
+static int op_sraixd(int data) /* SRA (IX+d) */
+{
+ register int i;
+ register BYTE *p;
+
+ p = ram + IX + data;
+ i = *p & 128;
+ (*p & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ *p >>= 1;
+ *p |= i;
+ F &= ~(H_FLAG | N_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(23);
+}
+
+static int op_srlixd(int data) /* SRL (IX+d) */
+{
+ register BYTE *p;
+
+ p = ram + IX + data;
+ (*p & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ *p >>= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(23);
+}
diff --git a/emu/z80pack-1.9/z80sim/sim6.o b/emu/z80pack-1.9/z80sim/sim6.o
new file mode 100644
index 0000000..64db5cc
Binary files /dev/null and b/emu/z80pack-1.9/z80sim/sim6.o differ
diff --git a/emu/z80pack-1.9/z80sim/sim7.c b/emu/z80pack-1.9/z80sim/sim7.c
new file mode 100644
index 0000000..272e8e0
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/sim7.c
@@ -0,0 +1,617 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 28-SEP-87 Development on TARGON/35 with AT&T Unix System V(3.1)
+ * 11-JAN-89 Release 1.1
+ * 08-FEB-89 Release 1.2
+ * 13-MAR-89 Release 1.3
+ * 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
+ * 20-DEC-90 Release 1.5 Ported to COHERENT 3.0
+ * 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
+ * and some optimization
+ * 25-JUN-92 Release 1.7 comments in english
+ * 07-OCT-06 Release 1.8 modified to compile on modern POSIX OS's
+ */
+
+/*
+ * Like the function "cpu()" this one emulates 4 byte opcodes
+ * starting with 0xfd 0xcb
+ */
+
+#include "sim.h"
+#include "simglb.h"
+
+static int trap_fdcb(void);
+static int op_tb0iyd(int), op_tb1iyd(int), op_tb2iyd(int), op_tb3iyd(int);
+static int op_tb4iyd(int), op_tb5iyd(int), op_tb6iyd(int), op_tb7iyd(int);
+static int op_rb0iyd(int), op_rb1iyd(int), op_rb2iyd(int), op_rb3iyd(int);
+static int op_rb4iyd(int), op_rb5iyd(int), op_rb6iyd(int), op_rb7iyd(int);
+static int op_sb0iyd(int), op_sb1iyd(int), op_sb2iyd(int), op_sb3iyd(int);
+static int op_sb4iyd(int), op_sb5iyd(int), op_sb6iyd(int), op_sb7iyd(int);
+static int op_rlciyd(int), op_rrciyd(int), op_rliyd(int), op_rriyd(int);
+static int op_slaiyd(int), op_sraiyd(int), op_srliyd(int);
+
+int op_fdcb_handel(void)
+{
+ static int (*op_fdcb[256]) () = {
+ trap_fdcb, /* 0x00 */
+ trap_fdcb, /* 0x01 */
+ trap_fdcb, /* 0x02 */
+ trap_fdcb, /* 0x03 */
+ trap_fdcb, /* 0x04 */
+ trap_fdcb, /* 0x05 */
+ op_rlciyd, /* 0x06 */
+ trap_fdcb, /* 0x07 */
+ trap_fdcb, /* 0x08 */
+ trap_fdcb, /* 0x09 */
+ trap_fdcb, /* 0x0a */
+ trap_fdcb, /* 0x0b */
+ trap_fdcb, /* 0x0c */
+ trap_fdcb, /* 0x0d */
+ op_rrciyd, /* 0x0e */
+ trap_fdcb, /* 0x0f */
+ trap_fdcb, /* 0x10 */
+ trap_fdcb, /* 0x11 */
+ trap_fdcb, /* 0x12 */
+ trap_fdcb, /* 0x13 */
+ trap_fdcb, /* 0x14 */
+ trap_fdcb, /* 0x15 */
+ op_rliyd, /* 0x16 */
+ trap_fdcb, /* 0x17 */
+ trap_fdcb, /* 0x18 */
+ trap_fdcb, /* 0x19 */
+ trap_fdcb, /* 0x1a */
+ trap_fdcb, /* 0x1b */
+ trap_fdcb, /* 0x1c */
+ trap_fdcb, /* 0x1d */
+ op_rriyd, /* 0x1e */
+ trap_fdcb, /* 0x1f */
+ trap_fdcb, /* 0x20 */
+ trap_fdcb, /* 0x21 */
+ trap_fdcb, /* 0x22 */
+ trap_fdcb, /* 0x23 */
+ trap_fdcb, /* 0x24 */
+ trap_fdcb, /* 0x25 */
+ op_slaiyd, /* 0x26 */
+ trap_fdcb, /* 0x27 */
+ trap_fdcb, /* 0x28 */
+ trap_fdcb, /* 0x29 */
+ trap_fdcb, /* 0x2a */
+ trap_fdcb, /* 0x2b */
+ trap_fdcb, /* 0x2c */
+ trap_fdcb, /* 0x2d */
+ op_sraiyd, /* 0x2e */
+ trap_fdcb, /* 0x2f */
+ trap_fdcb, /* 0x30 */
+ trap_fdcb, /* 0x31 */
+ trap_fdcb, /* 0x32 */
+ trap_fdcb, /* 0x33 */
+ trap_fdcb, /* 0x34 */
+ trap_fdcb, /* 0x35 */
+ trap_fdcb, /* 0x36 */
+ trap_fdcb, /* 0x37 */
+ trap_fdcb, /* 0x38 */
+ trap_fdcb, /* 0x39 */
+ trap_fdcb, /* 0x3a */
+ trap_fdcb, /* 0x3b */
+ trap_fdcb, /* 0x3c */
+ trap_fdcb, /* 0x3d */
+ op_srliyd, /* 0x3e */
+ trap_fdcb, /* 0x3f */
+ trap_fdcb, /* 0x40 */
+ trap_fdcb, /* 0x41 */
+ trap_fdcb, /* 0x42 */
+ trap_fdcb, /* 0x43 */
+ trap_fdcb, /* 0x44 */
+ trap_fdcb, /* 0x45 */
+ op_tb0iyd, /* 0x46 */
+ trap_fdcb, /* 0x47 */
+ trap_fdcb, /* 0x48 */
+ trap_fdcb, /* 0x49 */
+ trap_fdcb, /* 0x4a */
+ trap_fdcb, /* 0x4b */
+ trap_fdcb, /* 0x4c */
+ trap_fdcb, /* 0x4d */
+ op_tb1iyd, /* 0x4e */
+ trap_fdcb, /* 0x4f */
+ trap_fdcb, /* 0x50 */
+ trap_fdcb, /* 0x51 */
+ trap_fdcb, /* 0x52 */
+ trap_fdcb, /* 0x53 */
+ trap_fdcb, /* 0x54 */
+ trap_fdcb, /* 0x55 */
+ op_tb2iyd, /* 0x56 */
+ trap_fdcb, /* 0x57 */
+ trap_fdcb, /* 0x58 */
+ trap_fdcb, /* 0x59 */
+ trap_fdcb, /* 0x5a */
+ trap_fdcb, /* 0x5b */
+ trap_fdcb, /* 0x5c */
+ trap_fdcb, /* 0x5d */
+ op_tb3iyd, /* 0x5e */
+ trap_fdcb, /* 0x5f */
+ trap_fdcb, /* 0x60 */
+ trap_fdcb, /* 0x61 */
+ trap_fdcb, /* 0x62 */
+ trap_fdcb, /* 0x63 */
+ trap_fdcb, /* 0x64 */
+ trap_fdcb, /* 0x65 */
+ op_tb4iyd, /* 0x66 */
+ trap_fdcb, /* 0x67 */
+ trap_fdcb, /* 0x68 */
+ trap_fdcb, /* 0x69 */
+ trap_fdcb, /* 0x6a */
+ trap_fdcb, /* 0x6b */
+ trap_fdcb, /* 0x6c */
+ trap_fdcb, /* 0x6d */
+ op_tb5iyd, /* 0x6e */
+ trap_fdcb, /* 0x6f */
+ trap_fdcb, /* 0x70 */
+ trap_fdcb, /* 0x71 */
+ trap_fdcb, /* 0x72 */
+ trap_fdcb, /* 0x73 */
+ trap_fdcb, /* 0x74 */
+ trap_fdcb, /* 0x75 */
+ op_tb6iyd, /* 0x76 */
+ trap_fdcb, /* 0x77 */
+ trap_fdcb, /* 0x78 */
+ trap_fdcb, /* 0x79 */
+ trap_fdcb, /* 0x7a */
+ trap_fdcb, /* 0x7b */
+ trap_fdcb, /* 0x7c */
+ trap_fdcb, /* 0x7d */
+ op_tb7iyd, /* 0x7e */
+ trap_fdcb, /* 0x7f */
+ trap_fdcb, /* 0x80 */
+ trap_fdcb, /* 0x81 */
+ trap_fdcb, /* 0x82 */
+ trap_fdcb, /* 0x83 */
+ trap_fdcb, /* 0x84 */
+ trap_fdcb, /* 0x85 */
+ op_rb0iyd, /* 0x86 */
+ trap_fdcb, /* 0x87 */
+ trap_fdcb, /* 0x88 */
+ trap_fdcb, /* 0x89 */
+ trap_fdcb, /* 0x8a */
+ trap_fdcb, /* 0x8b */
+ trap_fdcb, /* 0x8c */
+ trap_fdcb, /* 0x8d */
+ op_rb1iyd, /* 0x8e */
+ trap_fdcb, /* 0x8f */
+ trap_fdcb, /* 0x90 */
+ trap_fdcb, /* 0x91 */
+ trap_fdcb, /* 0x92 */
+ trap_fdcb, /* 0x93 */
+ trap_fdcb, /* 0x94 */
+ trap_fdcb, /* 0x95 */
+ op_rb2iyd, /* 0x96 */
+ trap_fdcb, /* 0x97 */
+ trap_fdcb, /* 0x98 */
+ trap_fdcb, /* 0x99 */
+ trap_fdcb, /* 0x9a */
+ trap_fdcb, /* 0x9b */
+ trap_fdcb, /* 0x9c */
+ trap_fdcb, /* 0x9d */
+ op_rb3iyd, /* 0x9e */
+ trap_fdcb, /* 0x9f */
+ trap_fdcb, /* 0xa0 */
+ trap_fdcb, /* 0xa1 */
+ trap_fdcb, /* 0xa2 */
+ trap_fdcb, /* 0xa3 */
+ trap_fdcb, /* 0xa4 */
+ trap_fdcb, /* 0xa5 */
+ op_rb4iyd, /* 0xa6 */
+ trap_fdcb, /* 0xa7 */
+ trap_fdcb, /* 0xa8 */
+ trap_fdcb, /* 0xa9 */
+ trap_fdcb, /* 0xaa */
+ trap_fdcb, /* 0xab */
+ trap_fdcb, /* 0xac */
+ trap_fdcb, /* 0xad */
+ op_rb5iyd, /* 0xae */
+ trap_fdcb, /* 0xaf */
+ trap_fdcb, /* 0xb0 */
+ trap_fdcb, /* 0xb1 */
+ trap_fdcb, /* 0xb2 */
+ trap_fdcb, /* 0xb3 */
+ trap_fdcb, /* 0xb4 */
+ trap_fdcb, /* 0xb5 */
+ op_rb6iyd, /* 0xb6 */
+ trap_fdcb, /* 0xb7 */
+ trap_fdcb, /* 0xb8 */
+ trap_fdcb, /* 0xb9 */
+ trap_fdcb, /* 0xba */
+ trap_fdcb, /* 0xbb */
+ trap_fdcb, /* 0xbc */
+ trap_fdcb, /* 0xbd */
+ op_rb7iyd, /* 0xbe */
+ trap_fdcb, /* 0xbf */
+ trap_fdcb, /* 0xc0 */
+ trap_fdcb, /* 0xc1 */
+ trap_fdcb, /* 0xc2 */
+ trap_fdcb, /* 0xc3 */
+ trap_fdcb, /* 0xc4 */
+ trap_fdcb, /* 0xc5 */
+ op_sb0iyd, /* 0xc6 */
+ trap_fdcb, /* 0xc7 */
+ trap_fdcb, /* 0xc8 */
+ trap_fdcb, /* 0xc9 */
+ trap_fdcb, /* 0xca */
+ trap_fdcb, /* 0xcb */
+ trap_fdcb, /* 0xcc */
+ trap_fdcb, /* 0xcd */
+ op_sb1iyd, /* 0xce */
+ trap_fdcb, /* 0xcf */
+ trap_fdcb, /* 0xd0 */
+ trap_fdcb, /* 0xd1 */
+ trap_fdcb, /* 0xd2 */
+ trap_fdcb, /* 0xd3 */
+ trap_fdcb, /* 0xd4 */
+ trap_fdcb, /* 0xd5 */
+ op_sb2iyd, /* 0xd6 */
+ trap_fdcb, /* 0xd7 */
+ trap_fdcb, /* 0xd8 */
+ trap_fdcb, /* 0xd9 */
+ trap_fdcb, /* 0xda */
+ trap_fdcb, /* 0xdb */
+ trap_fdcb, /* 0xdc */
+ trap_fdcb, /* 0xdd */
+ op_sb3iyd, /* 0xde */
+ trap_fdcb, /* 0xdf */
+ trap_fdcb, /* 0xe0 */
+ trap_fdcb, /* 0xe1 */
+ trap_fdcb, /* 0xe2 */
+ trap_fdcb, /* 0xe3 */
+ trap_fdcb, /* 0xe4 */
+ trap_fdcb, /* 0xe5 */
+ op_sb4iyd, /* 0xe6 */
+ trap_fdcb, /* 0xe7 */
+ trap_fdcb, /* 0xe8 */
+ trap_fdcb, /* 0xe9 */
+ trap_fdcb, /* 0xea */
+ trap_fdcb, /* 0xeb */
+ trap_fdcb, /* 0xec */
+ trap_fdcb, /* 0xed */
+ op_sb5iyd, /* 0xee */
+ trap_fdcb, /* 0xef */
+ trap_fdcb, /* 0xf0 */
+ trap_fdcb, /* 0xf1 */
+ trap_fdcb, /* 0xf2 */
+ trap_fdcb, /* 0xf3 */
+ trap_fdcb, /* 0xf4 */
+ trap_fdcb, /* 0xf5 */
+ op_sb6iyd, /* 0xf6 */
+ trap_fdcb, /* 0xf7 */
+ trap_fdcb, /* 0xf8 */
+ trap_fdcb, /* 0xf9 */
+ trap_fdcb, /* 0xfa */
+ trap_fdcb, /* 0xfb */
+ trap_fdcb, /* 0xfc */
+ trap_fdcb, /* 0xfd */
+ op_sb7iyd, /* 0xfe */
+ trap_fdcb /* 0xff */
+ };
+
+ register int d;
+ register int t;
+
+ d = (char) *PC++;
+
+#ifdef WANT_PCC
+ if (PC > ram + 65535) /* correct PC overrun */
+ PC = ram;
+#endif
+
+#ifdef WANT_TIM
+ t = (*op_fdcb[*PC++]) (d); /* execute next opcode */
+#else
+ (*op_fdcb[*PC++]) (d);
+#endif
+
+#ifdef WANT_PCC
+ if (PC > ram + 65535) /* again correct PC overrun */
+ PC = ram;
+#endif
+
+ return(t);
+}
+
+/*
+ * This function traps all illegal opcodes following the
+ * initial 0xfd 0xcb of a 4 byte opcode.
+ */
+static int trap_fdcb(void)
+{
+ cpu_error = OPTRAP4;
+ cpu_state = STOPPED;
+ return(0L);
+}
+
+static int op_tb0iyd(int data) /* BIT 0,(IY+d) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + IY + data) & 1) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(20);
+}
+
+static int op_tb1iyd(int data) /* BIT 1,(IY+d) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + IY + data) & 2) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(20);
+}
+
+static int op_tb2iyd(int data) /* BIT 2,(IY+d) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + IY + data) & 4) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(20);
+}
+
+static int op_tb3iyd(int data) /* BIT 3,(IY+d) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + IY + data) & 8) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(20);
+}
+
+static int op_tb4iyd(int data) /* BIT 4,(IY+d) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + IY + data) & 16) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(20);
+}
+
+static int op_tb5iyd(int data) /* BIT 5,(IY+d) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + IY + data) & 32) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(20);
+}
+
+static int op_tb6iyd(int data) /* BIT 6,(IY+d) */
+{
+ F &= ~(N_FLAG | S_FLAG);
+ F |= H_FLAG;
+ (*(ram + IY + data) & 64) ? (F &= ~(Z_FLAG | P_FLAG))
+ : (F |= (Z_FLAG | P_FLAG));
+ return(20);
+}
+
+static int op_tb7iyd(int data) /* BIT 7,(IY+d) */
+{
+ F &= ~N_FLAG;
+ F |= H_FLAG;
+ if (*(ram + IY + data) & 128) {
+ F &= ~(Z_FLAG | P_FLAG);
+ F |= S_FLAG;
+ } else {
+ F |= (Z_FLAG | P_FLAG);
+ F &= ~S_FLAG;
+ }
+ return(20);
+}
+
+static int op_rb0iyd(int data) /* RES 0,(IY+d) */
+{
+ *(ram + IY + data) &= ~1;
+ return(23);
+}
+
+static int op_rb1iyd(int data) /* RES 1,(IY+d) */
+{
+ *(ram + IY + data) &= ~2;
+ return(23);
+}
+
+static int op_rb2iyd(int data) /* RES 2,(IY+d) */
+{
+ *(ram + IY + data) &= ~4;
+ return(23);
+}
+
+static int op_rb3iyd(int data) /* RES 3,(IY+d) */
+{
+ *(ram + IY + data) &= ~8;
+ return(23);
+}
+
+static int op_rb4iyd(int data) /* RES 4,(IY+d) */
+{
+ *(ram + IY + data) &= ~16;
+ return(23);
+}
+
+static int op_rb5iyd(int data) /* RES 5,(IY+d) */
+{
+ *(ram + IY + data) &= ~32;
+ return(23);
+}
+
+static int op_rb6iyd(int data) /* RES 6,(IY+d) */
+{
+ *(ram + IY + data) &= ~64;
+ return(23);
+}
+
+static int op_rb7iyd(int data) /* RES 7,(IY+d) */
+{
+ *(ram + IY + data) &= ~128;
+ return(23);
+}
+
+static int op_sb0iyd(int data) /* SET 0,(IY+d) */
+{
+ *(ram + IY + data) |= 1;
+ return(23);
+}
+
+static int op_sb1iyd(int data) /* SET 1,(IY+d) */
+{
+ *(ram + IY + data) |= 2;
+ return(23);
+}
+
+static int op_sb2iyd(int data) /* SET 2,(IY+d) */
+{
+ *(ram + IY + data) |= 4;
+ return(23);
+}
+
+static int op_sb3iyd(int data) /* SET 3,(IY+d) */
+{
+ *(ram + IY + data) |= 8;
+ return(23);
+}
+
+static int op_sb4iyd(int data) /* SET 4,(IY+d) */
+{
+ *(ram + IY + data) |= 16;
+ return(23);
+}
+
+static int op_sb5iyd(int data) /* SET 5,(IY+d) */
+{
+ *(ram + IY + data) |= 32;
+ return(23);
+}
+
+static int op_sb6iyd(int data) /* SET 6,(IY+d) */
+{
+ *(ram + IY + data) |= 64;
+ return(23);
+}
+
+static int op_sb7iyd(int data) /* SET 7,(IY+d) */
+{
+ *(ram + IY + data) |= 128;
+ return(23);
+}
+
+static int op_rlciyd(int data) /* RLC (IY+d) */
+{
+ register int i;
+ register BYTE *p;
+
+ p = ram + IY + data;
+ i = *p & 128;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ *p <<= 1;
+ if (i) *p |= 1;
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(23);
+}
+
+static int op_rrciyd(int data) /* RRC (IY+d) */
+{
+ register int i;
+ register BYTE *p;
+
+ p = ram + IY + data;
+ i = *p & 1;
+ (i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ F &= ~(H_FLAG | N_FLAG);
+ *p >>= 1;
+ if (i) *p |= 128;
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(23);
+}
+
+static int op_rliyd(int data) /* RL (IY+d) */
+{
+ register int old_c_flag;
+ register BYTE *p;
+
+ p = ram + IY + data;
+ old_c_flag = F & C_FLAG;
+ (*p & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ *p <<= 1;
+ if (old_c_flag) *p |= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(23);
+}
+
+static int op_rriyd(int data) /* RR (IY+d) */
+{
+ register int old_c_flag;
+ register BYTE *p;
+
+ old_c_flag = F & C_FLAG;
+ p = ram + IY + data;
+ (*p & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ *p >>= 1;
+ if (old_c_flag) *p |= 128;
+ F &= ~(H_FLAG | N_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(23);
+}
+
+static int op_slaiyd(int data) /* SLA (IY+d) */
+{
+ register BYTE *p;
+
+ p = ram + IY + data;
+ (*p & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ *p <<= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(23);
+}
+
+static int op_sraiyd(int data) /* SRA (IY+d) */
+{
+ register int i;
+ register BYTE *p;
+
+ p = ram + IY + data;
+ i = *p & 128;
+ (*p & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ *p >>= 1;
+ *p |= i;
+ F &= ~(H_FLAG | N_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(23);
+}
+
+static int op_srliyd(int data) /* SRL (IY+d) */
+{
+ register BYTE *p;
+
+ p = ram + IY + data;
+ (*p & 1) ? (F |= C_FLAG) : (F &= ~C_FLAG);
+ *p >>= 1;
+ F &= ~(H_FLAG | N_FLAG);
+ (*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
+ (*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
+ (parrity[*p]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
+ return(23);
+}
diff --git a/emu/z80pack-1.9/z80sim/sim7.o b/emu/z80pack-1.9/z80sim/sim7.o
new file mode 100644
index 0000000..6028f12
Binary files /dev/null and b/emu/z80pack-1.9/z80sim/sim7.o differ
diff --git a/emu/z80pack-1.9/z80sim/simctl.c b/emu/z80pack-1.9/z80sim/simctl.c
new file mode 100644
index 0000000..464b799
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/simctl.c
@@ -0,0 +1,1020 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * This modul contains the user interface, a full qualified ICE,
+ * for the Z80-CPU simulation.
+ *
+ * History:
+ * 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-JAN-89 Release 1.1
+ * 08-FEB-89 Release 1.2
+ * 13-MAR-89 Release 1.3
+ * 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
+ * 20-DEC-90 Release 1.5 Ported to COHERENT 3.0
+ * 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
+ * and some optimization
+ * 25-JUN-92 Release 1.7 comments in english and ported to COHERENT 4.0
+ * 02-OCT-06 Release 1.8 modified to compile on modern POSIX OS's
+ */
+
+/*
+ * This modul is an ICE type user interface to debug Z80 programs
+ * on a host system.
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include "sim.h"
+#include "simglb.h"
+
+extern void cpu(void);
+extern void disass(unsigned char **, int);
+extern int exatoi(char *);
+extern int getkey(void);
+extern void int_on(void), int_off(void);
+
+static void do_step(void);
+static void do_trace(char *);
+static void do_go(char *);
+static int handel_break(void);
+static void do_dump(char *);
+static void do_list(char *);
+static void do_modify(char *);
+static void do_fill(char *);
+static void do_move(char *);
+static void do_port(char *);
+static void do_reg(char *);
+static void print_head(void);
+static void print_reg(void);
+static void do_break(char *);
+static void do_hist(char *);
+static void do_count(char *);
+static void do_clock(void);
+static void timeout(int);
+static void do_show(void);
+static int do_getfile(char *);
+static int load_mos(int, char *);
+static void do_unix(char *);
+static void do_help(void);
+static void cpu_err_msg(void);
+
+struct termios old_term;
+
+/*
+ * The function "mon()" is the dialog user interface, called
+ * from the simulation just after program start.
+ */
+void mon(void)
+{
+ register int eoj = 1;
+ static char cmd[LENCMD];
+
+ tcgetattr(0, &old_term);
+
+ if (x_flag) {
+ if (do_getfile(xfn) == 0)
+ do_go("");
+ }
+ while (eoj) {
+ next:
+ printf(">>> ");
+ fflush(stdout);
+ if (fgets(cmd, LENCMD, stdin) == NULL) {
+ putchar('\n');
+ goto next;
+ }
+ switch (*cmd) {
+ case '\n':
+ do_step();
+ break;
+ case 't':
+ do_trace(cmd + 1);
+ break;
+ case 'g':
+ do_go(cmd + 1);
+ break;
+ case 'd':
+ do_dump(cmd + 1);
+ break;
+ case 'l':
+ do_list(cmd + 1);
+ break;
+ case 'm':
+ do_modify(cmd + 1);
+ break;
+ case 'f':
+ do_fill(cmd + 1);
+ break;
+ case 'v':
+ do_move(cmd + 1);
+ break;
+ case 'x':
+ do_reg(cmd + 1);
+ break;
+ case 'p':
+ do_port(cmd + 1);
+ break;
+ case 'b':
+ do_break(cmd + 1);
+ break;
+ case 'h':
+ do_hist(cmd + 1);
+ break;
+ case 'z':
+ do_count(cmd + 1);
+ break;
+ case 'c':
+ do_clock();
+ break;
+ case 's':
+ do_show();
+ break;
+ case '?':
+ do_help();
+ break;
+ case 'r':
+ do_getfile(cmd + 1);
+ break;
+ case '!':
+ do_unix(cmd + 1);
+ break;
+ case 'q':
+ eoj = 0;
+ break;
+ default:
+ puts("what??");
+ break;
+ }
+ }
+}
+
+/*
+ * Execute a single step
+ */
+static void do_step(void)
+{
+ BYTE *p;
+
+ cpu_state = SINGLE_STEP;
+ cpu_error = NONE;
+ cpu();
+ if (cpu_error == OPHALT)
+ handel_break();
+ cpu_err_msg();
+ print_head();
+ print_reg();
+ p = PC;
+ disass(&p, p - ram);
+}
+
+/*
+ * Execute several steps with trace output
+ */
+static void do_trace(char *s)
+{
+ register int count, i;
+
+ while (isspace(*s))
+ s++;
+ if (*s == '\0')
+ count = 20;
+ else
+ count = atoi(s);
+ cpu_state = SINGLE_STEP;
+ cpu_error = NONE;
+ print_head();
+ print_reg();
+ for (i = 0; i < count; i++) {
+ cpu();
+ print_reg();
+ if (cpu_error) {
+ if (cpu_error == OPHALT) {
+ if (!handel_break()) {
+ break;
+ }
+ } else
+ break;
+ }
+ }
+ cpu_err_msg();
+}
+
+/*
+ * Run the CPU emulation endless
+ */
+static void do_go(char *s)
+{
+ while (isspace(*s))
+ s++;
+ if (isxdigit(*s))
+ PC = ram + exatoi(s);
+ cont:
+ cpu_state = CONTIN_RUN;
+ cpu_error = NONE;
+ cpu();
+ if (cpu_error == OPHALT)
+ if (handel_break())
+ if (!cpu_error)
+ goto cont;
+ cpu_err_msg();
+ print_head();
+ print_reg();
+}
+
+/*
+ * Handling of software breakpoints (HALT opcode):
+ *
+ * Output: 0 breakpoint or other HALT opcode reached (stop)
+ * 1 breakpoint reached, passcounter not reached (continue)
+ */
+static int handel_break(void)
+{
+#ifdef SBSIZE
+ register int i;
+ int break_address;
+
+ for (i = 0; i < SBSIZE; i++) /* search for breakpoint */
+ if (soft[i].sb_adr == PC - ram - 1)
+ goto was_softbreak;
+ return(0);
+ was_softbreak:
+#ifdef HISIZE
+ h_next--; /* correct history */
+ if (h_next < 0)
+ h_next = 0;
+#endif
+ break_address = PC - ram - 1; /* store adr of breakpoint */
+ cpu_error = NONE; /* HALT was a breakpoint */
+ PC--; /* substitute HALT opcode by */
+ *PC = soft[i].sb_oldopc; /* original opcode */
+ cpu_state = SINGLE_STEP; /* and execute it */
+ cpu();
+ *(ram + soft[i].sb_adr) = 0x76; /* restore HALT opcode again */
+ soft[i].sb_passcount++; /* increment passcounter */
+ if (soft[i].sb_passcount != soft[i].sb_pass)
+ return(1); /* pass not reached, continue */
+ printf("Software breakpoint %d reached at %04x\n", i, break_address);
+ soft[i].sb_passcount = 0; /* reset passcounter */
+ return(0); /* pass reached, stop */
+#endif
+}
+
+/*
+ * Memory dump
+ */
+static void do_dump(char *s)
+{
+ register int i, j;
+ BYTE c;
+
+ while (isspace(*s))
+ s++;
+ if (isxdigit(*s))
+ wrk_ram = ram + exatoi(s) - exatoi(s) % 16;
+ printf("Adr ");
+ for (i = 0; i < 16; i++)
+ printf("%02x ", i);
+ puts(" ASCII");
+ for (i = 0; i < 16; i++) {
+ printf("%04x - ", (unsigned int)(wrk_ram - ram));
+ for (j = 0; j < 16; j++) {
+ printf("%02x ", *wrk_ram);
+ wrk_ram++;
+ if (wrk_ram > ram + 65535)
+ wrk_ram = ram;
+ }
+ putchar('\t');
+ for (j = -16; j < 0; j++)
+ printf("%c",((c = *(wrk_ram+j))>=' ' && c<=0x7f) ? c : '.');
+ putchar('\n');
+ }
+}
+
+/*
+ * Disassemble
+ */
+static void do_list(char *s)
+{
+ register int i;
+
+ while (isspace(*s))
+ s++;
+ if (isxdigit(*s))
+ wrk_ram = ram + exatoi(s);
+ for (i = 0; i < 10; i++) {
+ printf("%04x - ", (unsigned int)(wrk_ram - ram));
+ disass(&wrk_ram, wrk_ram - ram);
+ if (wrk_ram > ram + 65535)
+ wrk_ram = ram;
+ }
+}
+
+/*
+ * Memory modify
+ */
+static void do_modify(char *s)
+{
+ static char nv[LENCMD];
+
+ while (isspace(*s))
+ s++;
+ if (isxdigit(*s))
+ wrk_ram = ram + exatoi(s);
+ for (;;) {
+ printf("%04x = %02x : ", (unsigned int)(wrk_ram - ram),
+ *wrk_ram);
+ fgets(nv, sizeof(nv), stdin);
+ if (nv[0] == '\n') {
+ wrk_ram++;
+ if (wrk_ram > ram + 65535)
+ wrk_ram = ram;
+ continue;
+ }
+ if (!isxdigit(nv[0]))
+ break;
+ *wrk_ram++ = exatoi(nv);
+ if (wrk_ram > ram + 65535)
+ wrk_ram = ram;
+ }
+}
+
+/*
+ * Memory fill
+ */
+static void do_fill(char *s)
+{
+ register BYTE *p;
+ register int i;
+ register BYTE val;
+
+ while (isspace(*s))
+ s++;
+ p = ram + exatoi(s);
+ while (*s != ',' && *s != '\0')
+ s++;
+ if (*s) {
+ i = exatoi(++s);
+ } else {
+ puts("count missing");
+ return;
+ }
+ while (*s != ',' && *s != '\0')
+ s++;
+ if (*s) {
+ val = exatoi(++s);
+ } else {
+ puts("value missing");
+ return;
+ }
+ while (i--) {
+ *p++ = val;
+ if (p > ram + 65535)
+ p = ram;
+ }
+}
+
+/*
+ * Memory move
+ */
+static void do_move(char *s)
+{
+ register BYTE *p1, *p2;
+ register int count;
+
+
+ while (isspace(*s))
+ s++;
+ p1 = ram + exatoi(s);
+ while (*s != ',' && *s != '\0')
+ s++;
+ if (*s) {
+ p2 = ram + exatoi(++s);
+ } else {
+ puts("to missing");
+ return;
+ }
+ while (*s != ',' && *s != '\0')
+ s++;
+ if (*s) {
+ count = exatoi(++s);
+ } else {
+ puts("count missing");
+ return;
+ }
+ while (count--) {
+ *p2++ = *p1++;
+ if (p1 > ram + 65535)
+ p1 = ram;
+ if (p2 > ram + 65535)
+ p2 = ram;
+ }
+}
+
+/*
+ * Port modify
+ */
+static void do_port(char *s)
+{
+ register BYTE port;
+ static char nv[LENCMD];
+ extern BYTE io_out(), io_in();
+
+ while (isspace(*s))
+ s++;
+ port = exatoi(s);
+ printf("%02x = %02x : ", port, io_in(port));
+ fgets(nv, sizeof(nv), stdin);
+ if (isxdigit(*nv))
+ io_out(port, (BYTE) exatoi(nv));
+}
+
+/*
+ * Register modify
+ */
+static void do_reg(char *s)
+{
+ static char nv[LENCMD];
+
+ while (isspace(*s))
+ s++;
+ if (*s == '\0') {
+ print_head();
+ print_reg();
+ } else {
+ if (strncmp(s, "bc'", 3) == 0) {
+ printf("BC' = %04x : ", B_ * 256 + C_);
+ fgets(nv, sizeof(nv), stdin);
+ B_ = (exatoi(nv) & 0xffff) / 256;
+ C_ = (exatoi(nv) & 0xffff) % 256;
+ } else if (strncmp(s, "de'", 3) == 0) {
+ printf("DE' = %04x : ", D_ * 256 + E_);
+ fgets(nv, sizeof(nv), stdin);
+ D_ = (exatoi(nv) & 0xffff) / 256;
+ E_ = (exatoi(nv) & 0xffff) % 256;
+ } else if (strncmp(s, "hl'", 3) == 0) {
+ printf("HL' = %04x : ", H_ * 256 + L_);
+ fgets(nv, sizeof(nv), stdin);
+ H_ = (exatoi(nv) & 0xffff) / 256;
+ L_ = (exatoi(nv) & 0xffff) % 256;
+ } else if (strncmp(s, "pc", 2) == 0) {
+ printf("PC = %04x : ", (unsigned int)(PC - ram));
+ fgets(nv, sizeof(nv), stdin);
+ PC = ram + (exatoi(nv) & 0xffff);
+ } else if (strncmp(s, "bc", 2) == 0) {
+ printf("BC = %04x : ", B * 256 + C);
+ fgets(nv, sizeof(nv), stdin);
+ B = (exatoi(nv) & 0xffff) / 256;
+ C = (exatoi(nv) & 0xffff) % 256;
+ } else if (strncmp(s, "de", 2) == 0) {
+ printf("DE = %04x : ", D * 256 + E);
+ fgets(nv, sizeof(nv), stdin);
+ D = (exatoi(nv) & 0xffff) / 256;
+ E = (exatoi(nv) & 0xffff) % 256;
+ } else if (strncmp(s, "hl", 2) == 0) {
+ printf("HL = %04x : ", H * 256 + L);
+ fgets(nv, sizeof(nv), stdin);
+ H = (exatoi(nv) & 0xffff) / 256;
+ L = (exatoi(nv) & 0xffff) % 256;
+ } else if (strncmp(s, "ix", 2) == 0) {
+ printf("IX = %04x : ", IX);
+ fgets(nv, sizeof(nv), stdin);
+ IX = exatoi(nv) & 0xffff;
+ } else if (strncmp(s, "iy", 2) == 0) {
+ printf("IY = %04x : ", IY);
+ fgets(nv, sizeof(nv), stdin);
+ IY = exatoi(nv) & 0xffff;
+ } else if (strncmp(s, "sp", 2) == 0) {
+ printf("SP = %04x : ", (unsigned int)(STACK - ram));
+ fgets(nv, sizeof(nv), stdin);
+ STACK = ram + (exatoi(nv) & 0xffff);
+ } else if (strncmp(s, "fs", 2) == 0) {
+ printf("S-FLAG = %c : ", (F & S_FLAG) ? '1' : '0');
+ fgets(nv, sizeof(nv), stdin);
+ F = (exatoi(nv)) ? (F | S_FLAG) : (F & ~S_FLAG);
+ } else if (strncmp(s, "fz", 2) == 0) {
+ printf("Z-FLAG = %c : ", (F & Z_FLAG) ? '1' : '0');
+ fgets(nv, sizeof(nv), stdin);
+ F = (exatoi(nv)) ? (F | Z_FLAG) : (F & ~Z_FLAG);
+ } else if (strncmp(s, "fh", 2) == 0) {
+ printf("H-FLAG = %c : ", (F & H_FLAG) ? '1' : '0');
+ fgets(nv, sizeof(nv), stdin);
+ F = (exatoi(nv)) ? (F | H_FLAG) : (F & ~H_FLAG);
+ } else if (strncmp(s, "fp", 2) == 0) {
+ printf("P-FLAG = %c : ", (F & P_FLAG) ? '1' : '0');
+ fgets(nv, sizeof(nv), stdin);
+ F = (exatoi(nv)) ? (F | P_FLAG) : (F & ~P_FLAG);
+ } else if (strncmp(s, "fn", 2) == 0) {
+ printf("N-FLAG = %c : ", (F & N_FLAG) ? '1' : '0');
+ fgets(nv, sizeof(nv), stdin);
+ F = (exatoi(nv)) ? (F | N_FLAG) : (F & ~N_FLAG);
+ } else if (strncmp(s, "fc", 2) == 0) {
+ printf("C-FLAG = %c : ", (F & C_FLAG) ? '1' : '0');
+ fgets(nv, sizeof(nv), stdin);
+ F = (exatoi(nv)) ? (F | C_FLAG) : (F & ~C_FLAG);
+ } else if (strncmp(s, "a'", 2) == 0) {
+ printf("A' = %02x : ", A_);
+ fgets(nv, sizeof(nv), stdin);
+ A_ = exatoi(nv) & 0xff;
+ } else if (strncmp(s, "f'", 2) == 0) {
+ printf("F' = %02x : ", F_);
+ fgets(nv, sizeof(nv), stdin);
+ F_ = exatoi(nv) & 0xff;
+ } else if (strncmp(s, "b'", 2) == 0) {
+ printf("B' = %02x : ", B_);
+ fgets(nv, sizeof(nv), stdin);
+ B_ = exatoi(nv) & 0xff;
+ } else if (strncmp(s, "c'", 2) == 0) {
+ printf("C' = %02x : ", C_);
+ fgets(nv, sizeof(nv), stdin);
+ C_ = exatoi(nv) & 0xff;
+ } else if (strncmp(s, "d'", 2) == 0) {
+ printf("D' = %02x : ", D_);
+ fgets(nv, sizeof(nv), stdin);
+ D_ = exatoi(nv) & 0xff;
+ } else if (strncmp(s, "e'", 2) == 0) {
+ printf("E' = %02x : ", E_);
+ fgets(nv, sizeof(nv), stdin);
+ E_ = exatoi(nv) & 0xff;
+ } else if (strncmp(s, "h'", 2) == 0) {
+ printf("H' = %02x : ", H_);
+ fgets(nv, sizeof(nv), stdin);
+ H_ = exatoi(nv) & 0xff;
+ } else if (strncmp(s, "l'", 2) == 0) {
+ printf("L' = %02x : ", L_);
+ fgets(nv, sizeof(nv), stdin);
+ L_ = exatoi(nv) & 0xff;
+ } else if (strncmp(s, "i", 1) == 0) {
+ printf("I = %02x : ", I);
+ fgets(nv, sizeof(nv), stdin);
+ I = exatoi(nv) & 0xff;
+ } else if (strncmp(s, "a", 1) == 0) {
+ printf("A = %02x : ", A);
+ fgets(nv, sizeof(nv), stdin);
+ A = exatoi(nv) & 0xff;
+ } else if (strncmp(s, "f", 1) == 0) {
+ printf("F = %02x : ", F);
+ fgets(nv, sizeof(nv), stdin);
+ F = exatoi(nv) & 0xff;
+ } else if (strncmp(s, "b", 1) == 0) {
+ printf("B = %02x : ", B);
+ fgets(nv, sizeof(nv), stdin);
+ B = exatoi(nv) & 0xff;
+ } else if (strncmp(s, "c", 1) == 0) {
+ printf("C = %02x : ", C);
+ fgets(nv, sizeof(nv), stdin);
+ C = exatoi(nv) & 0xff;
+ } else if (strncmp(s, "d", 1) == 0) {
+ printf("D = %02x : ", D);
+ fgets(nv, sizeof(nv), stdin);
+ D = exatoi(nv) & 0xff;
+ } else if (strncmp(s, "e", 1) == 0) {
+ printf("E = %02x : ", E);
+ fgets(nv, sizeof(nv), stdin);
+ E = exatoi(nv) & 0xff;
+ } else if (strncmp(s, "h", 1) == 0) {
+ printf("H = %02x : ", H);
+ fgets(nv, sizeof(nv), stdin);
+ H = exatoi(nv) & 0xff;
+ } else if (strncmp(s, "l", 1) == 0) {
+ printf("L = %02x : ", L);
+ fgets(nv, sizeof(nv), stdin);
+ L = exatoi(nv) & 0xff;
+ } else
+ printf("can't change register %s\n", nv);
+ print_head();
+ print_reg();
+ }
+}
+
+/*
+ * Output header for the CPU registers
+ */
+static void print_head(void)
+{
+ printf("\nPC A SZHPNC I IFF BC DE HL A'F' B'C' D'E' H'L' IX IY SP\n");
+}
+
+/*
+ * Output all CPU registers
+ */
+static void print_reg(void)
+{
+ printf("%04x %02x ", (unsigned int)(PC - ram), A);
+ printf("%c", F & S_FLAG ? '1' : '0');
+ printf("%c", F & Z_FLAG ? '1' : '0');
+ printf("%c", F & H_FLAG ? '1' : '0');
+ printf("%c", F & P_FLAG ? '1' : '0');
+ printf("%c", F & N_FLAG ? '1' : '0');
+ printf("%c", F & C_FLAG ? '1' : '0');
+ printf(" %02x ", I);
+ printf("%c", IFF & 1 ? '1' : '0');
+ printf("%c", IFF & 2 ? '1' : '0');
+ printf(" %02x%02x %02x%02x %02x%02x %02x%02x %02x%02x %02x%02x %02x%02x %04x %04x %04x\n",
+ B, C, D, E, H, L, A_, F_, B_, C_, D_, E_, H_, L_, IX, IY,
+ (unsigned int)(STACK - ram));
+}
+
+/*
+ * Software breakpoints
+ */
+static void do_break(char *s)
+{
+#ifndef SBSIZE
+ puts("Sorry, no breakpoints available");
+ puts("Please recompile with SBSIZE defined in sim.h");
+#else
+ register int i;
+
+ if (!break_flag) {
+ puts("Can't use softbreaks with -h option.");
+ return;
+ }
+ if (*s == '\n') {
+ puts("No Addr Pass Counter");
+ for (i = 0; i < SBSIZE; i++)
+ if (soft[i].sb_pass)
+ printf("%02d %04x %05d %05d\n", i,
+ soft[i].sb_adr,soft[i].sb_pass,soft[i].sb_passcount);
+ return;
+ }
+ if (isxdigit(*s)) {
+ i = atoi(s++);
+ if (i >= SBSIZE) {
+ printf("breakpoint %d not available\n", i);
+ return;
+ }
+ } else {
+ i = sb_next++;
+ if (sb_next == SBSIZE)
+ sb_next = 0;
+ }
+ while (isspace(*s))
+ s++;
+ if (*s == 'c') {
+ *(ram + soft[i].sb_adr) = soft[i].sb_oldopc;
+ memset((char *) &soft[i], 0, sizeof(struct softbreak));
+ return;
+ }
+ if (soft[i].sb_pass)
+ *(ram + soft[i].sb_adr) = soft[i].sb_oldopc;
+ soft[i].sb_adr = exatoi(s);
+ soft[i].sb_oldopc = *(ram + soft[i].sb_adr);
+ *(ram + soft[i].sb_adr) = 0x76;
+ while (!iscntrl(*s) && !ispunct(*s))
+ s++;
+ if (*s != ',')
+ soft[i].sb_pass = 1;
+ else
+ soft[i].sb_pass = exatoi(++s);
+ soft[i].sb_passcount = 0;
+#endif
+}
+
+/*
+ * History
+ */
+static void do_hist(char *s)
+{
+#ifndef HISIZE
+ puts("Sorry, no history available");
+ puts("Please recompile with HISIZE defined in sim.h");
+#else
+ int i, l, b, e, c, sa;
+
+ while (isspace(*s))
+ s++;
+ switch (*s) {
+ case 'c':
+ memset((char *) his, 0, sizeof(struct history) * HISIZE);
+ h_next = 0;
+ h_flag = 0;
+ break;
+ default:
+ if ((h_next == 0) && (h_flag == 0)) {
+ puts("History memory is empty");
+ break;
+ }
+ e = h_next;
+ b = (h_flag) ? h_next + 1 : 0;
+ l = 0;
+ while (isspace(*s))
+ s++;
+ if (*s)
+ sa = exatoi(s);
+ else
+ sa = -1;
+ for (i = b; i != e; i++) {
+ if (i == HISIZE)
+ i = 0;
+ if (sa != -1) {
+ if (his[i].h_adr < sa)
+ continue;
+ else
+ sa = -1;
+ }
+ printf("%04x AF=%04x BC=%04x DE=%04x HL=%04x IX=%04x IY=%04x SP=%04x\n",
+ his[i].h_adr, his[i].h_af, his[i].h_bc,
+ his[i].h_de, his[i].h_hl, his[i].h_ix,
+ his[i].h_iy, his[i].h_sp);
+ l++;
+ if (l == 20) {
+ l = 0;
+ printf("q = quit, else continue: ");
+ c = getkey();
+ putchar('\n');
+ if (toupper(c) == 'Q')
+ break;
+ }
+ }
+ break;
+ }
+#endif
+}
+
+/*
+ * Runtime measurement by counting the executed T states
+ */
+static void do_count(char *s)
+{
+#ifndef WANT_TIM
+ puts("Sorry, no t-state count available");
+ puts("Please recompile with WANT_TIM defined in sim.h");
+#else
+ while (isspace(*s))
+ s++;
+ if (*s == '\0') {
+ puts("start stop status T-states");
+ printf("%04x %04x %s %lu\n",
+ (unsigned int)(t_start - ram),
+ (unsigned int)(t_end - ram),
+ t_flag ? "on ": "off", t_states);
+ } else {
+ t_start = ram + exatoi(s);
+ while (*s != ',' && *s != '\0')
+ s++;
+ if (*s)
+ t_end = ram + exatoi(++s);
+ t_states = 0L;
+ t_flag = 0;
+ }
+#endif
+}
+
+/*
+ * Calculate the clock frequency of the emulated CPU:
+ * into memory locations 0000H to 0002H the following
+ * code will be stored:
+ * LOOP: JP LOOP
+ * It uses 10 T states for each execution. A 3 secound
+ * timer is started and then the CPU. For every opcode
+ * fetch the R register is incremented by one and after
+ * the timer is down and stopps the emulation, the clock
+ * speed of the CPU is calculated with:
+ * f = R / 300000
+ */
+static void do_clock(void)
+{
+ static BYTE save[3];
+
+ save[0] = *(ram + 0x0000); /* save memory locations */
+ save[1] = *(ram + 0x0001); /* 0000H - 0002H */
+ save[2] = *(ram + 0x0002);
+ *(ram + 0x0000) = 0xc3; /* store opcode JP 0000H at address */
+ *(ram + 0x0001) = 0x00; /* 0000H */
+ *(ram + 0x0002) = 0x00;
+ PC = ram + 0x0000; /* set PC to this code */
+ R = 0L; /* clear refresh register */
+ cpu_state = CONTIN_RUN; /* initialize CPU */
+ cpu_error = NONE;
+ signal(SIGALRM, timeout); /* initialize timer interrupt handler */
+ alarm(3); /* start 3 secound timer */
+ cpu(); /* start CPU */
+ *(ram + 0x0000) = save[0]; /* restore memory locations */
+ *(ram + 0x0001) = save[1]; /* 0000H - 0002H */
+ *(ram + 0x0002) = save[2];
+ if (cpu_error == NONE)
+ printf("clock frequency = %5.2f Mhz\n", ((float) R) / 300000.0);
+ else
+ puts("Interrupted by user");
+}
+
+/*
+ * This function is the signal handler for the timer interrupt.
+ * The CPU emulation is stopped here.
+ */
+static void timeout(int sig)
+{
+ cpu_state = STOPPED;
+}
+
+/*
+ * Output informations about compiling options
+ */
+static void do_show(void)
+{
+ register int i;
+
+ printf("Release: %s\n", RELEASE);
+#ifdef HISIZE
+ i = HISIZE;
+#else
+ i = 0;
+#endif
+ printf("No. of entrys in history memory: %d\n", i);
+#ifdef SBSIZE
+ i = SBSIZE;
+#else
+ i = 0;
+#endif
+ printf("No. of software breakpoints: %d\n", i);
+#ifdef WANT_SPC
+ i = 1;
+#else
+ i = 0;
+#endif
+ printf("Stackpointer turn around %schecked\n", i ? "" : "not ");
+#ifdef WANT_PCC
+ i = 1;
+#else
+ i = 0;
+#endif
+ printf("Programcounter turn around %schecked\n", i ? "" : "not ");
+#ifdef WANT_TIM
+ i = 1;
+#else
+ i = 0;
+#endif
+ printf("T-State counting %spossible\n", i ? "" : "im");
+#ifdef CNTL_C
+ i = 1;
+#else
+ i = 0;
+#endif
+ printf("CPU simulation %sstopped on cntl-c\n", i ? "" : "not ");
+#ifdef CNTL_BS
+ i = 1;
+#else
+ i = 0;
+#endif
+ printf("CPU simulation %sstopped on cntl-\\\n", i ? "" : "not ");
+}
+
+/*
+ * Read a file into the memory of the emulated CPU.
+ * The following file formats are supported:
+ *
+ * binary images with Mostek header
+ */
+static int do_getfile(char *s)
+{
+ char fn[LENCMD];
+ BYTE fileb[5];
+ register char *pfn = fn;
+ int fd;
+
+ while (isspace(*s))
+ s++;
+ while (*s != ',' && *s != '\n' && *s != '\0')
+ *pfn++ = *s++;
+ *pfn = '\0';
+ if (strlen(fn) == 0) {
+ puts("no input file given");
+ return(1);
+ }
+ if ((fd = open(fn, O_RDONLY)) == -1) {
+ printf("can't open file %s\n", fn);
+ return(1);
+ }
+ if (*s == ',')
+ wrk_ram = ram + exatoi(++s);
+ else
+ wrk_ram = NULL;
+ read(fd, (char *) fileb, 5); /* read first 5 bytes of file */
+ if (*fileb == (BYTE) 0xff) { /* Mostek header ? */
+ lseek(fd, 0l, 0);
+ return (load_mos(fd, fn));
+ }
+ else {
+ printf("unkown format, can't load file %s\n", fn);
+ close(fd);
+ return(1);
+ }
+}
+
+/*
+ * Loader for binary images with Mostek header.
+ * Format of the first 3 bytes:
+ *
+ * 0xff ll lh
+ *
+ * ll = load address low
+ * lh = load address high
+ */
+static int load_mos(int fd, char *fn)
+{
+ BYTE fileb[3];
+ unsigned count, readed;
+ int rc = 0;
+
+ read(fd, (char *) fileb, 3); /* read load address */
+ if (wrk_ram == NULL) /* and set if not given */
+ wrk_ram = ram + (fileb[2] * 256 + fileb[1]);
+ count = ram + 65535 - wrk_ram;
+ if ((readed = read(fd, (char *) wrk_ram, count)) == count) {
+ puts("Too much to load, stopped at 0xffff");
+ rc = 1;
+ }
+ close(fd);
+ printf("Loader statistics for file %s:\n", fn);
+ printf("START : %04x\n", (unsigned int)(wrk_ram - ram));
+ printf("END : %04x\n", (unsigned int)(wrk_ram - ram + readed - 1));
+ printf("LOADED: %04x\n", readed);
+ PC = wrk_ram;
+ return(rc);
+}
+
+/*
+ * Call system function from simulator
+ */
+static void do_unix(char *s)
+{
+ int_off();
+ system(s);
+ int_on();
+}
+
+/*
+ * Output help text
+ */
+static void do_help(void)
+{
+ puts("r filename[,address] read object into memory");
+ puts("d [address] dump memory");
+ puts("l [address] list memory");
+ puts("m [address] modify memory");
+ puts("f address,count,value fill memory");
+ puts("v from,to,count move memory");
+ puts("p address show/modify port");
+ puts("g [address] run program");
+ puts("t [count] trace program");
+ puts("return single step program");
+ puts("x [register] show/modify register");
+ puts("x f modify flag");
+ puts("b[no] address[,pass] set soft breakpoint");
+ puts("b show soft breakpoints");
+ puts("b[no] c clear soft breakpoint");
+ puts("h [address] show history");
+ puts("h c clear history");
+ puts("z start,stop set trigger adr for t-state count");
+ puts("z show t-state count");
+ puts("c measure clock frequency");
+ puts("s show settings");
+ puts("! command execute UNIX command");
+ puts("q quit");
+}
+
+/*
+ * Error handler after CPU is stopped
+ */
+static void cpu_err_msg(void)
+{
+ switch (cpu_error) {
+ case NONE:
+ break;
+ case OPHALT:
+ printf("HALT Op-Code reached at %04x\n",
+ (unsigned int)(PC - ram - 1));
+ break;
+ case IOTRAP:
+ printf("I/O Trap at %04x\n", (unsigned int)(PC - ram));
+ break;
+ case OPTRAP1:
+ printf("Op-code trap at %04x %02x\n",
+ (unsigned int)(PC - 1 - ram), *(PC-1));
+ break;
+ case OPTRAP2:
+ printf("Op-code trap at %04x %02x %02x\n",
+ (unsigned int)(PC - 2 - ram),
+ *(PC-2), *(PC-1));
+ break;
+ case OPTRAP4:
+ printf("Op-code trap at %04x %02x %02x %02x %02x\n",
+ (unsigned int)(PC - 4 - ram), *(PC-4), *(PC-3),
+ *(PC-2), *(PC-1));
+ break;
+ case USERINT:
+ puts("User Interrupt");
+ break;
+ default:
+ printf("Unknown error %d\n", cpu_error);
+ break;
+ }
+}
diff --git a/emu/z80pack-1.9/z80sim/simctl.o b/emu/z80pack-1.9/z80sim/simctl.o
new file mode 100644
index 0000000..79fa5dd
Binary files /dev/null and b/emu/z80pack-1.9/z80sim/simctl.o differ
diff --git a/emu/z80pack-1.9/z80sim/simfun.c b/emu/z80pack-1.9/z80sim/simfun.c
new file mode 100644
index 0000000..b4e7634
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/simfun.c
@@ -0,0 +1,63 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-JAN-89 Release 1.1
+ * 08-FEB-89 Release 1.2
+ * 13-MAR-89 Release 1.3
+ * 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
+ * 20-DEC-90 Release 1.5 Ported to COHERENT 3.0
+ * 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
+ * and some optimization
+ * 25-JUN-92 Release 1.7 comments in english and ported to COHERENT 4.0
+ * 04-OCT-06 Release 1.8 modified to compile on modern POSIX OS's
+ */
+
+/*
+ * This modul contains some commonly used functions
+ */
+
+#include
+#include
+#include
+#include
+#include "sim.h"
+
+/*
+ * atoi for hexadecimal numbers
+ */
+int exatoi(char *str)
+{
+ register int num = 0;
+
+ while (isxdigit(*str)) {
+ num *= 16;
+ if (*str <= '9')
+ num += *str - '0';
+ else
+ num += toupper(*str) - '7';
+ str++;
+ }
+ return(num);
+}
+
+/*
+ * Wait for a single keystroke without echo
+ */
+int getkey(void)
+{
+ register int c;
+ struct termios old_term, new_term;
+
+ tcgetattr(0, &old_term);
+ new_term = old_term;
+ new_term.c_lflag &= ~(ICANON | ECHO);
+ new_term.c_cc[VMIN] = 1;
+ tcsetattr(0, TCSADRAIN, &new_term);
+ c = getchar();
+ tcsetattr(0, TCSADRAIN, &old_term);
+ return(c);
+}
diff --git a/emu/z80pack-1.9/z80sim/simfun.o b/emu/z80pack-1.9/z80sim/simfun.o
new file mode 100644
index 0000000..8d37933
Binary files /dev/null and b/emu/z80pack-1.9/z80sim/simfun.o differ
diff --git a/emu/z80pack-1.9/z80sim/simglb.c b/emu/z80pack-1.9/z80sim/simglb.c
new file mode 100644
index 0000000..6b72897
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/simglb.c
@@ -0,0 +1,184 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-JAN-89 Release 1.1
+ * 08-FEB-89 Release 1.2
+ * 13-MAR-89 Release 1.3
+ * 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
+ * 20-DEC-90 Release 1.5 Ported to COHERENT
+ * 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
+ * and some optimization
+ * 25-JUN-92 Release 1.7 comments in english and ported to COHERENT 4.0
+ * 04-OCT-06 Release 1.8 modified to compile on modern POSIX OS's
+ */
+
+/*
+ * This modul contains all the global variables
+ */
+
+#include "sim.h"
+
+/*
+ * CPU-Register
+ */
+BYTE A,B,C,D,E,H,L; /* Z80 primary registers */
+int F; /* normaly 8-Bit, but int is faster */
+WORD IX, IY;
+BYTE A_,B_,C_,D_,E_,H_,L_; /* Z80 secoundary registers */
+int F_;
+BYTE *PC; /* Z80 programm counter */
+BYTE *STACK; /* Z80 stackpointer */
+BYTE I; /* Z80 interrupt register */
+BYTE IFF; /* Z80 interrupt flags */
+long R; /* Z80 refresh register */
+ /* is normaly a 8 bit register */
+ /* the 32 bits are used to measure the */
+ /* clock frequency */
+
+/*
+ * Variables for memory of the emulated CPU
+ */
+BYTE ram[65536L]; /* 64KB RAM */
+BYTE *wrk_ram; /* workpointer into memory for dump etc. */
+
+/*
+ * Variables for history memory
+ */
+#ifdef HISIZE
+struct history his[HISIZE]; /* memory to hold trace informations */
+int h_next; /* index into trace memory */
+int h_flag; /* flag for trace memory overrun */
+#endif
+
+/*
+ * Variables for breakpoint memory
+ */
+#ifdef SBSIZE
+struct softbreak soft[SBSIZE]; /* memory to hold breakpoint informations */
+int sb_next; /* index into breakpoint memory */
+#endif
+
+/*
+ * Variables for runtime measurement
+ */
+#ifdef WANT_TIM
+long t_states; /* number of counted T states */
+int t_flag; /* flag, 1 = on, 0 = off */
+BYTE *t_start = ram + 65535; /* start address for measurement */
+BYTE *t_end = ram + 65535; /* end address for measurement */
+#endif
+
+/*
+ * Flag to controll operation of simulation
+ */
+int s_flag; /* flag for -s option */
+int l_flag; /* flag for -l option */
+int m_flag; /* flag for -m option */
+int x_flag; /* flag for -x option */
+int i_flag; /* flag for -i option */
+int f_flag; /* flag for -f option */
+char xfn[LENCMD]; /* buffer for filename (option -x) */
+int break_flag = 1; /* 1 = break at HALT, 0 = execute HALT */
+int cpu_state; /* status of CPU emulation */
+int cpu_error; /* error status of CPU emulation */
+int int_type; /* type of interrupt */
+float freq; /* CPU clock in usec */
+int int_mode; /* CPU interrupt mode (IM 0, IM 1, IM 2) */
+int cntl_c; /* flag for cntl-c entered */
+int cntl_bs; /* flag for cntl-\ entered */
+
+/*
+ * Table to get parrity as fast as possible
+ */
+int parrity[256] = {
+ 0 /* 00000000 */, 1 /* 00000001 */, 1 /* 00000010 */,
+ 0 /* 00000011 */, 1 /* 00000100 */, 0 /* 00000101 */,
+ 0 /* 00000110 */, 1 /* 00000111 */, 1 /* 00001000 */,
+ 0 /* 00001001 */, 0 /* 00001010 */, 1 /* 00001011 */,
+ 0 /* 00001100 */, 1 /* 00001101 */, 1 /* 00001110 */,
+ 0 /* 00001111 */, 1 /* 00010000 */, 0 /* 00010001 */,
+ 0 /* 00010010 */, 1 /* 00010011 */, 0 /* 00010100 */,
+ 1 /* 00010101 */, 1 /* 00010110 */, 0 /* 00010111 */,
+ 0 /* 00011000 */, 1 /* 00011001 */, 1 /* 00011010 */,
+ 0 /* 00011011 */, 1 /* 00011100 */, 0 /* 00011101 */,
+ 0 /* 00011110 */, 1 /* 00011111 */, 1 /* 00100000 */,
+ 0 /* 00100001 */, 0 /* 00100010 */, 1 /* 00100011 */,
+ 0 /* 00100100 */, 1 /* 00100101 */, 1 /* 00100110 */,
+ 0 /* 00100111 */, 0 /* 00101000 */, 1 /* 00101001 */,
+ 1 /* 00101010 */, 0 /* 00101011 */, 1 /* 00101100 */,
+ 0 /* 00101101 */, 0 /* 00101110 */, 1 /* 00101111 */,
+ 0 /* 00110000 */, 1 /* 00110001 */, 1 /* 00110010 */,
+ 0 /* 00110011 */, 1 /* 00110100 */, 0 /* 00110101 */,
+ 0 /* 00110110 */, 1 /* 00110111 */, 1 /* 00111000 */,
+ 0 /* 00111001 */, 0 /* 00111010 */, 1 /* 00111011 */,
+ 0 /* 00111100 */, 1 /* 00111101 */, 1 /* 00111110 */,
+ 0 /* 00111111 */, 1 /* 01000000 */, 0 /* 01000001 */,
+ 0 /* 01000010 */, 1 /* 01000011 */, 0 /* 01000100 */,
+ 1 /* 01000101 */, 1 /* 01000110 */, 0 /* 01000111 */,
+ 0 /* 01001000 */, 1 /* 01001001 */, 1 /* 01001010 */,
+ 0 /* 01001011 */, 1 /* 01001100 */, 0 /* 01001101 */,
+ 0 /* 01001110 */, 1 /* 01001111 */, 0 /* 01010000 */,
+ 1 /* 01010001 */, 1 /* 01010010 */, 0 /* 01010011 */,
+ 1 /* 01010100 */, 0 /* 01010101 */, 0 /* 01010110 */,
+ 1 /* 01010111 */, 1 /* 01011000 */, 0 /* 01011001 */,
+ 0 /* 01011010 */, 1 /* 01011011 */, 0 /* 01011100 */,
+ 1 /* 01011101 */, 1 /* 01011110 */, 0 /* 01011111 */,
+ 0 /* 01100000 */, 1 /* 01100001 */, 1 /* 01100010 */,
+ 0 /* 01100011 */, 1 /* 01100100 */, 0 /* 01100101 */,
+ 0 /* 01100110 */, 1 /* 01100111 */, 1 /* 01101000 */,
+ 0 /* 01101001 */, 0 /* 01101010 */, 1 /* 01101011 */,
+ 0 /* 01101100 */, 1 /* 01101101 */, 1 /* 01101110 */,
+ 0 /* 01101111 */, 1 /* 01110000 */, 0 /* 01110001 */,
+ 0 /* 01110010 */, 1 /* 01110011 */, 0 /* 01110100 */,
+ 1 /* 01110101 */, 1 /* 01110110 */, 0 /* 01110111 */,
+ 0 /* 01111000 */, 1 /* 01111001 */, 1 /* 01111010 */,
+ 0 /* 01111011 */, 1 /* 01111100 */, 0 /* 01111101 */,
+ 0 /* 01111110 */, 1 /* 01111111 */,
+ 1 /* 10000000 */, 0 /* 10000001 */, 0 /* 10000010 */,
+ 1 /* 10000011 */, 0 /* 10000100 */, 1 /* 10000101 */,
+ 1 /* 10000110 */, 0 /* 10000111 */, 0 /* 10001000 */,
+ 1 /* 10001001 */, 1 /* 10001010 */, 0 /* 10001011 */,
+ 1 /* 10001100 */, 0 /* 10001101 */, 0 /* 10001110 */,
+ 1 /* 10001111 */, 0 /* 10010000 */, 1 /* 10010001 */,
+ 1 /* 10010010 */, 0 /* 10010011 */, 1 /* 10010100 */,
+ 0 /* 10010101 */, 0 /* 10010110 */, 1 /* 10010111 */,
+ 1 /* 10011000 */, 0 /* 10011001 */, 0 /* 10011010 */,
+ 1 /* 10011011 */, 0 /* 10011100 */, 1 /* 10011101 */,
+ 1 /* 10011110 */, 0 /* 10011111 */, 0 /* 10100000 */,
+ 1 /* 10100001 */, 1 /* 10100010 */, 0 /* 10100011 */,
+ 1 /* 10100100 */, 0 /* 10100101 */, 0 /* 10100110 */,
+ 1 /* 10100111 */, 1 /* 10101000 */, 0 /* 10101001 */,
+ 0 /* 10101010 */, 1 /* 10101011 */, 0 /* 10101100 */,
+ 1 /* 10101101 */, 1 /* 10101110 */, 0 /* 10101111 */,
+ 1 /* 10110000 */, 0 /* 10110001 */, 0 /* 10110010 */,
+ 1 /* 10110011 */, 0 /* 10110100 */, 1 /* 10110101 */,
+ 1 /* 10110110 */, 0 /* 10110111 */, 0 /* 10111000 */,
+ 1 /* 10111001 */, 1 /* 10111010 */, 0 /* 10111011 */,
+ 1 /* 10111100 */, 0 /* 10111101 */, 0 /* 10111110 */,
+ 1 /* 10111111 */, 0 /* 11000000 */, 1 /* 11000001 */,
+ 1 /* 11000010 */, 0 /* 11000011 */, 1 /* 11000100 */,
+ 0 /* 11000101 */, 0 /* 11000110 */, 1 /* 11000111 */,
+ 1 /* 11001000 */, 0 /* 11001001 */, 0 /* 11001010 */,
+ 1 /* 11001011 */, 0 /* 11001100 */, 1 /* 11001101 */,
+ 1 /* 11001110 */, 0 /* 11001111 */, 1 /* 11010000 */,
+ 0 /* 11010001 */, 0 /* 11010010 */, 1 /* 11010011 */,
+ 0 /* 11010100 */, 1 /* 11010101 */, 1 /* 11010110 */,
+ 0 /* 11010111 */, 0 /* 11011000 */, 1 /* 11011001 */,
+ 1 /* 11011010 */, 0 /* 11011011 */, 1 /* 11011100 */,
+ 0 /* 11011101 */, 0 /* 11011110 */, 1 /* 11011111 */,
+ 1 /* 11100000 */, 0 /* 11100001 */, 0 /* 11100010 */,
+ 1 /* 11100011 */, 0 /* 11100100 */, 1 /* 11100101 */,
+ 1 /* 11100110 */, 0 /* 11100111 */, 0 /* 11101000 */,
+ 1 /* 11101001 */, 1 /* 11101010 */, 0 /* 11101011 */,
+ 1 /* 11101100 */, 0 /* 11101101 */, 0 /* 11101110 */,
+ 1 /* 11101111 */, 0 /* 11110000 */, 1 /* 11110001 */,
+ 1 /* 11110010 */, 0 /* 11110011 */, 1 /* 11110100 */,
+ 0 /* 11110101 */, 0 /* 11110110 */, 1 /* 11110111 */,
+ 1 /* 11111000 */, 0 /* 11111001 */, 0 /* 11111010 */,
+ 1 /* 11111011 */, 0 /* 11111100 */, 1 /* 11111101 */,
+ 1 /* 11111110 */, 0 /* 11111111 */
+};
diff --git a/emu/z80pack-1.9/z80sim/simglb.h b/emu/z80pack-1.9/z80sim/simglb.h
new file mode 100644
index 0000000..961cedb
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/simglb.h
@@ -0,0 +1,50 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-JAN-89 Release 1.1
+ * 08-FEB-89 Release 1.2
+ * 13-MAR-89 Release 1.3
+ * 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
+ * 20-DEC-90 Release 1.5 Ported to COHERENT 3.0
+ * 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
+ * and some optimization
+ * 25-JUN-92 Release 1.7 comments in english and ported to COHERENT 4.0
+ * 03-OCT-06 Release 1.8 modified to compile on modern POSIX OS's
+ */
+
+/*
+ * Declaration of variables in simglb.c
+ */
+
+extern BYTE A,B,C,D,E,H,L,A_,B_,C_,D_,E_,H_,L_,*PC,*STACK,I,IFF;
+extern WORD IX,IY;
+extern int F,F_;
+extern long R;
+
+extern BYTE ram[],*wrk_ram;
+
+extern int s_flag,l_flag,m_flag,x_flag,break_flag,i_flag,f_flag,
+ cpu_state, cpu_error,int_type,int_mode,cntl_c,cntl_bs,
+ parrity[],sb_next;
+extern float freq;
+
+extern char xfn[];
+
+#ifdef HISIZE
+extern struct history his[];
+extern int h_next, h_flag;
+#endif
+
+#ifdef SBSIZE
+extern struct softbreak soft[];
+#endif
+
+#ifdef WANT_TIM
+extern long t_states;
+extern int t_flag;
+extern BYTE *t_start, *t_end;
+#endif
diff --git a/emu/z80pack-1.9/z80sim/simglb.o b/emu/z80pack-1.9/z80sim/simglb.o
new file mode 100644
index 0000000..0312074
Binary files /dev/null and b/emu/z80pack-1.9/z80sim/simglb.o differ
diff --git a/emu/z80pack-1.9/z80sim/simint.c b/emu/z80pack-1.9/z80sim/simint.c
new file mode 100644
index 0000000..ce1f3a4
--- /dev/null
+++ b/emu/z80pack-1.9/z80sim/simint.c
@@ -0,0 +1,90 @@
+/*
+ * Z80SIM - a Z80-CPU simulator
+ *
+ * Copyright (C) 1987-2006 by Udo Munk
+ *
+ * History:
+ * 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
+ * 11-JAN-89 Release 1.1
+ * 08-FEB-89 Release 1.2
+ * 13-MAR-89 Release 1.3
+ * 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
+ * 20-DEC-90 Release 1.5 Ported to COHERENT 3.0
+ * 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
+ * and some optimization
+ * 25-JUN-92 Release 1.7 comments in english
+ * 04-OCT-06 Release 1.8 modified to compile on modern POSIX OS's
+ */
+
+/*
+ * This module contain the interrupt handlers for the OS:
+ *
+ * int_on() : initialize interrupt handlers
+ * int_off() : reset interrupts to default
+ * user_int() : handler for user interrupt (CNTL-C)
+ * quit_int() : handler for signal "quit" (CNTL-\)
+ * term_int() : handler for signal SIGTERM when process is killed
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include "sim.h"
+#include "simglb.h"
+
+static void user_int(int), quit_int(int), term_int(int);
+extern void exit_io(void), int_off();
+extern struct termios old_term;
+
+void int_on(void)
+{
+ static struct sigaction newact;
+
+ newact.sa_handler = user_int;
+ sigaction(SIGINT, &newact, NULL);
+ newact.sa_handler = quit_int;
+ sigaction(SIGQUIT, &newact, NULL);
+ newact.sa_handler = term_int;
+ sigaction(SIGTERM, &newact, NULL);
+}
+
+void int_off(void)
+{
+ static struct sigaction newact;
+
+ newact.sa_handler = SIG_DFL;
+ sigaction(SIGINT, &newact, NULL);
+ sigaction(SIGQUIT, &newact, NULL);
+ sigaction(SIGTERM, &newact, NULL);
+}
+
+static void user_int(int sig)
+{
+#ifdef CNTL_C
+ cpu_error = USERINT;
+ cpu_state = STOPPED;
+#else
+ cntl_c++;
+#endif
+}
+
+static void quit_int(int sig)
+{
+#ifdef CNTL_BS
+ cpu_error = USERINT;
+ cpu_state = STOPPED;
+#else
+ cntl_bs++;
+#endif
+}
+
+static void term_int(int sig)
+{
+ exit_io();
+ int_off();
+ tcsetattr(0, TCSADRAIN, &old_term);
+ puts("\nKilled by user");
+ exit(0);
+}
diff --git a/emu/z80pack-1.9/z80sim/simint.o b/emu/z80pack-1.9/z80sim/simint.o
new file mode 100644
index 0000000..cc8037e
Binary files /dev/null and b/emu/z80pack-1.9/z80sim/simint.o differ
diff --git a/emu/z80pack-1.9/z80sim/z80sim b/emu/z80pack-1.9/z80sim/z80sim
new file mode 100755
index 0000000..63ec827
Binary files /dev/null and b/emu/z80pack-1.9/z80sim/z80sim differ
diff --git a/emu/z80pack-1.9/z80src/float.asm b/emu/z80pack-1.9/z80src/float.asm
new file mode 100644
index 0000000..13c2652
--- /dev/null
+++ b/emu/z80pack-1.9/z80src/float.asm
@@ -0,0 +1,837 @@
+;
+; this is a Z80 floating point package from an ancient german computer magazine
+; I'm not going to translate this into english
+; assemble this source with z80asm and run it under z80sim, if everything
+; is working it should print the numbers below
+;
+; *******************************
+; * Fliesskomma-Arithmetik fuer *
+; * den Z80-Mikroprozessor *
+; * (mc 12/88, Seite 100 *
+; *******************************
+
+; ********************************************************
+; * Die folgende Testroutine liefert die Ausgabe:
+; * 40400000
+; * 00700000
+; * 7F800000
+; * 35BFFFFF
+; * 00400000
+; * 7F7FFFFF
+; * 7F800000
+; * 406DB6DB
+; * 15400001
+
+START:
+ LD SP,STACK
+ LD BC,3F80H ; Aufruf der Additionsroutine
+ LD DE,0000H ; mit verschiedenen Parametern
+ PUSH BC ; entspricht 1 + 2
+ PUSH DE
+ LD BC,4000H
+ LD DE,0000H
+ PUSH BC
+ PUSH DE
+ CALL F_ADD
+ CALL HEXOUT ; anschliessend Ausgabe
+
+ LD BC,00F0H ; eine kleine, gerade noch normalisierte
+ LD DE,0000H ; Zahl, dazu die kleinste normalisierte
+ PUSH BC ; Zahl mit negativem Vorzeichen addieren
+ PUSH DE
+ LD BC,8080H
+ LD DE,0000H
+ PUSH BC
+ PUSH DE
+ CALL F_ADD
+ CALL HEXOUT
+
+ LD BC,7F00H ; die Summe dieser beiden Zahlen
+ LD DE,0000H ; ergibt unendlich. Setzt man
+ PUSH BC ; fuer die zweite Zahl den Wert
+ PUSH DE ; 7EFFFFFE, so ist das Ergebnis
+ LD BC,7EFFH ; gerade MAXFLOAT
+ LD DE,0FFFFH
+ PUSH BC
+ PUSH DE
+ CALL F_ADD
+ CALL HEXOUT
+
+ LD BC,0000H ; Multiplikation testen
+ LD DE,0003H ; MAXFLOAT *
+ PUSH BC
+ PUSH DE
+ LD BC,7F7FH
+ LD DE,0FFFFH
+ PUSH BC
+ PUSH DE
+ CALL F_MUL
+ CALL HEXOUT
+
+ LD BC,0080H ; die kleinste normalisierte Zahl
+ LD DE,0000H ; mit 0.5 multiplizieren
+ PUSH BC ; (ergibt eine denormalisierte Zahl)
+ PUSH DE
+ LD BC,3F00H
+ LD DE,0000H
+ PUSH BC
+ PUSH DE
+ CALL F_MUL
+ CALL HEXOUT
+
+ LD BC,4000H ; eine sehr grosse Zahl mit zwei
+ LD DE,0000H ; multiplizieren. Das Ergebnis
+ PUSH BC ; ist genau MAXFLOAT
+ PUSH DE
+ LD BC,7EFFH
+ LD DE,0FFFFH
+ PUSH BC
+ PUSH DE
+ CALL F_MUL
+ CALL HEXOUT
+
+ LD BC,0000H ; Test der Divisionsroutine
+ LD DE,0000H ; hier 1 / 0 (ergibt unendlich)
+ PUSH BC
+ PUSH DE
+ LD BC,3F80H
+ LD DE,0000H
+ PUSH BC
+ PUSH DE
+ CALL F_DIV
+ CALL HEXOUT
+
+ LD BC,40E0H ; jetzt 26 / 7 berechnen
+ LD DE,0000H
+ PUSH BC
+ PUSH DE
+ LD BC,41D0H
+ LD DE,0000H
+ PUSH BC
+ PUSH DE
+ CALL F_DIV
+ CALL HEXOUT
+
+ LD BC,1FFFH ; jetzt eine sehr kleine
+ LD DE,0FFFFH ; denormalisierte Zahl durch
+ PUSH BC ; eine kleine normalisierte
+ PUSH DE ; Zahl dividieren
+ LD BC,0000H
+ LD DE,0003H
+ PUSH BC
+ PUSH DE
+ CALL F_DIV
+ CALL HEXOUT
+
+ HALT ; Ende des Tests
+
+ DEFS 100
+STACK:
+
+; ************************************************
+; * Zahl in BC-DE in 8 Hexadezimalziffern drucken.
+; * Dazu werden nacheinander die Nibble-Paare in
+; * B, C, D und E ausgedruckt.
+; *
+
+HEXOUT:
+ LD A,B ; Nacheinander die einzelnen
+ CALL DIG2 ; Nibble-Paare in A laden
+ LD A,C ; und ausdrucken
+ CALL DIG2
+ LD A,D
+ CALL DIG2
+ LD A,E
+ CALL DIG2
+ LD A,10
+ CALL OUTCHAR
+ LD A,13
+ CALL OUTCHAR
+ RET
+
+DIG2:
+ PUSH AF ; Nibble-Paar ausdrucken
+ RRCA ; unterstes Nibble retten
+ RRCA ; oberes Nibble rechtsbuendig
+ RRCA ; positionieren
+ RRCA
+ AND 00001111B
+ ADD A,90H ; binaer in ASCII (hex)
+ DAA
+ ADC A,40H
+ DAA
+ CALL OUTCHAR ; Zeichen ausgeben
+ POP AF ; jetzt unteres Nibble verarbeiten
+ AND 00001111B ; Nibble maskieren
+ ADD A,90H ; binaer in ASCII (hex)
+ DAA
+ ADC A,40H
+ DAA
+ CALL OUTCHAR
+ RET
+
+OUTCHAR: ; Zeichen auf Console ausgeben
+ OUT (0),A
+ RET
+
+; **********************************
+; * Globale Konstanten-Definitionen
+; * fuer das Fliesskommapaket
+; *
+
+MAXEXPO EQU 255 ; Maximal zulaessiger Exponent
+BIAS EQU 127 ; Bias des Exponenten
+
+; *************************************************
+; * Fliesskomma-Addition in Single-Precision
+; * Parameter: Operand 1 und Operand 2 ueber Stack
+; * Ergebnis: in BC-DE: MSB in B, LSB in E
+; *
+
+; * Es folgen Offset-Definitionen fuer Stack-relativen Zugriff
+
+FHL_ALT EQU 0 ; Top of Stack liegt HL
+FADR EQU 2 ; dann die Ruecksprungadresse
+OP1 EQU 4 ; jetzt Offset-Definitionen fuer
+OP2 EQU 8 ; Parameter-Uebergabe
+
+OPSIZE EQU 4 ; Groesse eines Operanden
+
+F_ADD:
+ PUSH HL ; alten Basepointer retten
+ LD (F_STACK),SP ; aktuellen Stackpointer abspeichern
+ LD HL,(F_STACK) ; und in HL laden (= Basepointer)
+ PUSH AF ; benoetigte Register retten
+ PUSH IX
+ PUSH IY
+ LD BC,OP1 ; jeztz die Zeiger auf die
+ ADD HL,BC ; Operanden initialisieren
+ PUSH HL
+ POP IX ; IX zeigt auf Operand 1
+ LD BC,OPSIZE
+ ADD HL,BC
+ PUSH HL
+ POP IY ; IY zeigt auf Operand 2
+F_ADSUB:
+ ADD HL,BC ; HL zeigt jetzt hinter die Operanden!
+ LD (F_STACK),HL ; diese Adresse fuer's Ende merken
+ LD A,(IX+3) ; Vorzeichen von Operand 1 laden
+ LD E,A ; Ergebnisvorzeichen in E, Bit 7
+ XOR (IY+3) ; mit Vorzeichen von OP2 verknuepfen
+ LD D,A ; Subtraktionsflag in D, Bit 7
+ RES 7,(IX+3) ; Vorzeichen in Mantisse 1 loeschen
+ RES 7,(IY+3) ; Vorzeichen in Mantisse 2 loeschen
+
+; Die Operanden sind jetzt in der Form: 0EEE EEEE EFFF ... FFFF
+
+ LD A,(IX+0) ; Differenz OP1 - OP2 bilden
+ SUB (IY+0)
+ LD A,(IX+1)
+ SBC A,(IY+1)
+ LD A,(IX+2)
+ SBC A,(IY+2)
+ LD A,(IX+3)
+ SBC A,(IY+3)
+ JR NC,FAD_1 ; Sprung falls OP1 groesser als OP2
+ PUSH IX ; ansonsten Operanden vertauschen
+ EX (SP),IY ; (eigentlich nur die Pointer), so
+ POP IX ; dass IY den Kleineren adressiert
+ LD A,E ; Ergebnisvorzeichen neu berechnen
+ XOR D
+ LD E,A
+FAD_1:
+ LD A,(IX+2)
+ LD C,(IX+3) ; Exponent der groesseren Zahl laden
+ SLA A
+ RL C
+ JR Z,AD_DN1
+ SET 7,(IX+2) ; implizite Eins erzeugen
+AD_DN1:
+ LD A,(IY+2)
+ LD B,(IY+3) ; Exponent der kleineren Zahl laden
+ SLA A
+ RL B
+ JR Z,AD_DN2
+ SET 7,(IY+2) ; implizite Eins erzeugen
+AD_DN2:
+ PUSH BC ; Jetzt die Register fuer den
+ PUSH DE ; Blocktransferbefehl retten
+ LD BC,(OPSIZE*2)-1 ; beide Operanden verschieben
+ DEC HL ; HL zeigt auf letztes Byte
+ PUSH HL ; HL nach DE kopieren
+ POP DE
+ DEC HL ; HL zeigt auf vorletztes Byte
+ LDDR ; Verschiebung beider Mantissen
+ POP DE ; um 8 Bit nach links
+ POP BC
+ XOR A
+ LD (IX+0),A ; Form: FFFF ... FFFF 0000 0000
+ LD (IY+0),A
+ LD A,C ; Differenz der Exponenten berechnen
+ SUB B
+ LD B,A ; Differenz nach B fuer Loop-Befehl
+ JR Z,AD_NAP ; falls Null, dann keine Anpassung
+ CP 25 ; mehr als 24? (Abfrage mit Carry
+ JP NC,AD_RND ; erfordert Vergleich mit 25)
+AD_ANP:
+ SRL (IY+3) ; Anpassung der zweiten Mantisse
+ RR (IY+2) ; durch Verschiebung nach rechts
+ RR (IY+1)
+ RR (IY+0)
+ DJNZ AD_ANP ; Loop-Befehl bis B = 0
+AD_NAP:
+ BIT 7,D ; Subtraktion oder Addition?
+ JR NZ,SUBTR ; ggf. zur Subtraktion springen
+ LD A,(IX+0) ; jetzt werden die beiden Mantissen
+ ADD A,(IY+0) ; zueinander addiert
+ LD (IX+0),A
+ LD A,(IX+1)
+ ADC A,(IY+1)
+ LD (IX+1),A
+ LD A,(IX+2)
+ ADC A,(IY+2)
+ LD (IX+2),A
+ LD A,(IX+3)
+ ADC A,(IY+3)
+ LD (IX+3),A
+ JR NC,AD_RND ; kein Ueberlauf --> zum Runden
+ RR (IX+3) ; Ueberlauf einschieben
+ RR (IX+2) ; und Exponent erhoehen
+ RR (IX+1) ; durch die Vorgeschichte ist
+ RR (IX+0) ; gesichert, dass B Null ist; BC
+ INC BC ; enthaelt den 16-Bit-Exponent
+ JR AD_RND ; und zum Runden
+SUBTR:
+ LD A,(IX+0) ; Die beiden Mantissen werden
+ SUB (IY+0) ; voneinander subtrahiert
+ LD (IX+0),A
+ LD A,(IX+1)
+ SBC A,(IY+1)
+ LD (IX+1),A
+ LD A,(IX+2)
+ SBC A,(IY+2)
+ LD (IX+2),A
+ LD A,(IX+3)
+ SBC A,(IY+3)
+ LD (IX+3),A
+ JP M,AD_RND ; bei fuehrender Eins zum Runden
+ JR NZ,AD_NRM ; ungleich Null: Normalisieren
+ CP (IX+2) ; Rest der Mantisse auch Null?
+ JR NZ,AD_NRM
+ CP (IX+1)
+ JR NZ,AD_NRM
+ CP (IX+0)
+ JR Z,AD_ZERO ; alles Null --> Ergebnis ist Null
+AD_NRM:
+ XOR A ; A = 0
+AD_NR1:
+ CP C ; Exponent ist Null?
+ JR NZ,AD_NR2 ; nein, Normierung moeglich
+ CP B ; oberes Byte auch Null?
+ JR Z,AD_RND ; dann ist Ergebnis denormalisiert
+AD_NR2:
+ DEC BC ; Exponent erniedrigen
+ SLA (IX+0) ; Mantisse normalisieren bis
+ RL (IX+1) ; fuehrende Eins auftaucht
+ RL (IX+2)
+ RL (IX+3)
+ JP P,AD_NR1 ; weiter bis fuehrende Eins auftaucht
+AD_RND:
+ LD A,(IX+0) ; jetzt Runden auf Bit hinter
+ ADD A,80H ; Mantisse
+ JR NC,AD_NOV ; kein Uebertrag?
+ INC (IX+1) ; doch, naechstes Mantissenbyte
+ JR NZ,AD_NOV ; behandeln, jetzt auf Null pruefen,
+ INC (IX+2) ; da der INC-Befehl kein Carry liefert
+ JR NZ,AD_NOV
+ INC (IX+3)
+ JR NZ,AD_NOV
+ SCF ; Eins erzeugen
+ RR (IX+3) ; bei Ueberlauf Mantisse durch
+ RR (IX+2) ; Rechtsschieben wieder normalisieren
+ RR (IX+1) ; (nur noch 24 Bit noetig)
+ INC BC ; und Exponent korrigieren
+AD_NOV:
+ XOR A ; A = 0
+ CP (IX+3) ; Mantisse auf Null pruefen
+ JR NZ,AD_NOZ
+ CP (IX+2)
+ JR NZ,AD_NOZ
+ CP (IX+1) ; alle Mantissenbytes Null?
+ JR NZ,AD_NOZ ; dann ist auch das Ergebnis Null
+AD_ZERO: ; Null Ergebnis aufbauen
+ LD B,A
+ LD C,A
+ LD D,A
+ LD E,A
+ JR AD_EXIT ; dann Routine verlassen
+AD_NOZ:
+ CP B ; A ist 0
+ LD A,MAXEXPO ; Exponent oberstes Byte ungleich Null?
+ JR NZ,AD_OVR ; dann ist Ueberlauf eingetreten
+ CP C ; oder genau maxexpo erreicht?
+ JR NZ,AD_NUE ; nein, --> kein Ueberlauf
+AD_OVR:
+ LD C,A ; Exponent auf maxexpo setzen
+ XOR A ; und Mantisse auf Null
+ LD (IX+3),A ; fuer unendlich
+ LD (IX+2),A
+ LD (IX+1),A
+ JR AD_DEN
+AD_NUE:
+ XOR A ; A = 0
+ CP C ; Exponent Null (Zahl denormalisiert)?
+ JR Z,AD_DEN ; ja, -->
+ SLA (IX+1) ; fuehrendes Bit wird nicht gespeichert
+ RL (IX+2) ; daher Mantisse um 1 Bit nach links
+ RL (IX+3)
+AD_DEN:
+ LD B,C ; Ergebnis aufbauen: Exponent in B
+ LD C,(IX+3) ; Mantisse oberstes Byte
+ LD D,(IX+2)
+ SLA E ; Vorzeichen aus E in Carry schieben
+ LD E,(IX+1)
+ RR B ; Vorzeichen in Ergebnis einschieben
+ RR C
+ RR D
+ RR E
+AD_EXIT:
+ POP IY ; Register restaurieren
+ POP IX
+ POP AF
+ POP HL
+ LD (F_HL),HL ; HL zwischenspeichern
+ EX (SP),HL ; alte Ruecksprungadresse in HL
+ LD SP,(F_STACK) ; Stack zuruecksetzen
+ PUSH HL ; Ruecksprungadresse ablegen
+ LD HL,(F_HL) ; HL wieder laden
+ RET ; Ende des Unterprogramms
+
+; *************************************************
+; * Fliesskomma-Subtraktion in Single-Precision
+; * Parameter: Operand 1 und Operand 2 ueber Stack
+; * Ergebnis: in BC-DE: MSB in B, LSB in E
+; *
+
+F_SUB:
+ PUSH HL ; alten Basepointer retten
+ LD (F_STACK),SP ; aktuellen Stackpointer abspeichern
+ LD HL,(F_STACK) ; und in HL laden (= Basepointer)
+ PUSH AF ; benoetigte Register retten
+ PUSH IX
+ PUSH IY
+ LD BC,OP1
+ ADD HL,BC
+ PUSH HL
+ POP IX ; IX zeigt auf Operand 1
+ LD BC,OPSIZE
+ ADD HL,BC
+ PUSH HL
+ POP IY ; IY zeigt auf Operand 2
+ LD A,80H
+ XOR (IY+3) ; Vorzeichenbit von Operand 2 umdrehen
+ LD (IY+3),A ; wieder abspeichern
+ JP F_ADSUB ; jetzt weiter bei Additionsroutine
+
+; *************************************************
+; * Fliesskomma-Multiplikation in Single-Precision
+; * Parameter: Operand 1 und Operand 2 ueber Stack
+; * Ergebnis: in BC-DE: MSB in B, LSB in E
+; *
+
+TEMP EQU -10 ; Offset lokale Variable (6 Byte)
+
+F_MUL:
+ PUSH HL ; alten Basepointer retten
+ LD (F_STACK),SP ; aktuellen Stackpointer abspeichern
+ LD HL,(F_STACK) ; und in HL laden (= Basepointer)
+ PUSH AF ; benoetigte Register retten
+ PUSH IX
+ PUSH IY
+ LD BC,OP1
+ ADD HL,BC
+ PUSH HL
+ EX (SP),IX ; IX zeigt auf Operand 1
+ ; 2 Dummy-Byte auf Stack fuer lokale
+ LD BC,OPSIZE ; Variable bleiben stehen
+ ADD HL,BC
+ PUSH HL
+ EX (SP),IY ; IY zeigt auf Operand 2
+ PUSH HL ; insgesamt 6 Byte fuer lokale Variable
+ ADD HL,BC ; HL zeigt jetzt hinter die Operanden!
+ LD (F_STACK),HL
+ LD A,(IX+3) ; Ergebnisvorzeichen bestimmen
+ XOR (IY+3)
+ LD C,A ; Vorzeichen in C Bit 7 merken
+ LD D,0 ; Exponent 1 laden
+ LD E,(IX+3)
+ LD A,(IX+2) ; Operand um 8 Bit nach links schieben
+ LD (IX+3),A
+ RES 7,(IX+3) ; implizite Null vorbesetzen
+ SLA A ; Exponent unterstes Bit in Carry
+ RL E ; und in E einschieben
+ JR Z,MU_DN1 ; falls Null, dann OP1 denormalisieren
+ SET 7,(IX+3) ; implizite Eins erzeugen
+ DEC DE ; Bias kompensieren
+MU_DN1:
+ LD A,(IX+1) ; jetzt restliche Bytes verschieben
+ LD (IX+2),A
+ LD A,(IX+0)
+ LD (IX+1),A
+ XOR A ; unterste Mantissenbits loeschen
+ LD (IX+0),A ; Form: FFFF ... FFFF 0000 0000
+ LD (IX+TEMP+5),A ; lokale Variable mit Null vorbesetzen
+ LD (IX+TEMP+4),A
+ LD (IX+TEMP+3),A
+ LD (IX+TEMP+2),A
+ LD (IX+TEMP+1),A
+ LD (IX+TEMP+0),A
+ LD H,A ; Exponent 2 in HL aufbauen
+ LD L,(IY+3)
+ LD A,(IY+2)
+ RES 7,(IY+2) ; implizite Null vorbesetzen
+ SLA A
+ RL L
+ JR Z,MU_DN2 ; gleich Null, dann Op2 denormalisieren
+ SET 7,(IY+2) ; implizite Eins erzeugen
+ DEC HL ; Bias kompensieren
+MU_DN2:
+ ADD HL,DE ; Exponenten aufaddieren
+ LD DE,3-BIAS ; Bias-3 subtrahieren
+ ADD HL,DE ; bzw. 3-Bias addieren
+ JP P,MU_NOZ
+ LD A,L ; Exponent kleiner als -24?
+ CP -24
+ JR NC,MU_NOZ
+ JP MU_ZERO ; ja, dann ist das Ergebnis Null
+MU_NOZ:
+ LD B,24 ; Multiplikationsschleifenzaehler
+ LD DE,0 ; Hilfsregister fuer Multiplikand
+MU_MUL:
+ SRL (IX+3) ; Multiplikand nach rechts schieben
+ RR (IX+2)
+ RR (IX+1)
+ RR (IX+0)
+ RR D ; DE als Verlaengerung von Operand 1
+ RR E
+ SLA (IY+0) ; Multiplikator nach links schieben
+ RL (IY+1)
+ RL (IY+2) ; falls fuehrendes Bit Null ist, dann
+ JR NC,MU_NAD ; muss nicht addiert werden
+ LD A,(IX+TEMP+0) ; sonst Multiplikand aufaddieren
+ ADD A,E
+ LD (IX+TEMP+0),A
+ LD A,(IX+TEMP+1)
+ ADC A,D
+ LD (IX+TEMP+1),A
+ LD A,(IX+TEMP+2)
+ ADC A,(IX+0)
+ LD (IX+TEMP+2),A
+ LD A,(IX+TEMP+3)
+ ADC A,(IX+1)
+ LD (IX+TEMP+3),A
+ LD A,(IX+TEMP+4)
+ ADC A,(IX+2)
+ LD (IX+TEMP+4),A
+ LD A,(IX+TEMP+5)
+ ADC A,(IX+3)
+ LD (IX+TEMP+5),A
+MU_NAD:
+ DJNZ MU_MUL ; Schleife durchlaufen
+ LD A,(IX+TEMP+5)
+ OR A ; Flags setzen
+ JP M,MU_RND ; bei fuerender Eins zum Runden
+ JR NZ,MU_NOR ; ungleich Null --> normalisieren
+ CP (IX+TEMP+4)
+ JR NZ,MU_NOR
+ CP (IX+TEMP+3)
+ JR NZ,MU_NOR
+ CP (IX+TEMP+2)
+ JR NZ,MU_NOR
+ JP MU_ZERO ; Mantisse komplett Null --> Null
+MU_NOR:
+ XOR A ; A = 0
+ OR H ; Exponent ist negativ?
+ JP M,MU_UNT ; ggf. Unterlauf behandeln
+MU_NR1:
+ XOR A ; A = 0
+ CP L ; Exponent = Null?
+ JR NZ,MU_NR2
+ CP H ; bei Null zum Runden
+ JR Z,MU_RND
+MU_NR2:
+ DEC HL ; Exponent erniedrigen
+ SLA (IX+TEMP+0)
+ RL (IX+TEMP+1)
+ RL (IX+TEMP+2) ; Mantisse solange nach links
+ RL (IX+TEMP+3) ; verschieben bis fuerende Eins
+ RL (IX+TEMP+4) ; auftaucht
+ RL (IX+TEMP+5)
+ JP P,MU_NR1
+MU_RND:
+ LD A,(IX+TEMP+2) ; jetzt Runden auf Bit hinter
+ ADD A,80H ; Mantisse
+ JR NC,MU_NOV ; kein Uebertrag?
+ INC (IX+TEMP+3) ; doch, naechstes Mantissenbyte
+ JR NZ,MU_NOV ; behandeln, jetzt auf Null pruefen
+ INC (IX+TEMP+4) ; da der INC-Befehl kein Carry liefert
+ JR NZ,MU_NOV
+ INC (IX+TEMP+5)
+ JR NZ,MU_NOV
+ SCF ; Eins erzeugen
+ RR (IX+TEMP+5) ; bei Ueberlauf Mantisse durch
+ RR (IX+TEMP+4) ; Rechtsschieben wieder normalisieren
+ RR (IX+TEMP+3)
+ INC HL ; und Eponent korrigieren
+MU_NOV:
+ XOR A ; A = 0
+ CP H ; Exponent pruefen
+ LD A,MAXEXPO ; A vorbesetzen
+ JR NZ,MU_OVR ; groesser Null: Ueberlauf behandeln
+ CP L ; oder genau maxexpo erreicht?
+ JR NZ,MU_NUE ; nein, kein Ueberlauf
+MU_OVR:
+ LD L,MAXEXPO ; Ueberlauf: Exponent = maxexpo
+ XOR A ; Mantisse = Null
+ LD (IX+TEMP+5),A
+ LD (IX+TEMP+4),A
+ LD (IX+TEMP+3),A
+ JR MU_DEN
+MU_NUE:
+ XOR A ; A = 0
+ CP L ; Exponent ist Null?
+ JR Z,MU_DEN ; ja, Ergebnis ist denormalisiert
+ SLA (IX+TEMP+3) ; nein, fuehrendes Mantissenbit
+ RL (IX+TEMP+4) ; rausschieben
+ RL (IX+TEMP+5)
+MU_DEN:
+ SLA C ; Vorzeichen in Carry schieben
+ LD B,L ; Exponent einsetzen
+ LD C,(IX+TEMP+5)
+ LD D,(IX+TEMP+4)
+ LD E,(IX+TEMP+3)
+ RR B ; und Vorzeichen einschieben
+ RR C
+ RR D ; Form: SEEE EEEE EFFF FFFF ... FFFF
+ RR E
+MU_RES:
+ POP HL ; lokale Variable deallozieren
+ POP HL
+ POP HL
+ POP IY ; Register restaurieren
+ POP IX
+ POP AF
+ POP HL
+ LD (F_HL),HL ; Parameter vom Stack deallozieren
+ EX (SP),HL
+ LD SP,(F_STACK)
+ PUSH HL
+ LD HL,(F_HL)
+ RET ; und return
+MU_ZERO:
+ XOR A ; Ergebnis ist Null
+ LD B,A
+ LD C,A
+ LD D,A
+ LD E,A
+ JR MU_RES
+MU_UNT:
+ LD A,L ; Exponent in A
+ NEG ; negieren fuer Schleifenzaehler
+ CP 24 ; totaler Ueberlauf?
+ JR NC,MU_ZERO ; ja, dann ist Ergebnis Null
+ LD B,A ; in B fuer Loop
+MU_SHR:
+ SRL (IX+TEMP+5) ; Mantisse denormalisieren
+ RR (IX+TEMP+4) ; bis Exponent Null ist
+ RR (IX+TEMP+3)
+ DJNZ MU_SHR
+ LD L,B ; Exponent in Register L = B = 0
+ JP MU_DEN ; denormalisiertes Ergebnis erzeugen
+
+; *************************************************
+; * Fliesskomma-Division in Single-Precision
+; * Parameter: Operand 1 und Operand 2 ueber Stack
+; * Ergebnis: in BC-DE: MSB in B, LSB in E
+; *
+
+F_DIV:
+ PUSH HL ; alten Basepointer retten
+ LD (F_STACK),SP ; aktuellen Stackpointer abspeichern
+ LD HL,(F_STACK) ; und in HL laden (= Basepointer)
+ PUSH AF ; benoetigte Register retten
+ PUSH IX
+ PUSH IY
+ LD BC,OP1
+ ADD HL,BC
+ PUSH HL
+ EX (SP),IX ; IX zeigt auf Operand 1
+ ; 2 Dummy-Byte auf Stack fuer lokale
+ LD BC,OPSIZE ; Variable bleiben stehen
+ ADD HL,BC
+ PUSH HL
+ EX (SP),IY ; IY zeigt auf Operand 2
+ PUSH HL ; insgesamt 6 Byte fuer lokale Variable
+ ADD HL,BC ; HL zeigt jetzt hinter die Operanden!
+ LD (F_STACK),HL
+ LD A,(IX+3) ; Ergebnisvorzeichen bestimmen
+ XOR (IY+3)
+ LD C,A ; Vorzeichen in C Bit 7 merken
+ LD H,0 ; Exponent 1 laden
+ LD L,(IX+3)
+ LD A,(IX+2)
+ RES 7,(IX+2) ; implizite Null vorbesetzen
+ SLA A ; Exponent unterstes Bit in Carry
+ RL L ; und in E einschieben
+ JR Z,DV_DN1 ; falls Null, dann Op1 denormalisieren
+ SET 7,(IX+2) ; implizite Eins erzeugen
+ DEC HL ; Bias kompensieren
+DV_DN1:
+ LD D,0 ; Exponent 2 in DE aufbauen
+ LD E,(IY+3)
+ LD A,(IY+2)
+ LD (IY+3),A ; Mantisse um 8 Bit verschieben
+ RES 7,(IY+3) ; implizite Null vorbesetzen
+ SLA A
+ RL E
+ JR Z,DV_DN2 ; gleich Null, dann Op2 denormalisieren
+ SET 7,(IY+3) ; implizite Eins erzeugen
+ DEC DE ; Bias kompensieren
+DV_DN2:
+ LD A,(IY+1) ; jetzt restliche Bytes verschieben
+ LD (IY+2),A
+ LD A,(IY+0)
+ LD (IY+1),A
+ XOR A ; A = 0
+ LD (IY+0),A ; Form: FFFF ... FFFF 0000 0000
+ SRL (IY+3)
+ RR (IY+2)
+ RR (IY+1)
+ RR (IY+0) ; Form: 0FFF ... FFFF F000 0000
+ JR NZ,DV_NZ1 ; Mantisse 2 auf Null pruefen
+ CP (IY+1)
+ JR NZ,DV_NZ1
+ CP (IY+2)
+ JR NZ,DV_NZ1
+ CP (IY+3)
+ JR NZ,DV_NZ1
+ JP MU_OVR ; Bei Division durch Null: unendlich
+DV_NZ1:
+ XOR A ; Carry-Flag loeschen
+ SBC HL,DE ; Exponenten subtrahieren
+ LD DE,BIAS ; Bias addieren
+ ADD HL,DE
+ BIT 7,H ; Exponent positiv?
+ JR Z,DV_NOZ
+ LD A,L ; Exponent kleiner als -24?
+ JR NC,DV_NOZ
+ JP MU_ZERO ; ja, dann ist das Ergebnis Null
+DV_NOZ:
+ PUSH BC ; Vorzeichen retten
+ LD DE,25 ; Exponent um 25 erhoehen
+ ADD HL,DE ; jetzt ist er sicher groesser als Null
+ XOR A ; A = 0
+ LD B,(IX+2) ; Divident in Register kopieren
+ LD C,(IX+1)
+ LD D,(IX+0)
+ LD E,A ; die untersten Bits sind Null
+ CP D ; ist Dividend Null?
+ JR NZ,DV_NZ2
+ CP C
+ JR NZ,DV_NZ2
+ CP B
+ JR NZ,DV_NZ2
+ POP BC ; Stack bereinigen (Vorzeichen laden)
+ JP MU_ZERO ; und Null als Ergebnis ausgeben
+DV_NZ2:
+ LD (IX+TEMP+5),A ; Ergebnis vorbesetzen
+ LD (IX+TEMP+4),A
+ LD (IX+TEMP+3),A
+ LD (IX+TEMP+2),A
+DV_NLP:
+ BIT 6,(IY+3) ; ist der Divisor normalisiert
+ JR NZ,DV_NOR ; ja, -->
+ INC HL ; nein, Exponent erhoehen
+ SLA (IY+0) ; Divisor verschieben bis in
+ RL (IY+1) ; Form 01FF ...
+ RL (IY+2)
+ RL (IY+3)
+ JR DV_NLP
+DV_NOR:
+ SRL B
+ RR C
+ RR D
+ RR E ; Form: 0FFF ... FFFF F000 0000
+DV_LOP:
+ LD (IX+3),B ; Dividend zwischenspeichern
+ LD (IX+2),C ; die Speicherplaetze von Op1
+ LD (IX+1),D ; stehen zur Verfuegung, da wir OP1
+ LD (IX+0),E ; in die Register BC-DE kopiert haben
+ LD A,E ; jetzt Divisor abziehen
+ SUB (IY+0)
+ LD E,A
+ LD A,D
+ SBC A,(IY+1)
+ LD D,A
+ LD A,C
+ SBC A,(IY+2)
+ LD C,A
+ LD A,B
+ SBC A,(IY+3)
+ LD B,A
+ JR NC,DV_ONE ; kein Carry: Divisor passt
+ LD E,(IX+0) ; zurueckkopieren
+ LD D,(IX+1) ; Carry bleibt dabei erhalten
+ LD C,(IX+2)
+ LD B,(IX+3)
+DV_ONE:
+ CCF ; Carry-Flag umkehren
+ RL (IX+TEMP+2) ; Ergebnis aufbauen
+ RL (IX+TEMP+3)
+ RL (IX+TEMP+4)
+ RL (IX+TEMP+5)
+ SLA E ; Dividend verschieben
+ RL D
+ RL C
+ RL B
+ DEC HL ; Exponent erniedrigen
+ XOR A ; A = 0
+ CP L ; Exponent = Null ?
+ JR NZ,DV_DIV
+ CP H
+ JR Z,DV_DEN ; falls Null, dann denormalisiert
+DV_DIV:
+ BIT 0,(IX+TEMP+5) ; fuerende Eins in Ergebnis-Mantisse?
+ JR Z,DV_LOP ; nein, weiter rechnen
+DV_DEN:
+ LD B,(IX+TEMP+5) ; hoechstes Bit merken
+ LD A,(IX+TEMP+4)
+ LD (IX+TEMP+5),A ; Mantisse in Form
+ LD A,(IX+TEMP+3) ; FFFF ... FFFF 0000 0000
+ LD (IX+TEMP+4),A
+ LD A,(IX+TEMP+2)
+ LD (IX+TEMP+3),A
+ RR B ; hoechstes Bit einschieben
+ RR (IX+TEMP+5)
+ RR (IX+TEMP+4)
+ RR (IX+TEMP+3) ; Form: FFFF ... FFFF F000 0000
+ RR (IX+TEMP+2)
+ POP BC ; Vorzeichen wieder laden
+ XOR A ; A = 0
+ CP (IX+TEMP+5) ; Mantisse ist Null?
+ JR NZ,DV_NZ3
+ CP (IX+TEMP+4)
+ JR NZ,DV_NZ3
+ CP (IX+TEMP+3)
+ JR NZ,DV_NZ3
+ CP (IX+TEMP+2)
+ JP Z,MU_ZERO ; dann ist Ergebnis auch Null
+DV_NZ3:
+ JP MU_RND ; sonst weiter wie bei Multiplikation
+
+F_STACK:
+ DEFS 2 ; Hilfsspeicher fuer Stackpointer
+F_HL:
+ DEFS 2 ; Hilfsspeicher fuer Basepointer HL
+
+ END
diff --git a/emu/z80pack-1.9/z80src/z80dis.asm b/emu/z80pack-1.9/z80src/z80dis.asm
new file mode 100644
index 0000000..03a1217
--- /dev/null
+++ b/emu/z80pack-1.9/z80src/z80dis.asm
@@ -0,0 +1,638 @@
+ TITLE 'Z80-Disassembler'
+
+; Hardware-unabhaengiger, ROM-faehiger Z80-Disassembler
+;
+; Die Adresse, ab der disassembliert serden soll, ist in der
+; 16-Bit Speicherzelle DADR abzulegen. Danach kann eines der
+; Entrys DISSCR (Ausgabe eines Bildschirms) oder DISLIN
+; (Ausgabe einer Zeile) aufgerufen werden. Da die Folgeadressen
+; durch das Programm ebenfalls wieder in der Speicherzelle
+; DADR abgelegt werden, ist mehrfacher Aufruf ohne Laden
+; von neuen Adressen moeglich.
+; Zur Ausgabe muss ein Unterprogramm mit dem Namen PRTSTR
+; erstellt werden, dem in HL die Adresse eines Null-terminierten
+; Strings uebergeben wird.
+;
+; 27-JUN-89 Udo Munk
+
+LPP EQU 15 ; Anzahl Zeilen/Bildschirm Ausgabe
+MNEPOS EQU 11H ; Offset des Mnemonics in Ausgabe-Workspace
+
+ ; Disassembliere einen Bildschirm voll
+DISSCR: LD B,LPP ; einen Bildschirm mit LPP Zeilen
+$DLP1: PUSH BC ; disassemblieren
+ CALL DISLIN
+ POP BC
+ DJNZ $DLP1
+ RET
+
+ ; Disassembliere eine Zeile
+DISLIN: CALL CLWO ; Workspace fuer eine Zeile Ausgabe loeschen
+ LD HL,WRKS ; Adresse der Ausgabe-Workspace -> HL
+ LD DE,(DADR) ; Disassemblier-Adresse -> DE
+ CALL PRBY ; Adresse in DE ausgeben
+ INC HL ; Blank ausgeben
+ LD (PRTMP),HL ; vordere Printposition retten
+ LD C,0 ; Steuerflag loeschen
+ DEC DE ; laufende Adr.-1 -> DE
+$DL13: CALL PRNB ; laufendes Byte ausgeben
+ LD A,(DE) ; laufendes Byte -> A
+ LD B,A ; und in B retten
+ CP 0EDH ; Preafix ED ?
+ JR NZ,$DL14
+ SET 4,C ; ja, ED-Flag setzen
+ JR $DL13 ; und naechstes Byte bearbeiten
+$DL14: CP 0FDH ; Preafix FD ?
+ JR NZ,$DL15
+ SET 6,C ; ja, FD-Flag setzen
+ JR $DL16 ; und Index-Flag setzen
+$DL15: CP 0DDH ; Preafix DD ?
+ JR NZ,$DL17
+$DL16: SET 5,C ; Index-Flag fuer IX/IY-Adressierung setzen
+ LD HL,(PRTMP) ; vordere Printposition -> HL
+ JR $DL13 ; naechstes Byte bearbeiten
+$DL17: LD HL,WRKS+MNEPOS ; HL auf Operator Position setzen
+
+ ; nach Praefix CB
+CB: LD A,B ; Befehlsbyte aus B holen
+ CP 0CBH ; Preafix CB ?
+ JP NZ,OHNE
+ INC DE ; ja, Pointer auf naechstes Byte setzen
+ BIT 5,C ; IX/IY-Flag ?
+ JR Z,$DL18
+ INC DE ; ja, Pointer auf naechstes Byte setzen
+$DL18: LD A,(DE) ; naechstes Byte -> A
+ LD B,A ; und in B retten
+ PUSH DE ; Disassemblieradr. retten
+ LD D,MNETAB > 8 ; High-Byte Operatorentabelle -> D
+ LD E,0E8H ; DE = Pointer auf "SET"
+ CP 0C0H ; SET ?
+ JR NC,$DL19
+ LD E,0E4H ; nein, DE = Pointer auf "RES"
+ CP 80H ; RES ?
+ JR NC,$DL19
+ LD E,0E0H ; nein, DE = Pointer auf "BIT"
+ CP 40H ; BIT ?
+ JR NC,$DL19
+ AND 38H ; loesche Bits 0..2 und 6..7
+ RRCA ; Division durch 2
+ ADD A,CBMTAB & 0FFH ; zur Basis der CB-Mnemonics addieren
+ LD E,A
+ LD D,CBMTAB > 8 ; DE = Pointer auf CB-Mnemonic
+$DL19: CALL TRBY ; Mnemonic ausgeben
+ POP DE ; akt. Disassemblieradr. wieder -> DE
+ LD A,B ; Byte wieder -> A
+ BIT 5,C ; IX/IY-Flag ?
+ JR Z,$DL20
+ DEC DE ; eins zurueck bei IX/IY-Adressierung
+$DL20: DEC DE ; Pointer wieder auf CB-Preafix
+ CP 40H ; CB-Befehl < 40H ?
+ JR C,$DL21
+ AND 38H ; nein, Bits 0..2 und 6..7 loeschen
+ RRCA ; Division durch 8 -> 1. Operanden
+ RRCA
+ RRCA
+ CALL PRO1 ; 1. Operanden ausgeben
+ LD A,B ; Byte wieder -> A
+ SET 7,C ; Komma-Flag setzen
+$DL21: AND 7 ; Bits 3..7 loeschen -> 2. Operanden
+ SET 4,A ; Buchstaben-Flag setzen
+ CALL PRO1 ; 2. Operanden ausgeben
+ CALL PRNB ; Befehlsbyte vorne ausgeben
+ JP INAD ; fertig, Adresse merken und Workspace ausgeben
+
+ ; ohne Preafix CB/ED
+OHNE: PUSH DE ; Disassemblieradr. retten
+ BIT 4,C ; ED-Flag ?
+ JP NZ,ED
+ CP 40H ; nein, < 40H ?
+ JR C,$DL25
+ CP 80H ; nein, > 80H ?
+ JR NC,$DL23
+ LD E,50H ; nein, DE = Pointer auf "LD"
+ CP 76H ; HALT ?
+ JR NZ,$DL22
+ LD E,5CH ; nein, DE = Pointer auf "HALT"
+$DL22: JR $DL26 ; Mnemonic ausgeben
+$DL23: CP 0C0H ; > C0H ?
+ JR NC,$DL24
+ AND 38H ; ja, Bits 0..2 und 6..7 loeschen
+ RRCA ; Division durch 2 -> Operator
+ LD E,A ; Operator -> E
+ JR $DL26 ; Mnemonic ausgeben
+$DL24: SUB 80H ; wenn > C0H, -80 -> Tabellenoperator
+$DL25: LD E,A ; Operator -> E
+ LD D,CODTAB > 8 ; High-Byte Operatortabelle -> D
+ LD A,(DE) ; LSB Mnemonic-Adresse -> A
+ LD E,A ; und nach E
+$DL26: LD D,MNETAB > 8 ; MSB Mnemonic-Adresse -> D
+ CALL TRBY ; Mnemonic ausgeben
+ POP DE ; akt. Disassemblieradr. wieder -> DE
+ LD A,B ; Befehlsbyte wieder -> A
+ PUSH DE ; Disassemblieradr. retten
+ CP 40H ; Byte < 40 ?
+ JR C,$DL30
+ CP 80H ; nein, > 80 ?
+ JR NC,$DL28
+ CP 76H ; nein, HALT ?
+ JR NZ,$DL27
+ LD A,0FFH ; ja, leeren Operanden -> A
+ JR $DL31 ; Operanden ausgeben
+$DL27: AND 38H ; loesche Bits 0..2 und 6..7
+ RRCA ; Division durch 8 -> 1. Operanden
+ RRCA
+ RRCA
+ SET 4,A ; Buchstabenflag setzen
+ JR $DL31 ; Operanden ausgeben
+$DL28: CP 0C0H ; > C0 ?
+ JR NC,$DL29
+ CP 90H ; > 90 ?
+ JR C,$DL51
+ AND 0F8H ; ja, Register-Bits loeschen
+ CP 98H ; "SBC" ?
+ JR Z,$DL51
+ LD A,B ; Byte wieder -> A
+ AND 7 ; nur Register Bits uebrig lassen
+ SET 4,A ; Buchstaben-Flag setzen
+ JR $DL52
+$DL51: LD A,17H ; ja, 17 = Register A ausgeben
+ JR $DL31 ; Operanden ausgeben
+$DL29: SUB 80H ; wenn > C0, -80 -> Operandentabelle
+$DL30: LD E,A ; LSB Operandentabelle -> E
+ LD D,OPETAB > 8 ; MSB Operandentabelle -> D
+ LD A,(DE) ; 1. Operanden -> A
+$DL31: POP DE ; akt. Disassemblieradr. wieder -> DE
+ CALL PRO1 ; 1. Operanden ausgeben
+ LD A,B ; Befehlsbyte wieder -> A
+ PUSH DE ; akt. Disassemblieradr. retten
+ CP 40H ; < 40 ?
+ JR C,$DL34
+ CP 0C0H ; nein, < C0 ?
+ JR NC,$DL33
+ CP 76H ; ja, HALT ?
+ JR NZ,$DL32
+ LD A,0FFH ; ja, wieder leeren Operanden -> A
+ JR $DL35 ; Operanden ausgeben
+$DL32: AND 7 ; loesche Bits 3..7, -> 2. Operanden
+ SET 4,A ; Buchstabenflag setzen
+ JR $DL35 ; Operanden ausgeben
+$DL33: SUB 80H ; wenn > C0 : 80 abziehen
+$DL34: ADD A,80H ; LSB Operandentabelle -> A
+ LD E,A ; und -> E
+ LD D,OPETAB > 8 ; MSB Operandentabelle -> D
+ LD A,(DE) ; 2. Operanden -> A
+$DL35: POP DE ; akt. Disassemblieradr. wieder -> DE
+ SET 7,C ; Komma-Flag setzen
+ CALL PRO1 ; 2. Operanden ausgeben
+ JP INAD ; fertig, Adresse merken und Workspace ausgeben
+
+ ; nach Preafix ED
+ED: SUB 40H ; 40 vom 2. Byte subtrahieren
+ JP C,ERRO ; Fehler wenn carry
+ CP 60H ; 2. Byte < A0 ?
+ JR NC,$DL36
+ CP 40H ; ja, >= 60 ?
+ JP NC,ERRO ; ja, Fehler
+ JR $DL37 ; nein, weiter
+$DL36: SUB 20H ; aus 60..7F wird 00..20
+$DL37: ADD A,80H ; LSB Operatortabelle -> A
+ LD E,A ; und -> E
+ LD D,CODTAB > 8 ; MSB Operatortabelle -> D
+ LD A,(DE) ; LSB Mnemonic-Adresse -> A
+ CP 0FFH ; leer ?
+ JP Z,ERRO ; ja, Fehler
+ LD E,A ; nein, -> E
+ LD D,MNETAB > 8 ; MSB Mnemonic-Adresse -> D
+ CALL TRBY ; Mnemonic ausgeben
+ POP DE ; Disassemblieradr. wieder -> DE
+ LD A,B ; Befehlsbyte wieder -> A
+ CP 80H ; < 80 ?
+ JP NC,INAD ; nein, Workspace ausgeben und fertig
+ PUSH DE ; Disassemblieradr. retten
+ SUB 40H ; LSB 1. Operanden in A
+ LD E,A ; und -> E
+ LD D,OP2TAB > 8 ; MSB 2. Operanden -> D
+ LD A,(DE) ; 1. Operanden -> A
+ POP DE ; akt. Disassemblieradr. wieder -> DE
+ CALL PRO1 ; 1. Operanden ausgeben
+ LD A,B ; Befehlsbyte wieder -> A
+ CP 80H ; < 80 ?
+ JP NC,INAD ; ja, Workspace ausgeben und fertig
+ PUSH DE ; akt. Disassemblieradr. retten
+ LD E,A ; LSB Operandentabelle -> E
+ LD D,OP2TAB > 8 ; MSB Operandentabelle -> D
+ LD A,(DE) ; 2. Operanden -> A
+ SET 7,C ; Buchstabenflag setzen
+$DL52: POP DE ; akt. Disassemblieradr. retten
+ CALL PRO1 ; 2. Operanden ausgeben
+ JP INAD ; fertig, Adresse merken und Workspace ausgeben
+
+ ; Operand 1 ausgeben
+PRO1: CP 0FFH ; leere Operand ?
+ RET Z ; ja, fertig
+ CP 17H ; nein, Register "A" ausgeben ?
+ JR NZ,$DL01
+ LD A,18H ; ja, umkodieren
+$DL01: CP 16H ; Register "(HL)" ausgeben ?
+ JR NZ,$DL02
+ LD A,0B4H ; ja, umkodieren
+$DL02: BIT 7,C ; 2. Operand ?
+ JR Z,$DL03
+ LD (HL),',' ; ja, "," ausgeben
+ INC HL ; naechste Printposition -> HL
+$DL03: BIT 7,A ; "(...)" ?
+ JR Z,$DL04
+ LD (HL),'(' ; ja, "(" ausgeben
+ INC HL ; naechste Printposition -> HL
+$DL04: BIT 4,A ; Buchstabe ?
+ JR NZ,PRBU ; ja, Buchstaben ausgeben
+ BIT 6,A ; nein, Bitnummer/RST-Adresse ?
+ JR NZ,DIST ; ja, Distanz ausgeben
+ BIT 5,A ; nein, Bitnummer ?
+ JR NZ,PRO2 ; ja, RST ausgeben
+ AND 7 ; nein, Bits 3..7 loeschen
+ CALL PRCH ; Hexbyte ausgeben
+ RET
+
+ ; RST ausgeben
+PRO2: PUSH AF ; A retten
+ AND 6 ; loesche Bits 0 und 4..7
+ RRCA ; Division durch 2
+ CALL PRCH ; oberes Nibble ausgeben
+ POP AF ; A wieder herstellen
+ BIT 0,A ; RST x8 ?
+ LD A,'0' ; nein, "0" -> A
+ JR Z,$DL05
+ LD A,'8' ; ja, "8" -> A
+$DL05: LD (HL),A ; "0" oder "8" ausgeben
+ INC HL ; naechste Printposition -> HL
+ RET
+
+ ; Distanz ausgeben
+DIST: BIT 0,A ; relative Distanz ?
+ JR Z,PR_N ; nein, N ausgeben
+ CALL PRNB ; Byte vorne ausgeben
+ PUSH DE ; akt. Disassemblieradr. retten
+ LD A,(DE) ; Distanzbyte -> A
+ INC DE ; Disassemblieradr. erhoehen
+ RLCA ; Bit 7 Distanzbyte -> carry
+ RRCA
+ JR NC,$DL06 ; Vorwaertsprung
+ SET 0,C ; Flag fuer Rueckwaertssprung setzen
+$DL06: ADD A,E ; Distanz zu PC addieren
+ LD E,A
+ BIT 0,C ; Flag testen
+ JR NC,$DL07 ; kein Ueberlauf
+ JR NZ,$DL08 ; Rueckwaertssprung
+ INC D ; MSB PC erhoehen
+ JR $DL08 ; Zieladresse ausgeben
+$DL07: JR Z,$DL08 ; bei Vorwaertssprung Zieladresse ausgeben
+ DEC D ; sonst MSB PC erniedrigen
+$DL08: CALL PRBY ; Zieladresse in DE ausgeben
+ POP DE ; akt. Disassemblieradresse wieder -> DE
+ RET
+
+ ; N ausgeben
+PR_N: PUSH AF ; A retten
+ BIT 1,A ; N ?
+ JR Z,PRNN ; nein, NN ausgeben
+ CALL PRVH ; ja, Byte vorne und hinten ausgeben
+ JR $DL12 ; ")" bearbeiten
+
+ ; NN ausgeben
+PRNN: CALL PRNB ; Byte vorne ausgeben
+ CALL PRVH ; Byte vorne und hinten ausgeben
+ DEC DE ; DE -> LSB von NN
+ CALL PRBH ; Byte hinten ausgeben
+ INC DE ; akt. Disassemblieradr. wieder -> DE
+ JR $DL12 ; ")" bearbeiten
+
+ ; Buchstaben ausgeben
+PRBU: PUSH AF ; A retten
+ PUSH BC ; Flags in C retten
+ PUSH DE ; akt. Disassemblieradr. retten
+ LD B,1 ; Anzahl = 1
+ LD DE,REGTAB ; DE zeigt auf die Register-Namen
+ BIT 5,A ; 2 Buchstaben ?
+ JR Z,$DL09
+ INC B ; ja, Anzahl erhoehen
+$DL09: BIT 6,A ; Sprungbedingung ?
+ JR Z,$DL10
+ LD DE,SPRTAB ; ja, DE zeigt auf Condition-Namen
+$DL10: RES 7,A ; Klammer-Bit loeschen
+ CP 34H ; "(HL)" ?
+ JR NZ,$DL11
+ BIT 5,C ; ja, Indexregister ?
+ JR Z,$DL11
+ LD A,0AH ; ja, A -> IX-Register
+ BIT 6,C ; IY-Register ?
+ JR Z,$DL11
+ LD A,0CH ; ja, A -> IY-Register
+$DL11: AND 0FH ; loesche oberes Nibble
+ ADD A,E ; und addiere zur Basis in DE
+ LD E,A
+$DL50: LD A,(DE) ; Zeichen -> A
+ LD (HL),A ; Zeichen ausgeben
+ INC DE ; Tabellen-Adresse erhoehen
+ INC HL ; naechste Printposition
+ DJNZ $DL50 ; naechstes Zeichen
+ POP DE ; Register wieder herstellen
+ POP BC
+ POP AF
+ PUSH AF ; A retten
+ CP 0B4H ; "(HL)" ?
+ JR NZ,$DL12
+ BIT 5,C ; nein, Indexregister ?
+ JR Z,$DL12
+ LD A,(DE) ; ja, Befehlsbyte nach DD/FD -> A
+ CP 0E9H ; "JP (IX/IY)" ?
+ JR Z,$DL12
+ LD (HL),'+' ; nein, "+" ausgeben
+ INC HL ; naechste Printposition
+ CALL PRVH ; Offset ausgeben
+$DL12: POP AF ; A wieder herstellen
+ BIT 7,A ; "()" ?
+ RET Z ; nein, fertig
+ LD (HL),')' ; ja, ")" ausgeben
+ INC HL ; naechste Printposition
+ RET
+
+ ; Error
+ERRO: LD DE,CBMTAB+24 ; Pointer auf "????" -> DE
+ CALL TRBY ; als Mnemonic ausgeben
+ POP DE ; akt. Disassemblieradr. vom Stack holen
+
+ ; Disassemblier-Adresse erhoehen und merken
+INAD: INC DE
+ LD (DADR),DE
+
+ ; Workspace ausgeben
+PRWO: PUSH AF ; Register retten
+ PUSH BC
+ PUSH DE
+ PUSH HL
+ LD HL,WRKS ; Adresse Workspace -> HL
+ CALL PRTSTR ; Workspace aufs Terminal ausgeben
+ LD HL,NL ; Adresse Newline-String -> HL
+ CALL PRTSTR ; Newline ausgeben
+ POP HL ; Register wieder herstellen
+ POP DE
+ POP BC
+ POP AF
+ RET
+
+ ; Workspace loeschen
+CLWO: LD HL,WRKS ; Workspace mit Space fuellen
+ LD DE,WRKS+1 ; und mit Null terminieren
+ LD (HL),32
+ LD BC,32
+ LDIR
+ XOR A
+ LD (DE),A
+ RET
+
+ ; 4 Bytes transferieren
+TRBY: PUSH BC ; BC retten
+ LD BC,4 ; 4 Bytes
+ EX DE,HL ; DE=Printposition, HL=Mnemonic
+ LDIR ; Bytes transferieren
+ EX DE,HL ; HL ist wieder Printposition
+ POP BC ; BC wieder herstellen
+ INC HL ; Leerzeichen
+ RET
+
+ ; Byte vorne und hinten ausgeben
+PRVH: CALL PRNB ; Byte vorne ausgeben
+
+ ; Byte hinten ausgeben
+PRBH: PUSH AF ; A retten
+ LD A,(DE) ; Byte -> A
+ CALL PRAK ; A ausgeben
+ POP AF ; A wieder herstellen
+ RET
+
+ ; Byte vorne ausgeben
+PRNB: PUSH AF ; A retten
+ INC DE ; DE auf naechstes Byte setzen
+ PUSH HL ; akt. Printposition retten
+ LD HL,(PRTMP) ; vordere Printposition -> HL
+ LD A,(DE) ; Byte -> A
+ CALL PRAK ; A ausgeben
+ INC HL ; Leerzeichen
+ LD (PRTMP),HL ; vordere Printposition retten
+ POP HL ; akt. Printposition wieder -> HL
+ POP AF ; A wieder herstellen
+ RET
+
+ ; DE ausgeben
+PRBY: LD A,D ; MSB -> A
+ CALL PRAK ; A ausgeben
+ LD A,E ; LSB -> A
+
+ ; A ausgeben
+PRAK: PUSH AF ; A retten
+ RRCA ; oberes Nibble ins untere schieben
+ RRCA
+ RRCA
+ RRCA
+ CALL PRCH ; oberes Nibble ausgeben
+ POP AF ; A wieder herstellen
+ CALL PRCH ; unteres Nibble ausgeben
+ RET
+
+ ; unteres Nibble in ASCII-Hex umwandeln und in Workspace schreiben
+PRCH: AND 0FH
+ ADD A,90H
+ DAA
+ ADC A,40H
+ DAA
+ LD (HL),A ; ASCII-Ziffer in Workspace schreiben
+ INC HL ; Printposition erhoehen
+ RET
+
+ ; Die hier folgenden Tabellen muessen am Anfang einer Page
+ ; beginnen, und die Reihenfolge der Tabellen darf auf keinen
+ ; Fall geaendert werden, weil das LSB der Tabellenadressen
+ ; durch arithmetische Operationen mit den Op-Codes berechnet
+ ; wird !!!
+
+ DEFS 256 - ($ & 0FFH)
+
+MNETAB: ; Tabelle mit den Z80-Mnemonics
+ DEFM 'ADD ADC '
+ DEFM 'SUB SBC '
+ DEFM 'AND XOR '
+ DEFM 'OR CP '
+ DEFM 'JR NOP '
+ DEFM 'DJNZEX '
+ DEFM 'RLCARLA '
+ DEFM 'DAA SCF '
+ DEFM 'RRCARRA '
+ DEFM 'CPL CCF '
+ DEFM 'LD INC '
+ DEFM 'DEC HALT'
+ DEFM 'RET POP '
+ DEFM 'JP OUT '
+ DEFM 'EX DI '
+ DEFM 'CALLPUSH'
+ DEFM 'RST EXX '
+ DEFM 'IN EX '
+ DEFM 'EI LDI '
+ DEFM 'LDIRINI '
+ DEFM 'INIROUTI'
+ DEFM 'OTIRNEG '
+ DEFM 'RETNRRD '
+ DEFM 'LDD LDDR'
+ DEFM 'CPD CPDR'
+ DEFM 'IND INDR'
+ DEFM 'OTDROUTD'
+ DEFM 'RETIRLD '
+ DEFM 'BIT RES '
+ DEFM 'SET ????'
+ DEFM 'CPI CPIR'
+ DEFM 'IM ----'
+
+CODTAB: ; LSB-Adressen der Mnemonics in MNETAB fuer
+ ; Befehle 00..3F ohne Preafix ED/CB
+
+ DEFB 024H,050H,050H,054H,054H,058H,050H,030H ; NOP LD LD INC INC DEC LD RLCA
+ DEFB 070H,000H,050H,058H,054H,058H,050H,040H ; EX ADD LD DEC INC DEC LD RRCA
+ DEFB 028H,050H,050H,054H,054H,058H,050H,034H ; DJNZ LD LD INC INC DEC LD RLA
+ DEFB 020H,000H,050H,058H,054H,058H,050H,044H ; JR ADD LD DEC INC DEC LD RRA
+ DEFB 020H,050H,050H,054H,054H,058H,050H,038H ; JR LD LD INC INC DEC LD DAA
+ DEFB 020H,000H,050H,058H,054H,058H,050H,048H ; JR ADD LD DEC INC DEC LD CPL
+ DEFB 020H,050H,050H,054H,054H,058H,050H,03CH ; JR LD LD INC INC DEC LD SCF
+ DEFB 020H,000H,050H,058H,054H,058H,050H,04CH ; JR ADD LD DEC INC DEC LD CCF
+
+ ; LSB-Adressen der Mnemonics in MNETAB fuer
+ ; Befehle C0..FF ohne Preafix ED/CB
+
+ DEFB 060H,064H,068H,068H,078H,07CH,000H,080H ; RET POP JP JP CALL PUSH ADD RET
+ DEFB 060H,060H,068H,0F1H,078H,078H,004H,080H ; RET RET JP (CB) CALL CALL ADC RST
+ DEFB 060H,064H,068H,06CH,078H,07CH,008H,080H ; RET POP JP OUT CALL PUSH SUB RST
+ DEFB 060H,084H,068H,088H,078H,0F0H,00CH,080H ; RET EXX JP IN CALL (DD) SBC RST
+ DEFB 060H,064H,068H,070H,078H,07CH,010H,080H ; RET POP JP EX CALL PUSH AND RST
+ DEFB 060H,068H,068H,02CH,078H,0F2H,014H,080H ; RET JP JP EX CALL (ED) XOR RST
+ DEFB 060H,064H,068H,074H,078H,07CH,018H,080H ; RET POP JP DI CALL PUSH OR RST
+ DEFB 060H,050H,068H,090H,078H,0F8H,01CH,080H ; RET LD JP EI CALL (FD) CP RST
+
+ ; LSB-Adressen der Mnemonics in MNETAB fuer
+ ; Befehle 40..7F mit Preafix ED
+
+ DEFB 088H,06CH,00CH,050H,0ACH,0B0H,0F8H,050H ; IN OUT SBC LD NEG RETN IM LD
+ DEFB 088H,06CH,004H,050H,0FFH,0D8H,0FFH,050H ; IN OUT ADC LD RETI LD
+ DEFB 088H,06CH,00CH,050H,0FFH,0FFH,0F8H,050H ; IN OUT SBC LD IM LD
+ DEFB 088H,06CH,004H,050H,0FFH,0FFH,0F8H,050H ; IN OUT ADC LD IM LD
+ DEFB 088H,06CH,00CH,0FFH,0FFH,0FFH,0FFH,0B4H ; IN OUT SBC RRD
+ DEFB 088H,06CH,004H,0FFH,0FFH,0FFH,0FFH,0DCH ; IN OUT ADC RLD
+ DEFB 0FFH,0FFH,00CH,050H,0FFH,0FFH,0FFH,0FFH ; SBC LD
+ DEFB 088H,06CH,004H,050H,0FFH,0FFH,0FFH,0FFH ; IN OUT ADC LD
+
+ ; LSB-Adressen der Mnemonics in MNETAB fuer
+ ; Befehle A0..BF mit Praefix ED
+
+ DEFB 094H,0F0H,09CH,0A4H,0FFH,0FFH,0FFH,0FFH ; LDI CPI INI OUTI
+ DEFB 0B8H,0C0H,0C8H,0D4H,0FFH,0FFH,0FFH,0FFH ; LDD CPD IND OUTD
+ DEFB 098H,0F4H,0A0H,0A8H,0FFH,0FFH,0FFH,0FFH ; LDIR CPIR INIR OTIR
+ DEFB 0BCH,0C4H,0CCH,0D0H,0FFH,0FFH,0FFH,0FFH ; LDDR CPDR INDR OTDR
+
+SPRTAB: ; Tabelle der Sprungbedingungen
+
+ DEFM 'NZNCPOPEPM'
+ DEFB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
+
+REGTAB: ; Tabelle der Register
+
+ DEFM 'BCDEHLSPAFIXIYIR'
+
+OPETAB: ; Tabelle der Operanden:
+ ; Bit 7: Zahl/Buchstabe
+ ; Bit 6: einfach/doppelt
+ ; Bit 5: Register/Sprungbedingung
+ ; Bit 4: ohne/mit Klammer
+ ; Bit 0..3: Offset in der Tabelle der Registernamen
+
+ ; Befehle 00..3F ohne Preafix ED/CB
+ ; 1. Operand
+
+ DEFB 0FFH,030H,0B0H,030H,010H,010H,010H,0FFH ; - BC (BC) BC B B B -
+ DEFB 038H,034H,017H,030H,011H,011H,011H,0FFH ; AF HL A BC C C C -
+ DEFB 041H,032H,0B2H,032H,012H,012H,012H,0FFH ; DIS DE (DE) DE D D D -
+ DEFB 041H,034H,017H,032H,013H,013H,013H,0FFH ; DIS HL A DE E E E -
+ DEFB 070H,034H,0C4H,034H,014H,014H,014H,0FFH ; NZ HL (NN) HL H H H -
+ DEFB 051H,034H,034H,034H,015H,015H,015H,0FFH ; Z HL HL HL L L L -
+ DEFB 072H,036H,0C4H,036H,016H,016H,016H,0FFH ; NC SP (NN) SP (HL) (HL) (HL) -
+ DEFB 011H,034H,017H,036H,017H,017H,017H,0FFH ; C HL A SP A A A -
+
+ ; Befehle C0..FF ohne Preafix ED/CB
+ ; 1. Operand
+
+ DEFB 070H,030H,070H,044H,070H,030H,017H,020H ; NZ BC NZ NN NZ BC A 00
+ DEFB 051H,0FFH,051H,0F1H,051H,044H,017H,021H ; Z - Z *CB Z NN A 08
+ DEFB 072H,032H,072H,0C2H,072H,032H,042H,022H ; NC DE NC (N) NC DE N 10
+ DEFB 053H,0FFH,053H,017H,053H,0F2H,017H,023H ; C - C A C *DD A 18
+ DEFB 074H,034H,074H,0B6H,074H,034H,042H,024H ; PO HL PO (SP) PO HL N 20
+ DEFB 076H,016H,076H,032H,076H,0F4H,042H,025H ; PE (HL) PE DE PE *ED N 28
+ DEFB 058H,038H,058H,0FFH,058H,038H,042H,026H ; P AF P - P AF N 30
+ DEFB 059H,036H,059H,0FFH,059H,0F8H,042H,027H ; M SP M - M *FD N 38
+
+ ; Befehle 00..3F ohne Preafix ED/CB
+ ; 2. Operand
+
+ DEFB 0FFH,044H,017H,0FFH,0FFH,0FFH,042H,0FFH ; - NN A - - - N -
+ DEFB 038H,030H,0B0H,0FFH,0FFH,0FFH,042H,0FFH ; AF BC (BC) - - - N -
+ DEFB 0FFH,044H,017H,0FFH,0FFH,0FFH,042H,0FFH ; - NN A - - - N -
+ DEFB 0FFH,032H,0B2H,0FFH,0FFH,0FFH,042H,0FFH ; - DE (DE) - - - N -
+ DEFB 041H,044H,034H,0FFH,0FFH,0FFH,042H,0FFH ; DIS NN HL - - - N -
+ DEFB 041H,034H,0C4H,0FFH,0FFH,0FFH,042H,0FFH ; DIS HL (NN) - - - N -
+ DEFB 041H,044H,017H,0FFH,0FFH,0FFH,042H,0FFH ; DIS NN A - - - N -
+ DEFB 041H,036H,0C4H,0FFH,0FFH,0FFH,042H,0FFH ; DIS SP (NN) - - - N -
+
+ ; Befehle C0..FF ohne Praefix ED/CB
+ ; 2. Operand
+
+ DEFB 0FFH,0FFH,044H,0FFH,044H,0FFH,042H,0FFH ; - - NN - NN - N -
+ DEFB 0FFH,0FFH,044H,0FFH,044H,0FFH,042H,0FFH ; - - NN *CB NN - N -
+ DEFB 0FFH,0FFH,044H,017H,044H,0FFH,0FFH,0FFH ; - - NN A NN - - -
+ DEFB 0FFH,0FFH,044H,0C2H,044H,0FFH,042H,0FFH ; - - NN (N) NN *DD N -
+ DEFB 0FFH,0FFH,044H,034H,044H,0FFH,0FFH,0FFH ; - - NN HL NN - - -
+ DEFB 0FFH,0FFH,044H,034H,044H,0FFH,0FFH,0FFH ; - - NN HL NN *ED - -
+ DEFB 0FFH,0FFH,044H,0FFH,044H,0FFH,0FFH,0FFH ; - - NN - NN - - -
+ DEFB 0FFH,034H,044H,0FFH,044H,0FFH,0FFH,0FFH ; - HL NN - NN *FD - -
+
+OP2TAB: ; Befehle 40..7F mit Praefix ED
+ ; 1. Operand
+
+ DEFB 010H,091H,034H,0C4H,0FFH,0FFH,000H,01EH ; B (C) HL (NN) - - 0 I
+ DEFB 011H,091H,034H,030H,0FFH,0FFH,0FFH,01FH ; C (C) HL BC - - - R
+ DEFB 012H,091H,034H,0C4H,0FFH,0FFH,001H,017H ; D (C) HL (NN) - - 1 A
+ DEFB 013H,091H,034H,032H,0FFH,0FFH,002H,017H ; E (C) HL DE - - 2 A
+ DEFB 014H,091H,034H,0C4H,0FFH,0FFH,076H,0FFH ; H (C) HL - - - - -
+ DEFB 015H,091H,034H,0FFH,0FFH,0FFH,0FFH,0FFH ; L (C) HL - - - - -
+ DEFB 0FFH,0FFH,034H,0C4H,0FFH,0FFH,0FFH,0FFH ; - - HL (NN) - - - -
+ DEFB 017H,091H,034H,036H,0FFH,0FFH,0FFH,0FFH ; A (C) HL SP - - - -
+
+ ; Befehle 40..7F mit Preafix ED
+ ; 2. Operand
+
+ DEFB 091H,010H,030H,030H,0FFH,0FFH,0FFH,017H ; (C) B BC BC - - - A
+ DEFB 091H,011H,030H,0C4H,0FFH,0FFH,0FFH,017H ; (C) C BC (NN) - - - A
+ DEFB 091H,012H,032H,032H,0FFH,0FFH,0FFH,01EH ; (C) D DE DE - - - I
+ DEFB 091H,013H,032H,0C4H,0FFH,0FFH,0FFH,01FH ; (C) E DE (NN) - - - R
+ DEFB 091H,014H,034H,034H,0FFH,0FFH,0FFH,0FFH ; (C) H HL - - - - -
+ DEFB 091H,015H,034H,0FFH,0FFH,0FFH,0FFH,0FFH ; (C) L HL - - - - -
+ DEFB 0FFH,0FFH,036H,036H,0FFH,0FFH,0FFH,0FFH ; - - SP SP - - - -
+ DEFB 091H,017H,036H,0C4H,0FFH,0FFH,0FFH,0FFH ; (C) A SP (NN) - - - -
+
+CBMTAB: ; Tabelle der Mnemonics mit Praefix CB
+ DEFM 'RLC RRC '
+ DEFM 'RL RR '
+ DEFM 'SLA SRA '
+ DEFM '????SRL '
+
+NL: ; Null-terminiertes Newline fuers Terminal
+ DEFB 10,13,0
+
+WRKS: DEFS 34 ; Workspace zur Aufbereitung einer Ausgabezeile
+PRTMP: DEFS 2 ; temoraerer Speicher fuer Printposition
+DADR: DEFS 2 ; Disassemblier-Adresse
diff --git a/emu/z80pack-1.9/z80src/z80main.asm b/emu/z80pack-1.9/z80src/z80main.asm
new file mode 100644
index 0000000..0bad2f8
--- /dev/null
+++ b/emu/z80pack-1.9/z80src/z80main.asm
@@ -0,0 +1,28 @@
+ TITLE 'Test programm for Z80-Disassembler'
+
+;==========================================================================
+; Test programm for Z80-Disassembler
+;==========================================================================
+
+ LD SP,STACK ; initialize stack for simulator
+ LD HL,Z80OPS ; start address for disassembler
+ LD (DADR),HL
+LOOP:
+ CALL DISSCR ; disassemble one screen full
+ HALT ; stop simulation
+ JP LOOP ; next run
+
+PRTSTR: ; print 0 terminated string
+ LD A,(HL) ; next char -> A
+ OR A ; 0 ?
+ RET Z ; yes, done
+ OUT (0),A ; no, print it
+ INC HL ; increase pointer to string
+ JP PRTSTR ; process next char
+
+ INCLUDE z80dis.asm
+ INCLUDE z80ops.asm
+
+ DEFS 100H
+STACK:
+ END
diff --git a/emu/z80pack-1.9/z80src/z80ops.asm b/emu/z80pack-1.9/z80src/z80ops.asm
new file mode 100644
index 0000000..937cf23
--- /dev/null
+++ b/emu/z80pack-1.9/z80src/z80ops.asm
@@ -0,0 +1,704 @@
+ TITLE 'Z80 Instruction Set in alphabetical Order'
+
+IND EQU 5
+M EQU 10H
+N EQU 20H
+DIS EQU 30H
+
+Z80OPS:
+ ADC A,(HL)
+ ADC A,(IX+IND)
+ ADC A,(IY+IND)
+ ADC A,A
+ ADC A,B
+ ADC A,C
+ ADC A,D
+ ADC A,E
+ ADC A,H
+ ADC A,L
+ ADC A,N
+ ADC HL,BC
+ ADC HL,DE
+ ADC HL,HL
+ ADC HL,SP
+ ADD A,(HL)
+ ADD A,(IX+IND)
+ ADD A,(IY+IND)
+ ADD A,A
+ ADD A,B
+ ADD A,C
+ ADD A,D
+ ADD A,E
+ ADD A,H
+ ADD A,L
+ ADD A,N
+ ADD HL,BC
+ ADD HL,DE
+ ADD HL,HL
+ ADD HL,SP
+ ADD IX,BC
+ ADD IX,DE
+ ADD IX,IX
+ ADD IX,SP
+ ADD IY,BC
+ ADD IY,DE
+ ADD IY,IY
+ ADD IY,SP
+ AND (HL)
+ AND (IX+IND)
+ AND (IY+IND)
+ AND A
+ AND B
+ AND C
+ AND D
+ AND E
+ AND H
+ AND L
+ AND N
+ BIT 0,(HL)
+ BIT 0,(IX+IND)
+ BIT 0,(IY+IND)
+ BIT 0,A
+ BIT 0,B
+ BIT 0,C
+ BIT 0,D
+ BIT 0,E
+ BIT 0,H
+ BIT 0,L
+ BIT 1,(HL)
+ BIT 1,(IX+IND)
+ BIT 1,(IY+IND)
+ BIT 1,A
+ BIT 1,B
+ BIT 1,C
+ BIT 1,D
+ BIT 1,E
+ BIT 1,H
+ BIT 1,L
+ BIT 2,(HL)
+ BIT 2,(IX+IND)
+ BIT 2,(IY+IND)
+ BIT 2,A
+ BIT 2,B
+ BIT 2,C
+ BIT 2,D
+ BIT 2,E
+ BIT 2,H
+ BIT 2,L
+ BIT 3,(HL)
+ BIT 3,(IX+IND)
+ BIT 3,(IY+IND)
+ BIT 3,A
+ BIT 3,B
+ BIT 3,C
+ BIT 3,D
+ BIT 3,E
+ BIT 3,H
+ BIT 3,L
+ BIT 4,(HL)
+ BIT 4,(IX+IND)
+ BIT 4,(IY+IND)
+ BIT 4,A
+ BIT 4,B
+ BIT 4,C
+ BIT 4,D
+ BIT 4,E
+ BIT 4,H
+ BIT 4,L
+ BIT 5,(HL)
+ BIT 5,(IX+IND)
+ BIT 5,(IY+IND)
+ BIT 5,A
+ BIT 5,B
+ BIT 5,C
+ BIT 5,D
+ BIT 5,E
+ BIT 5,H
+ BIT 5,L
+ BIT 6,(HL)
+ BIT 6,(IX+IND)
+ BIT 6,(IY+IND)
+ BIT 6,A
+ BIT 6,B
+ BIT 6,C
+ BIT 6,D
+ BIT 6,E
+ BIT 6,H
+ BIT 6,L
+ BIT 7,(HL)
+ BIT 7,(IX+IND)
+ BIT 7,(IY+IND)
+ BIT 7,A
+ BIT 7,B
+ BIT 7,C
+ BIT 7,D
+ BIT 7,E
+ BIT 7,H
+ BIT 7,L
+ CALL C,NN
+ CALL M,NN
+ CALL NC,NN
+ CALL NN
+ CALL NZ,NN
+ CALL P,NN
+ CALL PE,NN
+ CALL PO,NN
+ CALL Z,NN
+ CCF
+ CP (HL)
+ CP (IX+IND)
+ CP (IY+IND)
+ CP A
+ CP B
+ CP C
+ CP D
+ CP E
+ CP H
+ CP L
+ CP N
+ CPD
+ CPDR
+ CPI
+ CPIR
+ CPL
+ DAA
+ DEC (HL)
+ DEC (IX+IND)
+ DEC (IY+IND)
+ DEC A
+ DEC B
+ DEC BC
+ DEC C
+ DEC D
+ DEC DE
+ DEC E
+ DEC H
+ DEC HL
+ DEC IX
+ DEC IY
+ DEC L
+ DEC SP
+ DI
+ DJNZ $+DIS
+ EI
+ EX (SP),HL
+ EX (SP),IX
+ EX (SP),IY
+ EX AF,AF'
+ EX DE,HL
+ EXX
+ HALT
+ IM 0
+ IM 1
+ IM 2
+ IN A,(C)
+ IN A,(N)
+ IN B,(C)
+ IN C,(C)
+ IN D,(C)
+ IN E,(C)
+ IN H,(C)
+ IN L,(C)
+ INC (HL)
+ INC (IX+IND)
+ INC (IY+IND)
+ INC A
+ INC B
+ INC BC
+ INC C
+ INC D
+ INC DE
+ INC E
+ INC H
+ INC HL
+ INC IX
+ INC IY
+ INC L
+ INC SP
+ IND
+ INDR
+ INI
+ INIR
+ JP (HL)
+ JP (IX)
+ JP (IY)
+ JP C,NN
+ JP M,NN
+ JP NC,NN
+ JP NN
+ JP NZ,NN
+ JP P,NN
+ JP PE,NN
+ JP PO,NN
+ JP Z,NN
+ JR C,$+DIS
+ JR $+DIS
+ JR NC,$+DIS
+ JR NZ,$+DIS
+ JR Z,$+DIS
+ LD (BC),A
+ LD (DE),A
+ LD (HL),A
+ LD (HL),B
+ LD (HL),C
+ LD (HL),D
+ LD (HL),E
+ LD (HL),H
+ LD (HL),L
+ LD (HL),N
+ LD (IX+IND),A
+ LD (IX+IND),B
+ LD (IX+IND),C
+ LD (IX+IND),D
+ LD (IX+IND),E
+ LD (IX+IND),H
+ LD (IX+IND),L
+ LD (IX+IND),N
+ LD (IY+IND),A
+ LD (IY+IND),B
+ LD (IY+IND),C
+ LD (IY+IND),D
+ LD (IY+IND),E
+ LD (IY+IND),H
+ LD (IY+IND),L
+ LD (IY+IND),N
+ LD (NN),A
+ LD (NN),BC
+ LD (NN),DE
+ LD (NN),HL
+ LD (NN),IX
+ LD (NN),IY
+ LD (NN),SP
+ LD A,(BC)
+ LD A,(DE)
+ LD A,(HL)
+ LD A,(IX+IND)
+ LD A,(IY+IND)
+ LD A,(NN)
+ LD A,A
+ LD A,B
+ LD A,C
+ LD A,D
+ LD A,E
+ LD A,H
+ LD A,I
+ LD A,L
+ LD A,N
+ LD B,(HL)
+ LD B,(IX+IND)
+ LD B,(IY+IND)
+ LD B,A
+ LD B,B
+ LD B,C
+ LD B,D
+ LD B,E
+ LD B,H
+ LD B,L
+ LD B,N
+ LD BC,(NN)
+ LD BC,NN
+ LD C,(HL)
+ LD C,(IX+IND)
+ LD C,(IY+IND)
+ LD C,A
+ LD C,B
+ LD C,C
+ LD C,D
+ LD C,E
+ LD C,H
+ LD C,L
+ LD C,N
+ LD D,(HL)
+ LD D,(IX+IND)
+ LD D,(IY+IND)
+ LD D,A
+ LD D,B
+ LD D,C
+ LD D,D
+ LD D,E
+ LD D,H
+ LD D,L
+ LD D,N
+ LD DE,(NN)
+ LD DE,NN
+ LD E,(HL)
+ LD E,(IX+IND)
+ LD E,(IY+IND)
+ LD E,A
+ LD E,B
+ LD E,C
+ LD E,D
+ LD E,E
+ LD E,H
+ LD E,L
+ LD E,N
+ LD H,(HL)
+ LD H,(IX+IND)
+ LD H,(IY+IND)
+ LD H,A
+ LD H,B
+ LD H,C
+ LD H,D
+ LD H,E
+ LD H,H
+ LD H,L
+ LD H,N
+ LD HL,(NN)
+ LD HL,NN
+ LD I,A
+ LD IX,(NN)
+ LD IX,NN
+ LD IY,(NN)
+ LD IY,NN
+ LD L,(HL)
+ LD L,(IX+IND)
+ LD L,(IY+IND)
+ LD L,A
+ LD L,B
+ LD L,C
+ LD L,D
+ LD L,E
+ LD L,H
+ LD L,L
+ LD L,N
+ LD SP,(NN)
+ LD SP,HL
+ LD SP,IX
+ LD SP,IY
+ LD SP,NN
+ LDD
+ LDDR
+ LDI
+ LDIR
+ NEG
+ NOP
+ OR (HL)
+ OR (IX+IND)
+ OR (IY+IND)
+ OR A
+ OR B
+ OR C
+ OR D
+ OR E
+ OR H
+ OR L
+ OR N
+ OTDR
+ OTIR
+ OUT (C),A
+ OUT (C),B
+ OUT (C),C
+ OUT (C),D
+ OUT (C),E
+ OUT (C),H
+ OUT (C),L
+ OUT (N),A
+ OUTD
+ OUTI
+ POP AF
+ POP BC
+ POP DE
+ POP HL
+ POP IX
+ POP IY
+ PUSH AF
+ PUSH BC
+ PUSH DE
+ PUSH HL
+ PUSH IX
+ PUSH IY
+ RES 0,(HL)
+ RES 0,(IX+IND)
+ RES 0,(IY+IND)
+ RES 0,A
+ RES 0,B
+ RES 0,C
+ RES 0,D
+ RES 0,E
+ RES 0,H
+ RES 0,L
+ RES 1,(HL)
+ RES 1,(IX+IND)
+ RES 1,(IY+IND)
+ RES 1,A
+ RES 1,B
+ RES 1,C
+ RES 1,D
+ RES 1,E
+ RES 1,H
+ RES 1,L
+ RES 2,(HL)
+ RES 2,(IX+IND)
+ RES 2,(IY+IND)
+ RES 2,A
+ RES 2,B
+ RES 2,C
+ RES 2,D
+ RES 2,E
+ RES 2,H
+ RES 2,L
+ RES 3,(HL)
+ RES 3,(IX+IND)
+ RES 3,(IY+IND)
+ RES 3,A
+ RES 3,B
+ RES 3,C
+ RES 3,D
+ RES 3,E
+ RES 3,H
+ RES 3,L
+ RES 4,(HL)
+ RES 4,(IX+IND)
+ RES 4,(IY+IND)
+ RES 4,A
+ RES 4,B
+ RES 4,C
+ RES 4,D
+ RES 4,E
+ RES 4,H
+ RES 4,L
+ RES 5,(HL)
+ RES 5,(IX+IND)
+ RES 5,(IY+IND)
+ RES 5,A
+ RES 5,B
+ RES 5,C
+ RES 5,D
+ RES 5,E
+ RES 5,H
+ RES 5,L
+ RES 6,(HL)
+ RES 6,(IX+IND)
+ RES 6,(IY+IND)
+ RES 6,A
+ RES 6,B
+ RES 6,C
+ RES 6,D
+ RES 6,E
+ RES 6,H
+ RES 6,L
+ RES 7,(HL)
+ RES 7,(IX+IND)
+ RES 7,(IY+IND)
+ RES 7,A
+ RES 7,B
+ RES 7,C
+ RES 7,D
+ RES 7,E
+ RES 7,H
+ RES 7,L
+ RET
+ RET C
+ RET M
+ RET NC
+ RET NZ
+ RET P
+ RET PE
+ RET PO
+ RET Z
+ RETI
+ RETN
+ RL (HL)
+ RL (IX+IND)
+ RL (IY+IND)
+ RL A
+ RL B
+ RL C
+ RL D
+ RL E
+ RL H
+ RL L
+ RLA
+ RLC (HL)
+ RLC (IX+IND)
+ RLC (IY+IND)
+ RLC A
+ RLC B
+ RLC C
+ RLC D
+ RLC E
+ RLC H
+ RLC L
+ RLCA
+ RLD
+ RR (HL)
+ RR (IX+IND)
+ RR (IY+IND)
+ RR A
+ RR B
+ RR C
+ RR D
+ RR E
+ RR H
+ RR L
+ RRA
+ RRC (HL)
+ RRC (IX+IND)
+ RRC (IY+IND)
+ RRC A
+ RRC B
+ RRC C
+ RRC D
+ RRC E
+ RRC H
+ RRC L
+ RRCA
+ RRD
+ RST 0
+ RST 10H
+ RST 18H
+ RST 20H
+ RST 28H
+ RST 30H
+ RST 38H
+ RST 8
+ SBC A,(HL)
+ SBC A,(IX+IND)
+ SBC A,(IY+IND)
+ SBC A,A
+ SBC A,B
+ SBC A,C
+ SBC A,D
+ SBC A,E
+ SBC A,H
+ SBC A,L
+ SBC A,N
+ SBC HL,BC
+ SBC HL,DE
+ SBC HL,HL
+ SBC HL,SP
+ SCF
+ SET 0,(HL)
+ SET 0,(IX+IND)
+ SET 0,(IY+IND)
+ SET 0,A
+ SET 0,B
+ SET 0,C
+ SET 0,D
+ SET 0,E
+ SET 0,H
+ SET 0,L
+ SET 1,(HL)
+ SET 1,(IX+IND)
+ SET 1,(IY+IND)
+ SET 1,A
+ SET 1,B
+ SET 1,C
+ SET 1,D
+ SET 1,E
+ SET 1,H
+ SET 1,L
+ SET 2,(HL)
+ SET 2,(IX+IND)
+ SET 2,(IY+IND)
+ SET 2,A
+ SET 2,B
+ SET 2,C
+ SET 2,D
+ SET 2,E
+ SET 2,H
+ SET 2,L
+ SET 3,(HL)
+ SET 3,(IX+IND)
+ SET 3,(IY+IND)
+ SET 3,A
+ SET 3,B
+ SET 3,C
+ SET 3,D
+ SET 3,E
+ SET 3,H
+ SET 3,L
+ SET 4,(HL)
+ SET 4,(IX+IND)
+ SET 4,(IY+IND)
+ SET 4,A
+ SET 4,B
+ SET 4,C
+ SET 4,D
+ SET 4,E
+ SET 4,H
+ SET 4,L
+ SET 5,(HL)
+ SET 5,(IX+IND)
+ SET 5,(IY+IND)
+ SET 5,A
+ SET 5,B
+ SET 5,C
+ SET 5,D
+ SET 5,E
+ SET 5,H
+ SET 5,L
+ SET 6,(HL)
+ SET 6,(IX+IND)
+ SET 6,(IY+IND)
+ SET 6,A
+ SET 6,B
+ SET 6,C
+ SET 6,D
+ SET 6,E
+ SET 6,H
+ SET 6,L
+ SET 7,(HL)
+ SET 7,(IX+IND)
+ SET 7,(IY+IND)
+ SET 7,A
+ SET 7,B
+ SET 7,C
+ SET 7,D
+ SET 7,E
+ SET 7,H
+ SET 7,L
+ SLA (HL)
+ SLA (IX+IND)
+ SLA (IY+IND)
+ SLA A
+ SLA B
+ SLA C
+ SLA D
+ SLA E
+ SLA H
+ SLA L
+ SRA (HL)
+ SRA (IX+IND)
+ SRA (IY+IND)
+ SRA A
+ SRA B
+ SRA C
+ SRA D
+ SRA E
+ SRA H
+ SRA L
+ SRL (HL)
+ SRL (IX+IND)
+ SRL (IY+IND)
+ SRL A
+ SRL B
+ SRL C
+ SRL D
+ SRL E
+ SRL H
+ SRL L
+ SUB (HL)
+ SUB (IX+IND)
+ SUB (IY+IND)
+ SUB A
+ SUB B
+ SUB C
+ SUB D
+ SUB E
+ SUB H
+ SUB L
+ SUB N
+ XOR (HL)
+ XOR (IX+IND)
+ XOR (IY+IND)
+ XOR A
+ XOR B
+ XOR C
+ XOR D
+ XOR E
+ XOR H
+ XOR L
+ XOR N
+
+NN: DEFS 2
diff --git a/sprite/320x200_cpm_mockup.aseprite b/sprite/320x200_cpm_mockup.aseprite
new file mode 100644
index 0000000..b77c912
Binary files /dev/null and b/sprite/320x200_cpm_mockup.aseprite differ
diff --git a/sprite/320x200_cpm_mockup.png b/sprite/320x200_cpm_mockup.png
new file mode 100644
index 0000000..97afff3
Binary files /dev/null and b/sprite/320x200_cpm_mockup.png differ
diff --git a/sprite/320x200_cpm_mockup_BIG.png b/sprite/320x200_cpm_mockup_BIG.png
new file mode 100644
index 0000000..d2a9c85
Binary files /dev/null and b/sprite/320x200_cpm_mockup_BIG.png differ
diff --git a/sprite/640x400_cpm_mockup.png b/sprite/640x400_cpm_mockup.png
new file mode 100644
index 0000000..597efcb
Binary files /dev/null and b/sprite/640x400_cpm_mockup.png differ
diff --git a/sprite/8x8_font-expanded.png b/sprite/8x8_font-expanded.png
new file mode 100644
index 0000000..8dea65e
Binary files /dev/null and b/sprite/8x8_font-expanded.png differ
diff --git a/sprite/8x8_font-expanded.zip b/sprite/8x8_font-expanded.zip
new file mode 100644
index 0000000..9a05061
Binary files /dev/null and b/sprite/8x8_font-expanded.zip differ
diff --git a/sprite/8x8_font-lower.aseprite b/sprite/8x8_font-lower.aseprite
new file mode 100644
index 0000000..b5966d2
Binary files /dev/null and b/sprite/8x8_font-lower.aseprite differ
diff --git a/sprite/8x8_font-lower.png b/sprite/8x8_font-lower.png
new file mode 100644
index 0000000..e1ccfa3
Binary files /dev/null and b/sprite/8x8_font-lower.png differ
diff --git a/sprite/8x8_font.aseprite b/sprite/8x8_font.aseprite
new file mode 100644
index 0000000..f852cf7
Binary files /dev/null and b/sprite/8x8_font.aseprite differ
diff --git a/sprite/8x8_font.piskel b/sprite/8x8_font.piskel
new file mode 100644
index 0000000..70b17af
--- /dev/null
+++ b/sprite/8x8_font.piskel
@@ -0,0 +1 @@
+{"modelVersion":2,"piskel":{"name":"8x8_font","description":"","fps":2,"height":8,"width":8,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":67,\"chunks\":[{\"layout\":[[0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31],[32],[33],[34],[35],[36],[37],[38],[39],[40],[41],[42],[43],[44],[45],[46],[47],[48],[49],[50],[51],[52],[53],[54],[55],[56],[57],[58],[59],[60],[61],[62],[63],[64],[65],[66]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhgAAAAICAYAAAC7zYaiAAADSUlEQVR4Xu2aUW4DMQhEm/sfutVKdWQR4A3Gm0iR+9dgWDMDA4n28XP+DgIHgYPAQeAgcBA4CGxG4PEf79eJO2yXydpn23DNzpB/9fnXM7P7eXZ7vupvIaJ4md3GuvLvxpsxtPwQvpZj8if7Hfx08OniW8HP6w3CV7GPM1d8L5+sPqmHK/lZbr3+J33w6ifCbYfkWbwopnc+668Zg1X+Z36j+1EeZKe8yd6Nn/kTvsOXYmS1N8+7SMOyOhx3VJ5R5ZCwJXyU+sn4zXKzPS73agR4V5C7A5T8u/aITCI5IrGKl3f/Idwe0faz6vPefb7bXLvvmw1nOxyoBqLh4w3+aPBU87N1R/7V/qDz9LyuvSuOyoJGvNKSoPjvOkODvtpfq/Gi3ljVT9XPqyebQ/YlJ1seVvq3Up8rC1C19lZzoDqg+iX7S/xdv2DQgxUBmi9H35Cjb0DRljd/Pp4TbaG0nUXk0v1pM54HVITX+FzB893f+EkAsia9Ox9q4HfZSai85dLzIQGu9s/MXTYEot7p8kfCpywQagylD71YpHHErVpjSh6fOBNp65xXpq1dfCLtm+MSR3cMf8uFukRVlkSbO+XZqY+V+9vaeMb41l8wqoJXaf5se4ziUEFU7usNIcVfWYCyBSbz7zaZcv/OwqTy2xEgRUCpDrL6URY4tf6qIkL82AXg+r/CV0cQdw64u/mnGlHrYxWv1fjqgKP4HXu2YKgLKNV9l/8uv8r9aIlbrQ3SSAUbu2g8RYAEpGqngUPxyJ/sFJ+IzEj69ILhFfFqvl5RreRHfFSLN7uDYlPOeBx36qIjLsSfiu8nF4z5jpQPDZquSFb7l7hT7DvO3I1LN37Xf5XXeXBlAzZbQmZbtgDfqQFZjSgDfBU/1Y/4JfvLcyq/YMzO9BKXR2DmTwVEiVl/eonME0ALTuUlIEVQs/iKf/aNcBRu1HyE3+zvvUug3I/wIwGeOcxelCNbZ0HKxIX469iJP1owqP7V+CRymbhnC4b6fFUIu+eonr34O+pTGY5ZbkofR/6Kr3Kmgz3Fp/qj95wU/Rs8Vt/TsBrp9aSdex2sovhqD9p+JH2OcPHi0GsETx/54E6kTqyDwEHgIHAQOAgcBL4bgT8WctcYviQRzgAAAABJRU5ErkJggg==\"}]}"]}}
\ No newline at end of file
diff --git a/sprite/8x8_font.png b/sprite/8x8_font.png
new file mode 100644
index 0000000..6622737
Binary files /dev/null and b/sprite/8x8_font.png differ
diff --git a/sprite/8x8_font.zip b/sprite/8x8_font.zip
new file mode 100644
index 0000000..9f1a98b
Binary files /dev/null and b/sprite/8x8_font.zip differ
diff --git a/spriteconvert/sprite/letter00.png b/sprite/8x8_font/letter00.png
similarity index 100%
rename from spriteconvert/sprite/letter00.png
rename to sprite/8x8_font/letter00.png
diff --git a/spriteconvert/sprite/letter01.png b/sprite/8x8_font/letter01.png
similarity index 100%
rename from spriteconvert/sprite/letter01.png
rename to sprite/8x8_font/letter01.png
diff --git a/spriteconvert/sprite/letter02.png b/sprite/8x8_font/letter02.png
similarity index 100%
rename from spriteconvert/sprite/letter02.png
rename to sprite/8x8_font/letter02.png
diff --git a/spriteconvert/sprite/letter03.png b/sprite/8x8_font/letter03.png
similarity index 100%
rename from spriteconvert/sprite/letter03.png
rename to sprite/8x8_font/letter03.png
diff --git a/spriteconvert/sprite/letter04.png b/sprite/8x8_font/letter04.png
similarity index 100%
rename from spriteconvert/sprite/letter04.png
rename to sprite/8x8_font/letter04.png
diff --git a/spriteconvert/sprite/letter05.png b/sprite/8x8_font/letter05.png
similarity index 100%
rename from spriteconvert/sprite/letter05.png
rename to sprite/8x8_font/letter05.png
diff --git a/spriteconvert/sprite/letter06.png b/sprite/8x8_font/letter06.png
similarity index 100%
rename from spriteconvert/sprite/letter06.png
rename to sprite/8x8_font/letter06.png
diff --git a/spriteconvert/sprite/letter07.png b/sprite/8x8_font/letter07.png
similarity index 100%
rename from spriteconvert/sprite/letter07.png
rename to sprite/8x8_font/letter07.png
diff --git a/spriteconvert/sprite/letter08.png b/sprite/8x8_font/letter08.png
similarity index 100%
rename from spriteconvert/sprite/letter08.png
rename to sprite/8x8_font/letter08.png
diff --git a/spriteconvert/sprite/letter09.png b/sprite/8x8_font/letter09.png
similarity index 100%
rename from spriteconvert/sprite/letter09.png
rename to sprite/8x8_font/letter09.png
diff --git a/spriteconvert/sprite/letter10.png b/sprite/8x8_font/letter10.png
similarity index 100%
rename from spriteconvert/sprite/letter10.png
rename to sprite/8x8_font/letter10.png
diff --git a/spriteconvert/sprite/letter11.png b/sprite/8x8_font/letter11.png
similarity index 100%
rename from spriteconvert/sprite/letter11.png
rename to sprite/8x8_font/letter11.png
diff --git a/spriteconvert/sprite/letter12.png b/sprite/8x8_font/letter12.png
similarity index 100%
rename from spriteconvert/sprite/letter12.png
rename to sprite/8x8_font/letter12.png
diff --git a/spriteconvert/sprite/letter13.png b/sprite/8x8_font/letter13.png
similarity index 100%
rename from spriteconvert/sprite/letter13.png
rename to sprite/8x8_font/letter13.png
diff --git a/spriteconvert/sprite/letter14.png b/sprite/8x8_font/letter14.png
similarity index 100%
rename from spriteconvert/sprite/letter14.png
rename to sprite/8x8_font/letter14.png
diff --git a/spriteconvert/sprite/letter15.png b/sprite/8x8_font/letter15.png
similarity index 100%
rename from spriteconvert/sprite/letter15.png
rename to sprite/8x8_font/letter15.png
diff --git a/spriteconvert/sprite/letter16.png b/sprite/8x8_font/letter16.png
similarity index 100%
rename from spriteconvert/sprite/letter16.png
rename to sprite/8x8_font/letter16.png
diff --git a/spriteconvert/sprite/letter17.png b/sprite/8x8_font/letter17.png
similarity index 100%
rename from spriteconvert/sprite/letter17.png
rename to sprite/8x8_font/letter17.png
diff --git a/spriteconvert/sprite/letter18.png b/sprite/8x8_font/letter18.png
similarity index 100%
rename from spriteconvert/sprite/letter18.png
rename to sprite/8x8_font/letter18.png
diff --git a/spriteconvert/sprite/letter19.png b/sprite/8x8_font/letter19.png
similarity index 100%
rename from spriteconvert/sprite/letter19.png
rename to sprite/8x8_font/letter19.png
diff --git a/spriteconvert/sprite/letter20.png b/sprite/8x8_font/letter20.png
similarity index 100%
rename from spriteconvert/sprite/letter20.png
rename to sprite/8x8_font/letter20.png
diff --git a/spriteconvert/sprite/letter21.png b/sprite/8x8_font/letter21.png
similarity index 100%
rename from spriteconvert/sprite/letter21.png
rename to sprite/8x8_font/letter21.png
diff --git a/spriteconvert/sprite/letter22.png b/sprite/8x8_font/letter22.png
similarity index 100%
rename from spriteconvert/sprite/letter22.png
rename to sprite/8x8_font/letter22.png
diff --git a/spriteconvert/sprite/letter23.png b/sprite/8x8_font/letter23.png
similarity index 100%
rename from spriteconvert/sprite/letter23.png
rename to sprite/8x8_font/letter23.png
diff --git a/spriteconvert/sprite/letter24.png b/sprite/8x8_font/letter24.png
similarity index 100%
rename from spriteconvert/sprite/letter24.png
rename to sprite/8x8_font/letter24.png
diff --git a/spriteconvert/sprite/letter25.png b/sprite/8x8_font/letter25.png
similarity index 100%
rename from spriteconvert/sprite/letter25.png
rename to sprite/8x8_font/letter25.png
diff --git a/spriteconvert/sprite/letter26.png b/sprite/8x8_font/letter26.png
similarity index 100%
rename from spriteconvert/sprite/letter26.png
rename to sprite/8x8_font/letter26.png
diff --git a/spriteconvert/sprite/letter27.png b/sprite/8x8_font/letter27.png
similarity index 100%
rename from spriteconvert/sprite/letter27.png
rename to sprite/8x8_font/letter27.png
diff --git a/spriteconvert/sprite/letter28.png b/sprite/8x8_font/letter28.png
similarity index 100%
rename from spriteconvert/sprite/letter28.png
rename to sprite/8x8_font/letter28.png
diff --git a/spriteconvert/sprite/letter29.png b/sprite/8x8_font/letter29.png
similarity index 100%
rename from spriteconvert/sprite/letter29.png
rename to sprite/8x8_font/letter29.png
diff --git a/spriteconvert/sprite/letter30.png b/sprite/8x8_font/letter30.png
similarity index 100%
rename from spriteconvert/sprite/letter30.png
rename to sprite/8x8_font/letter30.png
diff --git a/spriteconvert/sprite/letter31.png b/sprite/8x8_font/letter31.png
similarity index 100%
rename from spriteconvert/sprite/letter31.png
rename to sprite/8x8_font/letter31.png
diff --git a/spriteconvert/sprite/letter32.png b/sprite/8x8_font/letter32.png
similarity index 100%
rename from spriteconvert/sprite/letter32.png
rename to sprite/8x8_font/letter32.png
diff --git a/spriteconvert/sprite/letter33.png b/sprite/8x8_font/letter33.png
similarity index 100%
rename from spriteconvert/sprite/letter33.png
rename to sprite/8x8_font/letter33.png
diff --git a/spriteconvert/sprite/letter34.png b/sprite/8x8_font/letter34.png
similarity index 100%
rename from spriteconvert/sprite/letter34.png
rename to sprite/8x8_font/letter34.png
diff --git a/spriteconvert/sprite/letter35.png b/sprite/8x8_font/letter35.png
similarity index 100%
rename from spriteconvert/sprite/letter35.png
rename to sprite/8x8_font/letter35.png
diff --git a/spriteconvert/sprite/letter36.png b/sprite/8x8_font/letter36.png
similarity index 100%
rename from spriteconvert/sprite/letter36.png
rename to sprite/8x8_font/letter36.png
diff --git a/spriteconvert/sprite/letter37.png b/sprite/8x8_font/letter37.png
similarity index 100%
rename from spriteconvert/sprite/letter37.png
rename to sprite/8x8_font/letter37.png
diff --git a/spriteconvert/sprite/letter38.png b/sprite/8x8_font/letter38.png
similarity index 100%
rename from spriteconvert/sprite/letter38.png
rename to sprite/8x8_font/letter38.png
diff --git a/spriteconvert/sprite/letter39.png b/sprite/8x8_font/letter39.png
similarity index 100%
rename from spriteconvert/sprite/letter39.png
rename to sprite/8x8_font/letter39.png
diff --git a/spriteconvert/sprite/letter40.png b/sprite/8x8_font/letter40.png
similarity index 100%
rename from spriteconvert/sprite/letter40.png
rename to sprite/8x8_font/letter40.png
diff --git a/spriteconvert/sprite/letter41.png b/sprite/8x8_font/letter41.png
similarity index 100%
rename from spriteconvert/sprite/letter41.png
rename to sprite/8x8_font/letter41.png
diff --git a/spriteconvert/sprite/letter42.png b/sprite/8x8_font/letter42.png
similarity index 100%
rename from spriteconvert/sprite/letter42.png
rename to sprite/8x8_font/letter42.png
diff --git a/spriteconvert/sprite/letter43.png b/sprite/8x8_font/letter43.png
similarity index 100%
rename from spriteconvert/sprite/letter43.png
rename to sprite/8x8_font/letter43.png
diff --git a/spriteconvert/sprite/letter44.png b/sprite/8x8_font/letter44.png
similarity index 100%
rename from spriteconvert/sprite/letter44.png
rename to sprite/8x8_font/letter44.png
diff --git a/spriteconvert/sprite/letter45.png b/sprite/8x8_font/letter45.png
similarity index 100%
rename from spriteconvert/sprite/letter45.png
rename to sprite/8x8_font/letter45.png
diff --git a/spriteconvert/sprite/letter46.png b/sprite/8x8_font/letter46.png
similarity index 100%
rename from spriteconvert/sprite/letter46.png
rename to sprite/8x8_font/letter46.png
diff --git a/spriteconvert/sprite/letter47.png b/sprite/8x8_font/letter47.png
similarity index 100%
rename from spriteconvert/sprite/letter47.png
rename to sprite/8x8_font/letter47.png
diff --git a/spriteconvert/sprite/letter48.png b/sprite/8x8_font/letter48.png
similarity index 100%
rename from spriteconvert/sprite/letter48.png
rename to sprite/8x8_font/letter48.png
diff --git a/spriteconvert/sprite/letter49.png b/sprite/8x8_font/letter49.png
similarity index 100%
rename from spriteconvert/sprite/letter49.png
rename to sprite/8x8_font/letter49.png
diff --git a/spriteconvert/sprite/letter50.png b/sprite/8x8_font/letter50.png
similarity index 100%
rename from spriteconvert/sprite/letter50.png
rename to sprite/8x8_font/letter50.png
diff --git a/spriteconvert/sprite/letter51.png b/sprite/8x8_font/letter51.png
similarity index 100%
rename from spriteconvert/sprite/letter51.png
rename to sprite/8x8_font/letter51.png
diff --git a/spriteconvert/sprite/letter52.png b/sprite/8x8_font/letter52.png
similarity index 100%
rename from spriteconvert/sprite/letter52.png
rename to sprite/8x8_font/letter52.png
diff --git a/spriteconvert/sprite/letter53.png b/sprite/8x8_font/letter53.png
similarity index 100%
rename from spriteconvert/sprite/letter53.png
rename to sprite/8x8_font/letter53.png
diff --git a/spriteconvert/sprite/letter54.png b/sprite/8x8_font/letter54.png
similarity index 100%
rename from spriteconvert/sprite/letter54.png
rename to sprite/8x8_font/letter54.png
diff --git a/spriteconvert/sprite/letter55.png b/sprite/8x8_font/letter55.png
similarity index 100%
rename from spriteconvert/sprite/letter55.png
rename to sprite/8x8_font/letter55.png
diff --git a/spriteconvert/sprite/letter56.png b/sprite/8x8_font/letter56.png
similarity index 100%
rename from spriteconvert/sprite/letter56.png
rename to sprite/8x8_font/letter56.png
diff --git a/spriteconvert/sprite/letter57.png b/sprite/8x8_font/letter57.png
similarity index 100%
rename from spriteconvert/sprite/letter57.png
rename to sprite/8x8_font/letter57.png
diff --git a/spriteconvert/sprite/letter58.png b/sprite/8x8_font/letter58.png
similarity index 100%
rename from spriteconvert/sprite/letter58.png
rename to sprite/8x8_font/letter58.png
diff --git a/spriteconvert/sprite/letter59.png b/sprite/8x8_font/letter59.png
similarity index 100%
rename from spriteconvert/sprite/letter59.png
rename to sprite/8x8_font/letter59.png
diff --git a/spriteconvert/sprite/letter60.png b/sprite/8x8_font/letter60.png
similarity index 100%
rename from spriteconvert/sprite/letter60.png
rename to sprite/8x8_font/letter60.png
diff --git a/spriteconvert/sprite/letter61.png b/sprite/8x8_font/letter61.png
similarity index 100%
rename from spriteconvert/sprite/letter61.png
rename to sprite/8x8_font/letter61.png
diff --git a/spriteconvert/sprite/letter62.png b/sprite/8x8_font/letter62.png
similarity index 100%
rename from spriteconvert/sprite/letter62.png
rename to sprite/8x8_font/letter62.png
diff --git a/spriteconvert/sprite/letter63.png b/sprite/8x8_font/letter63.png
similarity index 100%
rename from spriteconvert/sprite/letter63.png
rename to sprite/8x8_font/letter63.png
diff --git a/spriteconvert/sprite/letter64.png b/sprite/8x8_font/letter64.png
similarity index 100%
rename from spriteconvert/sprite/letter64.png
rename to sprite/8x8_font/letter64.png
diff --git a/spriteconvert/sprite/letter65.png b/sprite/8x8_font/letter65.png
similarity index 100%
rename from spriteconvert/sprite/letter65.png
rename to sprite/8x8_font/letter65.png
diff --git a/spriteconvert/sprite/letter66.png b/sprite/8x8_font/letter66.png
similarity index 100%
rename from spriteconvert/sprite/letter66.png
rename to sprite/8x8_font/letter66.png
diff --git a/spriteconvert/sprite/letter67.png b/sprite/8x8_font/letter67.png
similarity index 100%
rename from spriteconvert/sprite/letter67.png
rename to sprite/8x8_font/letter67.png
diff --git a/sprite/8x8_font_lower/letter00.png b/sprite/8x8_font_lower/letter00.png
new file mode 100644
index 0000000..5afb41a
Binary files /dev/null and b/sprite/8x8_font_lower/letter00.png differ
diff --git a/sprite/8x8_font_lower/letter01.png b/sprite/8x8_font_lower/letter01.png
new file mode 100644
index 0000000..de59952
Binary files /dev/null and b/sprite/8x8_font_lower/letter01.png differ
diff --git a/sprite/8x8_font_lower/letter02.png b/sprite/8x8_font_lower/letter02.png
new file mode 100644
index 0000000..2347ae8
Binary files /dev/null and b/sprite/8x8_font_lower/letter02.png differ
diff --git a/sprite/8x8_font_lower/letter03.png b/sprite/8x8_font_lower/letter03.png
new file mode 100644
index 0000000..3671518
Binary files /dev/null and b/sprite/8x8_font_lower/letter03.png differ
diff --git a/sprite/8x8_font_lower/letter04.png b/sprite/8x8_font_lower/letter04.png
new file mode 100644
index 0000000..2dc53c3
Binary files /dev/null and b/sprite/8x8_font_lower/letter04.png differ
diff --git a/sprite/8x8_font_lower/letter05.png b/sprite/8x8_font_lower/letter05.png
new file mode 100644
index 0000000..2cbd40f
Binary files /dev/null and b/sprite/8x8_font_lower/letter05.png differ
diff --git a/sprite/8x8_font_lower/letter06.png b/sprite/8x8_font_lower/letter06.png
new file mode 100644
index 0000000..3051e14
Binary files /dev/null and b/sprite/8x8_font_lower/letter06.png differ
diff --git a/sprite/8x8_font_lower/letter07.png b/sprite/8x8_font_lower/letter07.png
new file mode 100644
index 0000000..00b8c96
Binary files /dev/null and b/sprite/8x8_font_lower/letter07.png differ
diff --git a/sprite/8x8_font_lower/letter08.png b/sprite/8x8_font_lower/letter08.png
new file mode 100644
index 0000000..9415f3f
Binary files /dev/null and b/sprite/8x8_font_lower/letter08.png differ
diff --git a/sprite/8x8_font_lower/letter09.png b/sprite/8x8_font_lower/letter09.png
new file mode 100644
index 0000000..2aa959f
Binary files /dev/null and b/sprite/8x8_font_lower/letter09.png differ
diff --git a/sprite/8x8_font_lower/letter10.png b/sprite/8x8_font_lower/letter10.png
new file mode 100644
index 0000000..9e7bcc7
Binary files /dev/null and b/sprite/8x8_font_lower/letter10.png differ
diff --git a/sprite/8x8_font_lower/letter11.png b/sprite/8x8_font_lower/letter11.png
new file mode 100644
index 0000000..ed092ad
Binary files /dev/null and b/sprite/8x8_font_lower/letter11.png differ
diff --git a/sprite/8x8_font_lower/letter12.png b/sprite/8x8_font_lower/letter12.png
new file mode 100644
index 0000000..e9292db
Binary files /dev/null and b/sprite/8x8_font_lower/letter12.png differ
diff --git a/sprite/8x8_font_lower/letter13.png b/sprite/8x8_font_lower/letter13.png
new file mode 100644
index 0000000..a4d4713
Binary files /dev/null and b/sprite/8x8_font_lower/letter13.png differ
diff --git a/sprite/8x8_font_lower/letter14.png b/sprite/8x8_font_lower/letter14.png
new file mode 100644
index 0000000..1e9a572
Binary files /dev/null and b/sprite/8x8_font_lower/letter14.png differ
diff --git a/sprite/8x8_font_lower/letter15.png b/sprite/8x8_font_lower/letter15.png
new file mode 100644
index 0000000..e30432e
Binary files /dev/null and b/sprite/8x8_font_lower/letter15.png differ
diff --git a/sprite/8x8_font_lower/letter16.png b/sprite/8x8_font_lower/letter16.png
new file mode 100644
index 0000000..172520a
Binary files /dev/null and b/sprite/8x8_font_lower/letter16.png differ
diff --git a/sprite/8x8_font_lower/letter17.png b/sprite/8x8_font_lower/letter17.png
new file mode 100644
index 0000000..ceb826a
Binary files /dev/null and b/sprite/8x8_font_lower/letter17.png differ
diff --git a/sprite/8x8_font_lower/letter18.png b/sprite/8x8_font_lower/letter18.png
new file mode 100644
index 0000000..71939f6
Binary files /dev/null and b/sprite/8x8_font_lower/letter18.png differ
diff --git a/sprite/8x8_font_lower/letter19.png b/sprite/8x8_font_lower/letter19.png
new file mode 100644
index 0000000..23cf3b0
Binary files /dev/null and b/sprite/8x8_font_lower/letter19.png differ
diff --git a/sprite/8x8_font_lower/letter20.png b/sprite/8x8_font_lower/letter20.png
new file mode 100644
index 0000000..8caffca
Binary files /dev/null and b/sprite/8x8_font_lower/letter20.png differ
diff --git a/sprite/8x8_font_lower/letter21.png b/sprite/8x8_font_lower/letter21.png
new file mode 100644
index 0000000..e38c84f
Binary files /dev/null and b/sprite/8x8_font_lower/letter21.png differ
diff --git a/sprite/8x8_font_lower/letter22.png b/sprite/8x8_font_lower/letter22.png
new file mode 100644
index 0000000..324775c
Binary files /dev/null and b/sprite/8x8_font_lower/letter22.png differ
diff --git a/sprite/8x8_font_lower/letter23.png b/sprite/8x8_font_lower/letter23.png
new file mode 100644
index 0000000..1abc6cb
Binary files /dev/null and b/sprite/8x8_font_lower/letter23.png differ
diff --git a/sprite/8x8_font_lower/letter24.png b/sprite/8x8_font_lower/letter24.png
new file mode 100644
index 0000000..cef636c
Binary files /dev/null and b/sprite/8x8_font_lower/letter24.png differ
diff --git a/sprite/8x8_font_lower/letter25.png b/sprite/8x8_font_lower/letter25.png
new file mode 100644
index 0000000..3722b8d
Binary files /dev/null and b/sprite/8x8_font_lower/letter25.png differ
diff --git a/sprite/8x8_font_lower/letter26.png b/sprite/8x8_font_lower/letter26.png
new file mode 100644
index 0000000..bee5e49
Binary files /dev/null and b/sprite/8x8_font_lower/letter26.png differ
diff --git a/sprite/8x8_font_lower/letter27.png b/sprite/8x8_font_lower/letter27.png
new file mode 100644
index 0000000..c6f84a1
Binary files /dev/null and b/sprite/8x8_font_lower/letter27.png differ
diff --git a/sprite/8x8_font_lower/letter28.png b/sprite/8x8_font_lower/letter28.png
new file mode 100644
index 0000000..ca13842
Binary files /dev/null and b/sprite/8x8_font_lower/letter28.png differ
diff --git a/sprite/8x8_font_lower/letter29.png b/sprite/8x8_font_lower/letter29.png
new file mode 100644
index 0000000..13ccde2
Binary files /dev/null and b/sprite/8x8_font_lower/letter29.png differ
diff --git a/sprite/8x8_font_lower/letter30.png b/sprite/8x8_font_lower/letter30.png
new file mode 100644
index 0000000..c6092c9
Binary files /dev/null and b/sprite/8x8_font_lower/letter30.png differ
diff --git a/sprite/8x8_font_lower/letter31.png b/sprite/8x8_font_lower/letter31.png
new file mode 100644
index 0000000..1cbdae9
Binary files /dev/null and b/sprite/8x8_font_lower/letter31.png differ
diff --git a/sprite/8x8_font_lower/letter32.png b/sprite/8x8_font_lower/letter32.png
new file mode 100644
index 0000000..1a9debd
Binary files /dev/null and b/sprite/8x8_font_lower/letter32.png differ
diff --git a/sprite/8x8_font_lower/letter33.png b/sprite/8x8_font_lower/letter33.png
new file mode 100644
index 0000000..02436b8
Binary files /dev/null and b/sprite/8x8_font_lower/letter33.png differ
diff --git a/sprite/8x8_font_lower/letter34.png b/sprite/8x8_font_lower/letter34.png
new file mode 100644
index 0000000..b1f6a40
Binary files /dev/null and b/sprite/8x8_font_lower/letter34.png differ
diff --git a/sprite/8x8_font_lower/letter35.png b/sprite/8x8_font_lower/letter35.png
new file mode 100644
index 0000000..c9a814f
Binary files /dev/null and b/sprite/8x8_font_lower/letter35.png differ
diff --git a/sprite/8x8_font_lower/letter36.png b/sprite/8x8_font_lower/letter36.png
new file mode 100644
index 0000000..a48ed74
Binary files /dev/null and b/sprite/8x8_font_lower/letter36.png differ
diff --git a/sprite/8x8_font_lower/letter37.png b/sprite/8x8_font_lower/letter37.png
new file mode 100644
index 0000000..87e7175
Binary files /dev/null and b/sprite/8x8_font_lower/letter37.png differ
diff --git a/sprite/8x8_font_lower/letter38.png b/sprite/8x8_font_lower/letter38.png
new file mode 100644
index 0000000..66205e8
Binary files /dev/null and b/sprite/8x8_font_lower/letter38.png differ
diff --git a/sprite/8x8_font_lower/letter39.png b/sprite/8x8_font_lower/letter39.png
new file mode 100644
index 0000000..225c24a
Binary files /dev/null and b/sprite/8x8_font_lower/letter39.png differ
diff --git a/sprite/8x8_font_lower/letter40.png b/sprite/8x8_font_lower/letter40.png
new file mode 100644
index 0000000..529016b
Binary files /dev/null and b/sprite/8x8_font_lower/letter40.png differ
diff --git a/sprite/8x8_font_lower/letter41.png b/sprite/8x8_font_lower/letter41.png
new file mode 100644
index 0000000..ca6ee1a
Binary files /dev/null and b/sprite/8x8_font_lower/letter41.png differ
diff --git a/sprite/8x8_font_lower/letter42.png b/sprite/8x8_font_lower/letter42.png
new file mode 100644
index 0000000..9d276a9
Binary files /dev/null and b/sprite/8x8_font_lower/letter42.png differ
diff --git a/sprite/8x8_font_lower/letter43.png b/sprite/8x8_font_lower/letter43.png
new file mode 100644
index 0000000..4e1c97c
Binary files /dev/null and b/sprite/8x8_font_lower/letter43.png differ
diff --git a/sprite/8x8_font_lower/letter44.png b/sprite/8x8_font_lower/letter44.png
new file mode 100644
index 0000000..d36d145
Binary files /dev/null and b/sprite/8x8_font_lower/letter44.png differ
diff --git a/sprite/8x8_font_lower/letter45.png b/sprite/8x8_font_lower/letter45.png
new file mode 100644
index 0000000..53edcd9
Binary files /dev/null and b/sprite/8x8_font_lower/letter45.png differ
diff --git a/sprite/8x8_font_lower/letter46.png b/sprite/8x8_font_lower/letter46.png
new file mode 100644
index 0000000..946f8f6
Binary files /dev/null and b/sprite/8x8_font_lower/letter46.png differ
diff --git a/sprite/8x8_font_lower/letter47.png b/sprite/8x8_font_lower/letter47.png
new file mode 100644
index 0000000..8406570
Binary files /dev/null and b/sprite/8x8_font_lower/letter47.png differ
diff --git a/sprite/8x8_font_lower/letter48.png b/sprite/8x8_font_lower/letter48.png
new file mode 100644
index 0000000..aabd917
Binary files /dev/null and b/sprite/8x8_font_lower/letter48.png differ
diff --git a/sprite/8x8_font_lower/letter49.png b/sprite/8x8_font_lower/letter49.png
new file mode 100644
index 0000000..9fb71bf
Binary files /dev/null and b/sprite/8x8_font_lower/letter49.png differ
diff --git a/sprite/8x8_font_lower/letter50.png b/sprite/8x8_font_lower/letter50.png
new file mode 100644
index 0000000..9995d4c
Binary files /dev/null and b/sprite/8x8_font_lower/letter50.png differ
diff --git a/sprite/8x8_font_lower/letter51.png b/sprite/8x8_font_lower/letter51.png
new file mode 100644
index 0000000..0095e6d
Binary files /dev/null and b/sprite/8x8_font_lower/letter51.png differ
diff --git a/sprite/8x8_font_lower/letter52.png b/sprite/8x8_font_lower/letter52.png
new file mode 100644
index 0000000..4e31b3b
Binary files /dev/null and b/sprite/8x8_font_lower/letter52.png differ
diff --git a/sprite/8x8_font_lower/letter53.png b/sprite/8x8_font_lower/letter53.png
new file mode 100644
index 0000000..24f9a62
Binary files /dev/null and b/sprite/8x8_font_lower/letter53.png differ
diff --git a/sprite/8x8_font_lower/letter54.png b/sprite/8x8_font_lower/letter54.png
new file mode 100644
index 0000000..6656818
Binary files /dev/null and b/sprite/8x8_font_lower/letter54.png differ
diff --git a/sprite/8x8_font_lower/letter55.png b/sprite/8x8_font_lower/letter55.png
new file mode 100644
index 0000000..83df802
Binary files /dev/null and b/sprite/8x8_font_lower/letter55.png differ
diff --git a/sprite/8x8_font_lower/letter56.png b/sprite/8x8_font_lower/letter56.png
new file mode 100644
index 0000000..46d33c6
Binary files /dev/null and b/sprite/8x8_font_lower/letter56.png differ
diff --git a/sprite/8x8_font_lower/letter57.png b/sprite/8x8_font_lower/letter57.png
new file mode 100644
index 0000000..33bfa16
Binary files /dev/null and b/sprite/8x8_font_lower/letter57.png differ
diff --git a/sprite/8x8_font_lower/letter58.png b/sprite/8x8_font_lower/letter58.png
new file mode 100644
index 0000000..3e12a68
Binary files /dev/null and b/sprite/8x8_font_lower/letter58.png differ
diff --git a/sprite/8x8_font_lower/letter59.png b/sprite/8x8_font_lower/letter59.png
new file mode 100644
index 0000000..2576d7c
Binary files /dev/null and b/sprite/8x8_font_lower/letter59.png differ
diff --git a/sprite/8x8_font_lower/letter60.png b/sprite/8x8_font_lower/letter60.png
new file mode 100644
index 0000000..cef64f2
Binary files /dev/null and b/sprite/8x8_font_lower/letter60.png differ
diff --git a/sprite/8x8_font_lower/letter61.png b/sprite/8x8_font_lower/letter61.png
new file mode 100644
index 0000000..42636fa
Binary files /dev/null and b/sprite/8x8_font_lower/letter61.png differ
diff --git a/sprite/8x8_font_lower/letter62.png b/sprite/8x8_font_lower/letter62.png
new file mode 100644
index 0000000..870eb76
Binary files /dev/null and b/sprite/8x8_font_lower/letter62.png differ
diff --git a/sprite/8x8_font_lower/letter63.png b/sprite/8x8_font_lower/letter63.png
new file mode 100644
index 0000000..0c41790
Binary files /dev/null and b/sprite/8x8_font_lower/letter63.png differ
diff --git a/sprite/8x8_font_lower/letter64.png b/sprite/8x8_font_lower/letter64.png
new file mode 100644
index 0000000..c123d8e
Binary files /dev/null and b/sprite/8x8_font_lower/letter64.png differ
diff --git a/sprite/8x8_font_lower/letter65.png b/sprite/8x8_font_lower/letter65.png
new file mode 100644
index 0000000..15cb29e
Binary files /dev/null and b/sprite/8x8_font_lower/letter65.png differ
diff --git a/sprite/8x8_font_lower/letter66.png b/sprite/8x8_font_lower/letter66.png
new file mode 100644
index 0000000..f2d1feb
Binary files /dev/null and b/sprite/8x8_font_lower/letter66.png differ
diff --git a/sprite/8x8_font_lower/letter67.png b/sprite/8x8_font_lower/letter67.png
new file mode 100644
index 0000000..2124007
Binary files /dev/null and b/sprite/8x8_font_lower/letter67.png differ
diff --git a/sprite/8x8_font_lower/letter68.png b/sprite/8x8_font_lower/letter68.png
new file mode 100644
index 0000000..eb44d3a
Binary files /dev/null and b/sprite/8x8_font_lower/letter68.png differ
diff --git a/sprite/8x8_font_lower/letter69.png b/sprite/8x8_font_lower/letter69.png
new file mode 100644
index 0000000..566cf2e
Binary files /dev/null and b/sprite/8x8_font_lower/letter69.png differ
diff --git a/sprite/8x8_font_lower/letter70.png b/sprite/8x8_font_lower/letter70.png
new file mode 100644
index 0000000..b27bab4
Binary files /dev/null and b/sprite/8x8_font_lower/letter70.png differ
diff --git a/sprite/8x8_font_lower/letter71.png b/sprite/8x8_font_lower/letter71.png
new file mode 100644
index 0000000..4feb4ba
Binary files /dev/null and b/sprite/8x8_font_lower/letter71.png differ
diff --git a/sprite/8x8_font_lower/letter72.png b/sprite/8x8_font_lower/letter72.png
new file mode 100644
index 0000000..1d32c4e
Binary files /dev/null and b/sprite/8x8_font_lower/letter72.png differ
diff --git a/sprite/8x8_font_lower/letter73.png b/sprite/8x8_font_lower/letter73.png
new file mode 100644
index 0000000..4ee0d7b
Binary files /dev/null and b/sprite/8x8_font_lower/letter73.png differ
diff --git a/sprite/8x8_font_lower/letter74.png b/sprite/8x8_font_lower/letter74.png
new file mode 100644
index 0000000..ceb13a0
Binary files /dev/null and b/sprite/8x8_font_lower/letter74.png differ
diff --git a/sprite/8x8_font_lower/letter75.png b/sprite/8x8_font_lower/letter75.png
new file mode 100644
index 0000000..7fbd4f9
Binary files /dev/null and b/sprite/8x8_font_lower/letter75.png differ
diff --git a/sprite/8x8_font_lower/letter76.png b/sprite/8x8_font_lower/letter76.png
new file mode 100644
index 0000000..2e7e5ec
Binary files /dev/null and b/sprite/8x8_font_lower/letter76.png differ
diff --git a/sprite/8x8_font_lower/letter77.png b/sprite/8x8_font_lower/letter77.png
new file mode 100644
index 0000000..261ccc3
Binary files /dev/null and b/sprite/8x8_font_lower/letter77.png differ
diff --git a/sprite/8x8_font_lower/letter78.png b/sprite/8x8_font_lower/letter78.png
new file mode 100644
index 0000000..3fdf865
Binary files /dev/null and b/sprite/8x8_font_lower/letter78.png differ
diff --git a/sprite/8x8_font_lower/letter79.png b/sprite/8x8_font_lower/letter79.png
new file mode 100644
index 0000000..cdb30d2
Binary files /dev/null and b/sprite/8x8_font_lower/letter79.png differ
diff --git a/sprite/8x8_font_lower/letter80.png b/sprite/8x8_font_lower/letter80.png
new file mode 100644
index 0000000..23de3be
Binary files /dev/null and b/sprite/8x8_font_lower/letter80.png differ
diff --git a/sprite/8x8_font_lower/letter81.png b/sprite/8x8_font_lower/letter81.png
new file mode 100644
index 0000000..d8636ba
Binary files /dev/null and b/sprite/8x8_font_lower/letter81.png differ
diff --git a/sprite/8x8_font_lower/letter82.png b/sprite/8x8_font_lower/letter82.png
new file mode 100644
index 0000000..b786659
Binary files /dev/null and b/sprite/8x8_font_lower/letter82.png differ
diff --git a/sprite/8x8_font_lower/letter83.png b/sprite/8x8_font_lower/letter83.png
new file mode 100644
index 0000000..4a94193
Binary files /dev/null and b/sprite/8x8_font_lower/letter83.png differ
diff --git a/sprite/8x8_font_lower/letter84.png b/sprite/8x8_font_lower/letter84.png
new file mode 100644
index 0000000..018d44b
Binary files /dev/null and b/sprite/8x8_font_lower/letter84.png differ
diff --git a/sprite/8x8_font_lower/letter85.png b/sprite/8x8_font_lower/letter85.png
new file mode 100644
index 0000000..0fd99bd
Binary files /dev/null and b/sprite/8x8_font_lower/letter85.png differ
diff --git a/sprite/8x8_font_lower/letter86.png b/sprite/8x8_font_lower/letter86.png
new file mode 100644
index 0000000..fae87c6
Binary files /dev/null and b/sprite/8x8_font_lower/letter86.png differ
diff --git a/sprite/8x8_font_lower/letter87.png b/sprite/8x8_font_lower/letter87.png
new file mode 100644
index 0000000..231603c
Binary files /dev/null and b/sprite/8x8_font_lower/letter87.png differ
diff --git a/sprite/8x8_font_lower/letter88.png b/sprite/8x8_font_lower/letter88.png
new file mode 100644
index 0000000..d19962b
Binary files /dev/null and b/sprite/8x8_font_lower/letter88.png differ
diff --git a/sprite/8x8_font_lower/letter89.png b/sprite/8x8_font_lower/letter89.png
new file mode 100644
index 0000000..171e76a
Binary files /dev/null and b/sprite/8x8_font_lower/letter89.png differ
diff --git a/sprite/8x8_font_lower/letter90.png b/sprite/8x8_font_lower/letter90.png
new file mode 100644
index 0000000..cde8e24
Binary files /dev/null and b/sprite/8x8_font_lower/letter90.png differ
diff --git a/sprite/8x8_font_lower/letter91.png b/sprite/8x8_font_lower/letter91.png
new file mode 100644
index 0000000..b571882
Binary files /dev/null and b/sprite/8x8_font_lower/letter91.png differ
diff --git a/sprite/8x8_font_lower/letter92.png b/sprite/8x8_font_lower/letter92.png
new file mode 100644
index 0000000..bfc612a
Binary files /dev/null and b/sprite/8x8_font_lower/letter92.png differ
diff --git a/sprite/8x8_font_lower/letter93.png b/sprite/8x8_font_lower/letter93.png
new file mode 100644
index 0000000..c2236ee
Binary files /dev/null and b/sprite/8x8_font_lower/letter93.png differ
diff --git a/sprite/font_big.png b/sprite/font_big.png
new file mode 100644
index 0000000..8e075b0
Binary files /dev/null and b/sprite/font_big.png differ
diff --git a/sprite/logo.png b/sprite/logo.png
new file mode 100644
index 0000000..8b19b1e
Binary files /dev/null and b/sprite/logo.png differ
diff --git a/sprite/logo_big.png b/sprite/logo_big.png
new file mode 100644
index 0000000..6b43031
Binary files /dev/null and b/sprite/logo_big.png differ
diff --git a/sprite/z80-8x8.ttf b/sprite/z80-8x8.ttf
new file mode 100644
index 0000000..155bc9d
Binary files /dev/null and b/sprite/z80-8x8.ttf differ
diff --git a/LICENSE b/z80screentest/LICENSE
similarity index 100%
rename from LICENSE
rename to z80screentest/LICENSE
diff --git a/README.md b/z80screentest/README.md
similarity index 100%
rename from README.md
rename to z80screentest/README.md
diff --git a/program b/z80screentest/program
similarity index 100%
rename from program
rename to z80screentest/program
diff --git a/program.cpp b/z80screentest/program.cpp
similarity index 100%
rename from program.cpp
rename to z80screentest/program.cpp
diff --git a/spriteconvert/array.txt b/z80screentest/spriteconvert/array.txt
similarity index 100%
rename from spriteconvert/array.txt
rename to z80screentest/spriteconvert/array.txt
diff --git a/spriteconvert/program b/z80screentest/spriteconvert/program
similarity index 100%
rename from spriteconvert/program
rename to z80screentest/spriteconvert/program
diff --git a/spriteconvert/program.cpp b/z80screentest/spriteconvert/program.cpp
similarity index 100%
rename from spriteconvert/program.cpp
rename to z80screentest/spriteconvert/program.cpp
diff --git a/spriteconvert/script.py b/z80screentest/spriteconvert/script.py
similarity index 100%
rename from spriteconvert/script.py
rename to z80screentest/spriteconvert/script.py
diff --git a/z80screentest/spriteconvert/sprite/letter00.png b/z80screentest/spriteconvert/sprite/letter00.png
new file mode 100644
index 0000000..5afb41a
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter00.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter01.png b/z80screentest/spriteconvert/sprite/letter01.png
new file mode 100644
index 0000000..de59952
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter01.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter02.png b/z80screentest/spriteconvert/sprite/letter02.png
new file mode 100644
index 0000000..2347ae8
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter02.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter03.png b/z80screentest/spriteconvert/sprite/letter03.png
new file mode 100644
index 0000000..3671518
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter03.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter04.png b/z80screentest/spriteconvert/sprite/letter04.png
new file mode 100644
index 0000000..2dc53c3
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter04.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter05.png b/z80screentest/spriteconvert/sprite/letter05.png
new file mode 100644
index 0000000..2cbd40f
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter05.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter06.png b/z80screentest/spriteconvert/sprite/letter06.png
new file mode 100644
index 0000000..3051e14
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter06.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter07.png b/z80screentest/spriteconvert/sprite/letter07.png
new file mode 100644
index 0000000..00b8c96
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter07.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter08.png b/z80screentest/spriteconvert/sprite/letter08.png
new file mode 100644
index 0000000..9415f3f
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter08.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter09.png b/z80screentest/spriteconvert/sprite/letter09.png
new file mode 100644
index 0000000..2aa959f
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter09.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter10.png b/z80screentest/spriteconvert/sprite/letter10.png
new file mode 100644
index 0000000..9e7bcc7
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter10.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter11.png b/z80screentest/spriteconvert/sprite/letter11.png
new file mode 100644
index 0000000..ed092ad
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter11.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter12.png b/z80screentest/spriteconvert/sprite/letter12.png
new file mode 100644
index 0000000..e9292db
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter12.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter13.png b/z80screentest/spriteconvert/sprite/letter13.png
new file mode 100644
index 0000000..a4d4713
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter13.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter14.png b/z80screentest/spriteconvert/sprite/letter14.png
new file mode 100644
index 0000000..1e9a572
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter14.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter15.png b/z80screentest/spriteconvert/sprite/letter15.png
new file mode 100644
index 0000000..e30432e
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter15.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter16.png b/z80screentest/spriteconvert/sprite/letter16.png
new file mode 100644
index 0000000..172520a
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter16.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter17.png b/z80screentest/spriteconvert/sprite/letter17.png
new file mode 100644
index 0000000..ceb826a
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter17.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter18.png b/z80screentest/spriteconvert/sprite/letter18.png
new file mode 100644
index 0000000..71939f6
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter18.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter19.png b/z80screentest/spriteconvert/sprite/letter19.png
new file mode 100644
index 0000000..23cf3b0
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter19.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter20.png b/z80screentest/spriteconvert/sprite/letter20.png
new file mode 100644
index 0000000..8caffca
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter20.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter21.png b/z80screentest/spriteconvert/sprite/letter21.png
new file mode 100644
index 0000000..e38c84f
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter21.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter22.png b/z80screentest/spriteconvert/sprite/letter22.png
new file mode 100644
index 0000000..324775c
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter22.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter23.png b/z80screentest/spriteconvert/sprite/letter23.png
new file mode 100644
index 0000000..1abc6cb
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter23.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter24.png b/z80screentest/spriteconvert/sprite/letter24.png
new file mode 100644
index 0000000..cef636c
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter24.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter25.png b/z80screentest/spriteconvert/sprite/letter25.png
new file mode 100644
index 0000000..3722b8d
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter25.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter26.png b/z80screentest/spriteconvert/sprite/letter26.png
new file mode 100644
index 0000000..bee5e49
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter26.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter27.png b/z80screentest/spriteconvert/sprite/letter27.png
new file mode 100644
index 0000000..c6f84a1
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter27.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter28.png b/z80screentest/spriteconvert/sprite/letter28.png
new file mode 100644
index 0000000..ca13842
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter28.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter29.png b/z80screentest/spriteconvert/sprite/letter29.png
new file mode 100644
index 0000000..13ccde2
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter29.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter30.png b/z80screentest/spriteconvert/sprite/letter30.png
new file mode 100644
index 0000000..c6092c9
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter30.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter31.png b/z80screentest/spriteconvert/sprite/letter31.png
new file mode 100644
index 0000000..1cbdae9
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter31.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter32.png b/z80screentest/spriteconvert/sprite/letter32.png
new file mode 100644
index 0000000..1a9debd
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter32.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter33.png b/z80screentest/spriteconvert/sprite/letter33.png
new file mode 100644
index 0000000..02436b8
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter33.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter34.png b/z80screentest/spriteconvert/sprite/letter34.png
new file mode 100644
index 0000000..b1f6a40
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter34.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter35.png b/z80screentest/spriteconvert/sprite/letter35.png
new file mode 100644
index 0000000..1e9a572
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter35.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter36.png b/z80screentest/spriteconvert/sprite/letter36.png
new file mode 100644
index 0000000..a48ed74
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter36.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter37.png b/z80screentest/spriteconvert/sprite/letter37.png
new file mode 100644
index 0000000..87e7175
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter37.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter38.png b/z80screentest/spriteconvert/sprite/letter38.png
new file mode 100644
index 0000000..66205e8
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter38.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter39.png b/z80screentest/spriteconvert/sprite/letter39.png
new file mode 100644
index 0000000..225c24a
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter39.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter40.png b/z80screentest/spriteconvert/sprite/letter40.png
new file mode 100644
index 0000000..529016b
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter40.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter41.png b/z80screentest/spriteconvert/sprite/letter41.png
new file mode 100644
index 0000000..ca6ee1a
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter41.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter42.png b/z80screentest/spriteconvert/sprite/letter42.png
new file mode 100644
index 0000000..9d276a9
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter42.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter43.png b/z80screentest/spriteconvert/sprite/letter43.png
new file mode 100644
index 0000000..4e1c97c
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter43.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter44.png b/z80screentest/spriteconvert/sprite/letter44.png
new file mode 100644
index 0000000..c67029f
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter44.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter45.png b/z80screentest/spriteconvert/sprite/letter45.png
new file mode 100644
index 0000000..0487a3f
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter45.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter46.png b/z80screentest/spriteconvert/sprite/letter46.png
new file mode 100644
index 0000000..946f8f6
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter46.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter47.png b/z80screentest/spriteconvert/sprite/letter47.png
new file mode 100644
index 0000000..8406570
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter47.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter48.png b/z80screentest/spriteconvert/sprite/letter48.png
new file mode 100644
index 0000000..aabd917
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter48.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter49.png b/z80screentest/spriteconvert/sprite/letter49.png
new file mode 100644
index 0000000..9fb71bf
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter49.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter50.png b/z80screentest/spriteconvert/sprite/letter50.png
new file mode 100644
index 0000000..9995d4c
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter50.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter51.png b/z80screentest/spriteconvert/sprite/letter51.png
new file mode 100644
index 0000000..0095e6d
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter51.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter52.png b/z80screentest/spriteconvert/sprite/letter52.png
new file mode 100644
index 0000000..4e31b3b
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter52.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter53.png b/z80screentest/spriteconvert/sprite/letter53.png
new file mode 100644
index 0000000..24f9a62
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter53.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter54.png b/z80screentest/spriteconvert/sprite/letter54.png
new file mode 100644
index 0000000..6656818
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter54.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter55.png b/z80screentest/spriteconvert/sprite/letter55.png
new file mode 100644
index 0000000..83df802
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter55.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter56.png b/z80screentest/spriteconvert/sprite/letter56.png
new file mode 100644
index 0000000..46d33c6
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter56.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter57.png b/z80screentest/spriteconvert/sprite/letter57.png
new file mode 100644
index 0000000..33bfa16
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter57.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter58.png b/z80screentest/spriteconvert/sprite/letter58.png
new file mode 100644
index 0000000..3e12a68
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter58.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter59.png b/z80screentest/spriteconvert/sprite/letter59.png
new file mode 100644
index 0000000..2576d7c
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter59.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter60.png b/z80screentest/spriteconvert/sprite/letter60.png
new file mode 100644
index 0000000..cef64f2
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter60.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter61.png b/z80screentest/spriteconvert/sprite/letter61.png
new file mode 100644
index 0000000..42636fa
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter61.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter62.png b/z80screentest/spriteconvert/sprite/letter62.png
new file mode 100644
index 0000000..870eb76
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter62.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter63.png b/z80screentest/spriteconvert/sprite/letter63.png
new file mode 100644
index 0000000..0c41790
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter63.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter64.png b/z80screentest/spriteconvert/sprite/letter64.png
new file mode 100644
index 0000000..c123d8e
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter64.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter65.png b/z80screentest/spriteconvert/sprite/letter65.png
new file mode 100644
index 0000000..15cb29e
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter65.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter66.png b/z80screentest/spriteconvert/sprite/letter66.png
new file mode 100644
index 0000000..f2d1feb
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter66.png differ
diff --git a/z80screentest/spriteconvert/sprite/letter67.png b/z80screentest/spriteconvert/sprite/letter67.png
new file mode 100644
index 0000000..0d9abbb
Binary files /dev/null and b/z80screentest/spriteconvert/sprite/letter67.png differ