ITS Muddle.
[pdp10-muddle.git] / MUDDLE / graphs.ura001
diff --git a/MUDDLE/graphs.ura001 b/MUDDLE/graphs.ura001
new file mode 100644 (file)
index 0000000..20a73fc
--- /dev/null
@@ -0,0 +1,227 @@
+         
+\r<SET FNCTG <FUNCTION (XL XH FNCT "OPTIONAL" (SCALE (0 0)) (XYDIS (0 0))
+\r    (P 60) );"THIS FUNCTION WILL PLOT ANY FUNCTION OF THE FORM
+\r              Y=F(X),FOR X = .XL TO .XH WITH P POINTS IN IT.
+\r              SCALE,XYDIS, AND P ARE OPTIONAL, AND IF OMITTED
+\r              THE PROGRAM WILL AUTOMATICALLY SCALE F(X)."
+\r    <PROG (X Y DX X1 YM HPTS N SX SY)
+\r        <SET DX </ <FLOAT <- .XH .XL>> .P>> <SET X1 .XL>
+\r        <SET X <SET Y ()>>
+\r     LFX <SET X (!.X .X1)>
+\r        <SET Y (!.Y <.FNCT .X1>)>
+\r        <SET X1 <+ .X1 .DX>>
+\r        <COND (<NOT <G? .X1 .XH>> <GO LFX>)>
+\r        <COND (<NOT <==? <+ !.SCALE> 0>> <SET HPTS .XYDIS>
+\r            <GO NAS>)>
+\r        <SET YM <MINIMAX .Y>>
+\r        <SET SCALE (</ 800.0 <- .XH .XL>> </ -800.0 <- !.YM>>)>
+\r        <SET HPTS (<* 0.5 <+ .XL .XH>> <* 0.5 <+ !.YM>>)>
+\r    NAS <SET N 1>
+\r    LSC <PUT .X .N <FIX <+ <* <1 .SCALE> <- <.N .X> <1 .HPTS> >>
+\r           500>>>
+\r       <PUT .Y .N <FIX <+ <* <2 .SCALE> <- <.N .Y> <2 .HPTS> >>
+\r           400>>>
+\r        <SET N <+ .N 1>>
+\r         <COND (<NOT <G? .N <LENGTH .X>>> <GO LSC>)>
+\r         <PLOTV .X .Y>
+\r         <COND ( <NOT <G? 100 <SET SX <FIX <+ <* <1 .SCALE>
+\r              <- 0.0 <1 .HPTS>>> 500>>> >>
+\r                  <COND ( <NOT <G? .SX 900>> <LINE .SX 00 .SX 800> )> )>
+\r         <COND ( <NOT <G? 0 <SET SY <FIX <+ <* <2 .SCALE>
+\r              <- 0.0 <2 .HPTS>>> 400>>> >>
+\r                  <COND ( <NOT <G? .SY 800 >> <LINE 100 .SY 900 .SY> )> )>
+\r         <MOVE 0 800>
+\r         <RETURN ("XMIN
+\r" .XL "
+\rXMAX
+\r" .XH "
+\rYMIN
+\r" <1 .YM> "
+\rYMAX
+\r" <2 .YM> "
+\rSCALE
+\r" .SCALE )>
+\r>>>
+\r<SET MINIMAX <FUNCTION (X)
+\r    <REPEAT ((N 2) (L <LENGTH .X>) (BIG <1 .X>) (SMALL <1 .X>))
+\r       <COND ( <G? <.N .X> .BIG> <SET BIG <.N .X>> )>
+\r       <COND ( <L? <.N .X> .SMALL> <SET SMALL <.N .X>> )>
+\r       <SET N <+ .N 1>>
+\r       <COND ( <G? .N .L> <RETURN (.SMALL .BIG)> )>
+\r>>>
+\r<SET MTRIANGLE <FUNCTION ()
+\r    <MOVE 170 285><DRAW 170 650><DRAW 200 670>
+\r    <DRAW 515 485><DRAW 515 450><DRAW 200 260>
+\r    <DRAW 170 285>
+\r
+\r    <DRAW 200 300><DRAW 200 670><MOVE 200 630>
+\r    <DRAW 515 450><MOVE 480 470><DRAW 480 505>
+\r    <MOVE 480 470><DRAW 200 300><DRAW 230 280>
+\r
+\r    <MOVE 235 360><DRAW 235 605><MOVE 235 570>
+\r    <DRAW 445 445><MOVE 410 465><DRAW 200 340>
+\r
+\r    <MOVE 0 200> "MOBIUS TRANGLE"
+\r>>
+\r
+\r<SET ELIPSE <FUNCTION (X Y A B P) ;"THIS FUNCTION WILL DRAW AN
+\r                                    ELIPSE WITH CENTER AT (X Y)
+\r                                    ,(A B),AND P POINTS IN IT."
+\r     <PROG (I)
+\r        <MOVE <+ .X .A > .Y>
+\r        <SET I </ 6.283 .P>>
+\r        <REPEAT ((Q .I))
+\r            <DRAW <FIX <+ .X <* .A <COS .Q>>>>
+\r                  <FIX <+ .Y <* .B <SIN .Q>>>>>
+\r            SET Q <+ .Q .I>>
+\r            <COND ( <G? .Q <+ .I  6.283>> <RETURN "DONE"> )>
+\r>>>><SET CIRCLE <FUNCTION (X Y R P) ;"THIS FUNCTION WILL DRAW
+\r                                   A CIRLE WITH CENTER AT (X Y)
+\r                                  ,RADIUS R,AND P POINTS IN IT."
+\r   <PROG (I)
+\r       <MOVE <+ .X .R> .Y>
+\r       <SET I </ 6.283 .P>>
+\r       <REPEAT ((Q .I))
+\r           <DRAW <FIX <+ .X <* .R <COS .Q>>>>
+\r                 <FIX <+ .Y <* .R <SIN .Q>>>>>
+\r           <SET Q <+ .Q .I>>
+\r           <COND ( <G? .Q <+ .I 6.283>>  <RETURN "DONE"> )>
+\r>>>>
+\r<SET PLVTEST <FUNCTION ()
+\r    <PROG (X Y XY)
+\r    <SET X ( <+ 500 <1 <WITCH .2>>> )>
+\r        <SET Y ( <2 <WITCH .2>> )>
+\r        <LINE 0 0 1000 0>
+\r        <LINE 500 0 500 800>
+\r        <REPEAT ((P .2))
+\r            <SET XY <WITCH .P>>
+\r            <SET X ( !.X <1 .XY> )>
+\r            <SET Y (!.Y <2 .XY>)>
+\r            <SET P <+ .P .04>>
+\r            <COND ( <G? .P 2.9> <RETURN <PLOTV .X .Y>>)>
+\r>>>>
+\r<SET WITCH <FUNCTION (P)
+\r    ( <FIX <+ 500 <* 100.0 </ <COS .P> <SIN .P>>>>> 
+\r      <FIX <* 200.0 <- 1.0 <COS <* 2.0 .P>>>>> )
+\r>>
+\r<SET PLOTV <FUNCTION (X Y) "THIS FUNCTION PLOTS VECTOR X AGAINST
+\r                             VECTOR Y,IT WORKS FOR LISTS TOO.
+\r                             IT MOVES TO THE FIRST POINT AND DRAWS
+\r                             TO THE REST."
+\r    <PROG (L LIST N)
+\r        <COND ( <NOT <==? <LENGTH .X> <LENGTH .Y>>>
+\r            <RETURN "ERROR...LENGTHS NOT EQUAL."> )>
+\r        <SET L <LENGTH .X>>
+\r        <SET LIST (29)>
+\r        <SET N 1>
+\r LOOP   <SET LIST (!.LIST !<TRANS <.N .X> <.N .Y>> )>
+\r        <SET N <+ .N 1>>
+\r        <COND ( <G? .N .L>
+\r            <GO ZAP>)>
+\r        <GO LOOP>
+\r  ZAP   <SEND .LIST>
+\r        <RETURN "DONE">
+\r>>>
+\r<SET SINCURV <FUNCTION ()
+\r                        <MOVE 0 400>
+\r                       <REPEAT ((X 0)<F <* 400.0 <+ 1.0
+\r                                       <SIN </ .X 100.0>>>>>>
+\r                                       <COND (<G? .X 625> <RETURN
+\r                                       "DONE"> )> <SET X <+ .X 5>>
+\r>>>
+\r<SET TEST3 <FUNCTION ()
+\r                      <LINE 0 0 0 800>
+\r                      <LINE 0 400 1000 400>
+\r                      <TEST>
+\r                      <SINCURV>
+\r>>
+\r<SET MOVE <FUNCTION (X Y) ;"THIS FUNCTION WILL MOVE THE BEAM
+\r                             OF THE SCOPE TO (X Y). IT MUST BE CALLED
+\r                             BEFORE DRAW BECAUSE IT SETS THE SCOPE IN
+\r                             GRAPHICS MODE."
+\r                     <SEND (29 !<TRANS .X .Y> )>
+\r>>
+\r
+\r<SET DRAW <FUNCTION (X Y) ;"THIS FUNCTION DRAWS FROM WHERE THE BEAM
+\r                           WAS TO (X Y).MOVE MUST BE USED BEFORE THE
+\r                           FIRST DRAW, ALSO DON'T GO BACK INTO
+\r                           ALPHA MODE INBETWEEN DRAWS."
+\r                    <SEND <TRANS .X .Y>>
+\r>>
+\r<SET TEST2 <FUNCTION () <PROG (X Y Z)
+\r                               <SET Z <LINE 300 0 700 0>>
+\r                               <SET Z <LINE 500 0 500 780>>
+\r                               <SET X 300>
+\r                          LOOP <SET Y </ <* <- .X 500> <- .X 500>> 40>>
+\r                               <SET Z <POINT .X .Y>>
+\r                               <COND (<G? .X 699> <RETURN "DONE">)>
+\r                               <SET X <+ .X 1>>
+\r                               <GO LOOP>
+\r>>>
+\r<SET LINE <FUNCTION (X1 Y1 X2 Y2) <PROG (A B)
+\r                      ;"THIS PROGRAM WILL DRAW A LINE FROM (X1,Y1)
+\r                         TO (X2,Y2) ON THE SCOPE. AGAIN THE RANGE
+\r                         OF THE X'S AND Y'S IS 0 TO 1024."
+\r                       <SET A <TRANS .X1 .Y1>>
+\r                       <SET B <TRANS .X2 .Y2>>
+\r                       <RETURN <SEND (29 !.A !.B)>>
+\r>>>
+\r<SET TEST1 <FUNCTION () <PROG (X Y Z D)
+\r                                 <SET X 400>
+\r                            LOOP <SET Y </ <* <- .X 500> <- .X 500>> 10>>
+\r                                 <SET Z <POINT .X .Y>>
+\r                                 <SET D <POINT .X 0>>
+\r                                 <SET D <POINT 500 .Y>>
+\r                                 <COND (<G? .X 599> <RETURN "DONE"> )>
+\r                                 <SET X <+ .X 1>>
+\r                                 <GO LOOP>
+\r>>>
+\r<SET TEST <FUNCTION () <PROG (X Y Z D)
+\r                              <SET X 0>
+\r                         LOOP <SET Y </ <* .X .X> 10>>
+\r                              <SET Z <POINT .X .Y>>
+\r                             <COND (<==? .X 100> <RETURN "DONE">)>
+\r                             <SET X <+ .X 1>>
+\r                     <GO LOOP>
+\r>>>
+\r<SET POINT <FUNCTION (X Y) <PROG (D LIST) ;"THIS PROGRAMM DISPLAYS A 
+\r                                            POINT ON THE 4010'S SCREEN
+\r                                           THE X AND Y CO-ORDINENTS
+\r                                            SHOULD BE IN THE RANGE OF
+\r                                            0 THRU 1024."
+\r                                 <SET D <TRANS .X .Y>>
+\r                                 <SET LIST (29 !.D !.D)>
+\r                                 <RETURN <SEND .LIST>>
+\r>>>
+\r<SET SEND <FUNCTION (LIST) ;"THIS FUNCTION TRANSMITS THE CHARACTERS TO
+\r                              THE TECKRONIX 4010.TO WORK RIGHT YOU MUST
+\r                              HAVE TYPED (^_)S(CR) AT MONIT."
+\r                     <PROG (L N D) ;"D IS A DUMMY VAR. THAT HOLDS THE
+\r                                     UNWANTED THINGS THAT IMAGE RETURNS"
+\r                           <SET L <LENGTH .LIST>>
+\r                           <SET N 1>
+\r                      LOOP <COND ( <G? .N .L> <RETURN 1> )>
+\r                                  ;"ALL GOOD FUNCTIONS RETURN SOMETHING
+\r                                    THEREFORE SEND RETURNS 1."
+\r                           <SET D <IMAGE <.N .LIST>>>
+\r                           <SET N <+ .N 1>>
+\r                           <GO LOOP>
+\r>>>
+\r<SET PAGE <FUNCTION () ;"THIS FUNCTION ERASES THE SCREEN ON THE 4010."
+\r                     <SEND (27 12)>
+\r>>
+\r<SET TRANS <FUNCTION (X Y) ;"THIS FUNCTION TAKES THE X,Y CO-ORDINANTS
+\r                              AND TRANSLATES THEM INTO 4 ASCII CHARATERS
+\r                             FOR THE 4010"
+\r                      <PROG (LX HX LY HY)
+\r                            <SET HX <FIX </ .X 32>>>
+\r                            <SET HY <FIX </ .Y 32>>>
+\r                            <SET LX <- .X <* .HX 32>>>
+\r                            <SET LY <- .Y <* .HY 32>>>
+\r                            <SET HY <+ .HY 32>>
+\r                            <SET LY <+ .LY 96>>
+\r                            <SET HX <+ .HX 32>>
+\r                            <SET LX <+ .LX 64>>
+\r                            <RETURN (.HY .LY .HX .LX)>
+\r>>>
+\f\ 3\f
\ No newline at end of file