home *** CD-ROM | disk | FTP | other *** search
/ Micro R&D 1 / MicroRD-CD-ROM-Vol1-1994.iso / os20 / cdity / switchntsc_v3_2.lha / switchntsc / txt / SwitchNTSC.mod < prev    next >
Text File  |  1992-09-06  |  23KB  |  705 lines

  1. (*----------------------------------------------------------------------------
  2.  :Program.      SwitchNTSC.mod
  3.  :Contents.     Turns on NTSC for every screen opened via OpenScreen(TagList).
  4.  :Author.       Mario Kemper
  5.  :Address.      GeistStr. 53, D-4780 Lippstadt
  6.  :Phone.        02941/58635
  7.  :E-Mail.       magick@uni-paderborn.de
  8.  :Copyright.    Public Domain
  9.  :Language.     Oberon
  10.  :Translator.   Amiga Oberon Compiler V2.14d
  11.  :Imports.      CXLib
  12.  :History.      V2.4  -unknown- [Mario] First release Version.                        
  13.  :History.      V2.5  23-Nov-91 [Mario] Removed Autoscroll bug.                       
  14.  :History.      V2.6  01-Jan-92 [Mario] Now reads arguments from CLI. 
  15.  :History.      V2.7  04-Jan-92 [Mario] Now you can use real PAL-Screens.
  16.  :History.      V2.8  06-Jan-92 [Mario] Cli-Args and PAL-Bug removed.
  17.  :History.      V2.9  15-Jan-92 [Mario] Disables Filter while Requester is active.
  18.  :History.      V2.10 21-Feb-92 [Mario] Now patches OpenScreenTags,too.
  19.  :History.      V2.11 29-Feb-92 [Mario] NewLook Option implemented.
  20.  :History.      V3.0  21-May-92 [Mario] Now has PopUp-Window.
  21.  :History.      V3.1  03-Jun-92 [Mario] Memory loss bug removed.
  22.  :History.      V3.2  05-Sep-92 [Mario] StackChk-Bug removed.
  23.  :Bugs.         Might crash if other programs patched Openscreen.
  24.  :Usage.        Put it in the WBStartup or run it from CLI.
  25.  :Remarks.      Don't compile with SMALLDATA.
  26. ----------------------------------------------------------------------------*)
  27. MODULE SwitchNTSC;
  28.  
  29. IMPORT e  : Exec,
  30.        cx : CXLib,
  31.        com: Commodities,
  32.        int: Intuition,
  33.        gr : Graphics,
  34.        u  : Utility,
  35.        s  : SYSTEM,(* $IF Output *)io,(* $END *)
  36.        gad: GadTools;
  37.        
  38.  
  39. CONST DefCXPri = 0;
  40.       DefCXPopKey= "lalt esc";
  41.       SwitchID = 42;
  42.       VERSIONSTRING = "$VER: SwitchNTSC 3.2 (05-Sep-92) © Mario Kemper";
  43.       SMALLVERSION  = "SwitchNTSC 3.2 © Mario Kemper";
  44.       patchText = 0;       
  45.       patch     = 1;
  46.       newText   = 2;
  47.       newLook   = 3;
  48.       palText   = 4;
  49.       pal       = 5;
  50.       hide      = 6;
  51.       quit      = 7;
  52.       center    = 8;
  53.       centerText= 9; 
  54.       
  55. TYPE TagArray = POINTER TO ARRAY 7 OF u.TagItem;
  56.      OpenScreenProc = PROCEDURE (ens{8}:int.ExtNewScreenPtr):int.ScreenPtr;
  57.      OpenScreenTagsProc = PROCEDURE (ns{8}:int.NewScreenPtr;
  58.                                     tags{9}:TagArray):int.ScreenPtr;
  59.      Action = RECORD 
  60.                 action: INTEGER;                                    
  61.                 doIt  : BOOLEAN;
  62.               END;       
  63.                          
  64. VAR   OldOpenScreen     : OpenScreenProc;
  65.       OldOpenScreenTags : OpenScreenTagsProc;
  66.       MyPort            : e.MsgPortPtr;      
  67.       CxMsg             : com.CxMsgPtr;
  68.       msg               : e.MessagePtr;
  69.       MyNewBroker       : com.NewBroker;
  70.       Broker, 
  71.       Filter            : com.CxObjPtr;
  72.       Key               : cx.StrPtr;
  73.       ToolTypes         : cx.ToolTypeArray;
  74.       MsgType           : LONGSET;
  75.       MsgID,long,
  76.       error             : LONGINT;
  77.       PATCHED,LETGO     : BOOLEAN;
  78.       Version,SVersion  : e.STRPTR;
  79.       PAL,NEWLOOK,
  80.       WINDOW,POPUP,
  81.       BYPASS,CENTER     : BOOLEAN;
  82.       cxSig,winSig      : INTEGER;
  83.       Signal            : LONGSET;
  84.       winPtr            : int.WindowPtr;
  85.       gads              : ARRAY 10 OF int.GadgetPtr;    
  86.       context, 
  87.       firstGad          : int.GadgetPtr; 
  88.       vi                : gad.VisualInfo;
  89.       fontAttr          : gr.TextAttr;
  90.       act               : Action;
  91.       XPos,YPos         : LONGINT;
  92.       
  93. PROCEDURE NewOpenScreenTags* (ns{8}:int.NewScreenPtr;tags{9}:TagArray):int.ScreenPtr;
  94. (* $StackChk- *)
  95. (* $SaveRegs+ *) 
  96. (* $ClearVars- *)
  97.  
  98. VAR height,
  99.     width,
  100.     left,nleft,
  101.     pleft       : INTEGER;
  102.     vm          : SET;
  103.     id          : LONGINT;
  104.     long        : LONGINT;
  105.     dim         : gr.DimensionInfoPtr;
  106.     array       : ARRAY 2 OF u.Tag;
  107.     myTags      : TagArray;
  108.     pens,scroll,
  109.     overscan,
  110.     clip        : BOOLEAN;
  111.     penArray    : ARRAY 1 OF INTEGER;
  112.     base        : int.IntuitionBasePtr;
  113.     scrnPtr     : int.ScreenPtr;
  114.     (* $IF Output THEN *)
  115.     title       : POINTER TO e.STRING;
  116.     (* $END *)
  117.     
  118. BEGIN  
  119.   base:=s.REG(14);
  120.   IF (BYPASS AND LETGO) THEN
  121.      (* $IF Output THEN *)
  122.         io.WriteString("Lasse einfach durch!\n");
  123.      (* $END *)   
  124.      s.SETREG(14,base);
  125.      RETURN(OldOpenScreenTags(ns,tags));
  126.   END;   
  127.   (* $IF Output THEN *)
  128.      io.WriteString("OpenScreenTags()\n");
  129.   (* $END *)
  130.   penArray[0]:=-1;
  131.   height:=0;
  132.   width:=0;
  133.   left:=0;
  134.   id:=0;
  135.   dim:=e.AllocVec(SIZE(dim^),LONGSET{});
  136.   myTags:=e.AllocVec(SIZE(myTags^),LONGSET{});
  137.   myTags[0].tag:=u.ignore;
  138.   myTags[1].tag:=u.ignore;
  139.   myTags[2].tag:=u.ignore;
  140.   myTags[3].tag:=u.ignore;
  141.   myTags[4].tag:=u.ignore;
  142.   myTags[5].tag:=u.ignore;
  143.   myTags[6].tag:=u.done;
  144.   IF ns # NIL THEN
  145.   (* $IF Output THEN *)
  146.      io.WriteString("NewScreen # NIL\n");
  147.      IF ns.defaultTitle # NIL THEN
  148.         io.WriteString("Name: ");
  149.         io.WriteString(ns.defaultTitle^);
  150.         io.WriteLn;
  151.      END;   
  152.   (* $END *)   
  153.      height := ns.height;
  154.      width  := ns.width;
  155.      left   := ns.leftEdge;
  156.      vm:=ns.viewModes;
  157.      id:=s.VAL(INTEGER,vm*{2,7,10,11});
  158.      IF gr.hires IN vm THEN 
  159.         INC(id,gr.hiresKey);
  160.      END;
  161.   END;  
  162.   
  163.   IF tags # NIL THEN
  164.      (* $IF Output THEN *)
  165.       io.WriteString("Tags # NIL \n");
  166.       title:= s.VAL(e.ADDRESS,u.GetTagData(int.saTitle,NIL,tags^)); 
  167.       IF title # NIL THEN 
  168.          io.WriteString("Name: ");
  169.          io.WriteString(title^);
  170.          io.WriteLn;
  171.       END;   
  172.      (* $END *)   
  173.  
  174.      id:=u.GetTagData(int.saDisplayID,id,tags^);
  175.      height:=SHORT(u.GetTagData(int.saHeight,height,tags^));
  176.      width:= SHORT(u.GetTagData(int.saWidth,width,tags^));
  177.      left := SHORT(u.GetTagData(int.saLeft,left,tags^));
  178.      myTags[6].tag:=u.more;
  179.      myTags[6].data:=tags;
  180.      pens:=u.GetTagData(int.saPens,-2,tags^)#-2;
  181.      scroll:=u.GetTagData(int.saAutoScroll,0,tags^)#0;
  182.      overscan:=u.GetTagData(int.saOverscan,0,tags^)#0;
  183.      clip:=u.GetTagData(int.saDClip,0,tags^)#0;
  184.   ELSE  
  185.      pens:=FALSE;
  186.      scroll:=FALSE;
  187.      overscan:=FALSE;
  188.      clip:=FALSE;
  189.   END;
  190.   
  191.      (* $IF Output THEN *)
  192.         io.WriteString("left: ");
  193.         io.WriteInt(left,4);
  194.         io.WriteLn;
  195.         io.WriteString("width: ");
  196.         io.WriteInt(width,4);
  197.         io.WriteLn;   
  198.      (* $END *)   
  199.      
  200.      pleft:=left;
  201.      nleft:=left;
  202.      
  203.   (* $IF Output THEN *)
  204.      io.WriteString("MonitorID :");
  205.      io.WriteHex(id,10);
  206.      io.WriteLn;
  207.      IF scroll THEN io.WriteString("Autoscroll gesetzt!\n")
  208.      ELSE io.WriteString("Autoscroll nicht gesetzt!\n")
  209.      END;
  210.      IF clip THEN io.WriteString("DClip gesetzt!\n")
  211.      ELSE io.WriteString("DClip nicht gesetzt!\n")
  212.      END;
  213.      IF pens THEN io.WriteString("Pens gesetzt!\n")
  214.      ELSE io.WriteString("Pens nicht gesetzt!\n")
  215.      END;
  216.      IF overscan THEN io.WriteString("Overscan gesetzt!\n")
  217.      ELSE io.WriteString("Overscan nicht gesetzt!\n")
  218.      END;
  219.   (* $END *)
  220.  
  221.   IF CENTER AND (NOT overscan) THEN
  222.      IF gr.GetDisplayInfoData(NIL,dim^,s.SIZE(dim^),gr.dtagDims,id) # 0 THEN
  223.         (* $IF Output THEN *)
  224.              io.WriteString("MaxPAL: ");
  225.              io.WriteInt(dim.txtOScan.maxX,4);
  226.              io.WriteLn;
  227.         (* $END *)   
  228.         IF width > 0 THEN
  229.           IF (width < dim.txtOScan.maxX) AND (left = 0) THEN
  230.              pleft:=(dim.txtOScan.maxX - width) DIV 2;
  231.              myTags[4].tag:=int.saLeft;
  232.              (* $IF Output THEN *)
  233.                 io.WriteString("PLeft: ");
  234.                 io.WriteInt(pleft,4);
  235.                 io.WriteLn;
  236.              (* $END *)
  237.           END;   
  238.         END;  
  239.      END;   
  240.   END;   
  241.   
  242.      
  243.   IF (NEWLOOK AND (NOT pens)) THEN
  244.      (* $IF Output THEN *)
  245.         io.WriteString("Setze NewLook\n");
  246.      (* $END *)   
  247.      myTags[3].tag:=int.saPens;
  248.      myTags[3].data:=s.ADR(penArray);
  249.   END;   
  250.   
  251.   IF id < gr.ntscMonitorID THEN
  252.      (* $IF Output THEN *)
  253.         io.WriteString("Let's patch ID \n");
  254.      (* $END *)   
  255.      INC(id,gr.ntscMonitorID);
  256.      IF CENTER AND (NOT overscan) THEN
  257.         IF gr.GetDisplayInfoData(NIL,dim^,s.SIZE(dim^),gr.dtagDims,id) # 0 THEN
  258.              (* $IF Output THEN *)
  259.                 io.WriteString("MaxNTSC: ");
  260.                 io.WriteInt(dim.txtOScan.maxX,4);
  261.                 io.WriteLn;
  262.              (* $END *)
  263.      
  264.            IF width > 0 THEN       
  265.              IF (width < dim.txtOScan.maxX) AND (left = 0) THEN
  266.                 myTags[4].tag:=int.saLeft;
  267.                 nleft:=(dim.txtOScan.maxX - width) DIV 2;
  268.              (* $IF Output THEN *)
  269.                 io.WriteString("NLeft: ");
  270.                 io.WriteInt(nleft,4);
  271.                 io.WriteLn;
  272.              (* $END *)
  273.   
  274.              END;   
  275.            END;  
  276.         END;   
  277.      END;   
  278.      myTags[0].tag:=int.saDisplayID;
  279.      myTags[0].data:=id;
  280.      IF gr.GetDisplayInfoData(NIL,dim^,s.SIZE(dim^),gr.dtagDims,id) # 0 THEN
  281.        IF height > dim.txtOScan.maxY+1 THEN
  282.          IF ((NOT PAL) AND (NOT (scroll AND clip))) THEN
  283.             (* $IF Output THEN *)
  284.               io.WriteString("Setze AutoScroll\n");
  285.             (* $END *)   
  286.             myTags[1].tag:=int.saAutoScroll;
  287.             myTags[1].data:= LONG(-1);
  288.             myTags[2].tag := int.saDClip;
  289.             myTags[2].data:= s.ADR(dim.txtOScan);
  290.             myTags[4].data:= LONG(nleft);
  291.          ELSE   
  292.             myTags[4].data:= LONG(pleft);
  293.             myTags[0].tag := u.ignore;
  294.          END;   
  295.        ELSE  
  296.          myTags[4].data:= LONG(nleft);
  297.        END;  
  298.      END;  
  299.   ELSE
  300.      myTags[4].data:= LONG(pleft);
  301.   END;   
  302.   
  303.   (* $IF Output THEN *)
  304.   io.WriteString("Fertig! \n");
  305.   io.WriteString("------------------! \n");
  306.   (* $END *)  
  307.   s.SETREG(14,base);
  308.   scrnPtr:=OldOpenScreenTags(ns,myTags);
  309.   e.FreeVec(dim);
  310.   e.FreeVec(myTags);
  311.   s.SETREG(14,base);
  312.   RETURN(scrnPtr);  
  313. END NewOpenScreenTags;
  314. (* $StackChk= *)
  315. (* $ClearVars= *)
  316.  
  317.  
  318. PROCEDURE NewOpenScreen* (ens{8}:int.ExtNewScreenPtr):int.ScreenPtr;
  319. (* $SaveRegs+ *)
  320. (* $StackChk- *)
  321. (* $ClearVars- *)
  322.  
  323. VAR base:int.IntuitionBasePtr;
  324.  
  325. BEGIN
  326.   base:=s.REG(14);
  327.   IF (BYPASS AND LETGO) THEN
  328.      (* $IF Output THEN *)
  329.         io.WriteString("Lasse einfach durch!\n");
  330.      (* $END *)   
  331.      s.SETREG(14,base);
  332.      RETURN(OldOpenScreen(ens));
  333.   END;   
  334.   (* $IF Output THEN *)
  335.      io.WriteString("OpenScreen!\n");
  336.   (* $END *)   
  337.   IF int.nsExtended IN ens.ns.type THEN
  338.      (* $IF Output THEN *)
  339.         io.WriteString("ExtendedNewScreen!\n");
  340.      (* $END *)   
  341.     s.SETREG(14,base);
  342.     RETURN(NewOpenScreenTags(ens,ens.extension));
  343.   ELSE
  344.      (* $IF Output THEN *)
  345.         io.WriteString("Normale NewScreen!\n");
  346.      (* $END *)   
  347.     s.SETREG(14,base);
  348.     RETURN(NewOpenScreenTags(ens,NIL));
  349.   END;
  350. END NewOpenScreen;
  351. (* $StackChk= *)
  352. (* $ClearVars= *)
  353.  
  354.  
  355. PROCEDURE Assert(cc:BOOLEAN;Text:ARRAY OF CHAR);
  356.  
  357. VAR es : int.EasyStruct;
  358.     l  : LONGINT;
  359. BEGIN
  360.   IF NOT cc THEN
  361.     es.structSize:=s.SIZE(int.EasyStruct);
  362.     es.flags:=LONGSET{0};
  363.     es.title:=SVersion;
  364.     es.textFormat:=s.ADR(Text);
  365.     es.gadgetFormat:=s.ADR("OK");
  366.     l:=int.EasyRequest(NIL,s.ADR(es),NIL);
  367.     HALT(20);
  368.   END;  
  369. END Assert;  
  370.  
  371.  
  372. PROCEDURE Patch (new,by : BOOLEAN);
  373.  
  374. BEGIN
  375.   IF (new AND (NOT PATCHED)) THEN
  376.      IF (by AND BYPASS) THEN
  377.         LETGO:=FALSE;
  378.      ELSE   
  379.        e.Forbid;
  380.        OldOpenScreen:=s.VAL(OpenScreenProc,e.SetFunction(int.int,-0C6H,
  381.                             s.VAL(e.PROC,NewOpenScreen)));
  382.        OldOpenScreenTags:=s.VAL(OpenScreenTagsProc,e.SetFunction(int.int,-612,
  383.                                 s.VAL(e.PROC,NewOpenScreenTags)));
  384.        e.Permit;
  385.      END;  
  386.        PATCHED:=TRUE;
  387.   ELSE
  388.     IF ((NOT new) AND PATCHED) THEN
  389.        IF (by AND BYPASS) THEN
  390.           LETGO:=TRUE;
  391.        ELSE   
  392.          e.Forbid;
  393.          OldOpenScreen:=s.VAL(OpenScreenProc,e.SetFunction(int.int,-0C6H,
  394.                               s.VAL(e.PROC,OldOpenScreen)));
  395.          OldOpenScreenTags:=s.VAL(OpenScreenTagsProc,e.SetFunction(int.int,-612,
  396.                                   s.VAL(e.PROC,OldOpenScreenTags)));
  397.          e.Permit;
  398.        END;  
  399.        PATCHED:=FALSE;
  400.     END;     
  401.   END;   
  402. END Patch;
  403.  
  404.  
  405. PROCEDURE InitGad (VAR ng : gad.NewGadget; l,t,w,h,nr:INTEGER;
  406.                    name:e.STRPTR;dir : INTEGER);
  407. BEGIN
  408.   ng.leftEdge := l;
  409.   ng.topEdge := t;
  410.   ng.width := w;
  411.   ng.height := h;
  412.   ng.textAttr:=s.ADR(fontAttr);
  413.   ng.visualInfo:=vi;
  414.   ng.gadgetID:=nr;
  415.   ng.gadgetText:=name;
  416.   ng.flags:=LONGSET{dir};
  417. END InitGad;  
  418.  
  419.  
  420. PROCEDURE Window(ON:BOOLEAN);
  421.  
  422. VAR checkPal,
  423.     checkNewLook,
  424.     checkPatched,
  425.     checkCenter  : LONGINT;
  426.     dummy        : INTEGER;
  427.     newGad       : gad.NewGadget;
  428.  
  429. BEGIN    
  430.   IF ON AND (NOT WINDOW) THEN
  431.     checkPal:=int.BoolToLong(PAL);
  432.     checkNewLook:=int.BoolToLong(NEWLOOK);
  433.     checkPatched:=int.BoolToLong(PATCHED);
  434.     checkCenter:=int.BoolToLong(CENTER);
  435.     fontAttr:=gr.TextAttr(s.ADR("topaz.font"),8,SHORTSET{},SHORTSET{});
  436.     winPtr:=int.OpenWindowTagsA(NIL,int.waIDCMP,
  437.                                s.VAL(LONGINT,LONGSET{int.closeWindow,int.vanillaKey} +
  438.                                              gad.checkBoxIDCMP +
  439.                                              gad.buttonIDCMP),
  440.                               int.waFlags,s.VAL(LONGINT,LONGSET{int.windowClose,
  441.                                                 int.windowDrag,int.windowDepth}),
  442.                               int.waWidth,200,int.waHeight,140,
  443.                               int.waPubScreen,0,
  444.                               int.waTitle,SVersion,
  445.                               int.waTop,YPos,int.waLeft,XPos,
  446.                               int.waAutoAdjust,1,
  447.                               u.done);
  448.     IF winPtr # NIL THEN                              
  449.       vi := gad.GetVisualInfo(winPtr.wScreen);
  450.       context:=gad.CreateContext(firstGad);
  451.       InitGad(newGad,15,30,0,15,patchText,s.ADR("_Patch"),gad.placeTextRight);
  452.       gads[patchText]:=gad.CreateGadget(gad.textKind,context,newGad,
  453.                                         gad.underscore,ORD("_"),u.done);
  454.       InitGad(newGad,15,50,0,15,newText,s.ADR("_NewLook"),gad.placeTextRight);
  455.       gads[newText]:=gad.CreateGadget(gad.textKind,gads[patchText],newGad,
  456.                                         gad.underscore,ORD("_"),u.done);
  457.       InitGad(newGad, 15,70, 0,15,palText,s.ADR("_UsePal"),gad.placeTextRight);
  458.       gads[palText]:=gad.CreateGadget(gad.textKind,gads[newText],newGad,
  459.                                         gad.underscore,ORD("_"),u.done);
  460.       InitGad(newGad, 15,90, 0,15,centerText,s.ADR("_Center"),gad.placeTextRight);
  461.       gads[centerText]:=gad.CreateGadget(gad.textKind,gads[palText],newGad,
  462.                                          gad.underscore,ORD("_"),u.done);
  463.       InitGad(newGad,140,30,10,10,patch,NIL,0);
  464.       gads[patch]:=gad.CreateGadget(gad.checkBoxKind,gads[centerText],newGad,
  465.                                     gad.cbChecked,checkPatched);
  466.       InitGad(newGad,140,50,10,10,newLook,NIL,0);
  467.       gads[newLook]:=gad.CreateGadget(gad.checkBoxKind,gads[patch],newGad,
  468.                                         gad.cbChecked,checkNewLook);
  469.       InitGad(newGad,140,70,10,10,pal,NIL,0);
  470.       gads[pal]:=gad.CreateGadget(gad.checkBoxKind,gads[newLook],newGad,
  471.                                         gad.cbChecked,checkPal);
  472.       InitGad(newGad,140,90,10,10,center,NIL,0);
  473.       gads[center]:=gad.CreateGadget(gad.checkBoxKind,gads[pal],newGad,
  474.                                         gad.cbChecked,checkCenter);
  475.       InitGad(newGad, 20,110,40,15,hide,s.ADR("_Hide"),gad.placeTextIn);
  476.       gads[hide]:=gad.CreateGadget(gad.buttonKind,gads[center],newGad,
  477.                                    gad.underscore,ORD("_"),u.done);
  478.       InitGad(newGad,140,110,40,15,quit,s.ADR("_Quit"),gad.placeTextIn);
  479.       gads[quit]:=gad.CreateGadget(gad.buttonKind,gads[hide],newGad,
  480.                                    gad.underscore,ORD("_"),u.done);
  481.       dummy:=int.AddGList(winPtr,context,0,-1,NIL);                             
  482.       int.RefreshGadgets(firstGad,winPtr,NIL);
  483.       gad.RefreshWindow(winPtr,NIL);
  484.       WINDOW := TRUE;
  485.       winSig := winPtr.userPort.sigBit;
  486.     ELSE   
  487.        WINDOW := FALSE;
  488.     END;   
  489.   END;  
  490.   IF ON AND WINDOW THEN 
  491.      int.ScreenToFront(winPtr.wScreen);
  492.      int.WindowToFront(winPtr);
  493.      IF int.ActivateWindow(winPtr)THEN  END;
  494.   END;   
  495.   IF (NOT ON) AND WINDOW THEN 
  496.      XPos:=winPtr.leftEdge;
  497.      YPos:=winPtr.topEdge;
  498.      IF winPtr   # NIL THEN int.CloseWindow(winPtr)   END;
  499.      IF firstGad # NIL THEN gad.FreeGadgets(firstGad) END;
  500.      IF vi       # NIL THEN gad.FreeVisualInfo(vi)    END;
  501.      WINDOW := FALSE;
  502.   END;   
  503. END Window;
  504.  
  505.  
  506.  
  507. (* $IF Debug THEN *)
  508. PROCEDURE TestScreen;
  509. VAR scr:int.ScreenPtr;
  510.     tags:u.Tags3;
  511.     
  512. BEGIN
  513.   tags:=u.Tags3(int.saDisplayID,gr.hiresLaceKey+gr.ntscMonitorID,int.saHeight,200,int.saWidth,640);
  514.   s.SETREG(14,int.int);
  515.   scr := NewOpenScreenTags(NIL,s.ADR(tags));
  516.   int.OldCloseScreen(scr);
  517. END TestScreen;  
  518. (* $END *)
  519.  
  520.  
  521. PROCEDURE CheckWindow(VAR ret : Action);
  522. VAR msg   : int.IntuiMessagePtr;
  523.     closed: BOOLEAN;
  524.     gptr  : int.GadgetPtr;
  525.     
  526.     
  527.   PROCEDURE Toggle (id:INTEGER);
  528.   VAR select : LONGINT;
  529.       state  : BOOLEAN;
  530.       
  531.   BEGIN
  532.     ret.action:=id;
  533.     state:=(int.selected IN gads[id].flags);
  534.     select:=int.BoolToLong(NOT(state));
  535.     gad.SetGadgetAttrs(gads[id]^,winPtr,NIL,gad.cbChecked,select);
  536.     ret.doIt:=NOT(state);
  537.   END Toggle;  
  538.   
  539.   
  540. BEGIN
  541.   ret:=Action(-1,FALSE);
  542.   closed := FALSE;
  543.   msg:=gad.GetIMsg(winPtr.userPort);
  544.   WHILE (msg # NIL) AND (NOT closed) DO
  545.     IF int.gadgetUp IN msg.class THEN
  546.        gptr:=s.VAL(int.GadgetPtr,msg.iAddress);
  547.        CASE gptr.gadgetID OF 
  548.        |hide : closed := TRUE;
  549.        |quit : ret.action := quit;        
  550.                closed:=TRUE;
  551.        |patch,newLook,pal,center :
  552.                ret.action:=gptr.gadgetID; 
  553.                ret.doIt := (int.selected IN gptr.flags);
  554.        ELSE   
  555.        END;
  556.     END;   
  557.     IF int.closeWindow IN msg.class THEN
  558.         closed:=TRUE;
  559.     END;    
  560.     IF int.vanillaKey IN msg.class THEN
  561.        CASE CAP(CHR(msg.code)) OF
  562.        |"H" : closed     := TRUE;
  563.        |"Q" : ret.action := quit;       
  564.               closed     := TRUE;
  565.        |"U" : Toggle(pal);
  566.        |"P" : Toggle(patch);
  567.        |"N" : Toggle(newLook);
  568.        |"C" : Toggle(center);
  569. (* $IF Debug THEN *)
  570.        |"D" : TestScreen;
  571. (* $END *)
  572.        ELSE
  573.        END;
  574.     END;   
  575.     gad.ReplyIMsg(msg);
  576.     msg:=gad.GetIMsg(winPtr.userPort);
  577.   END;  
  578.   WHILE msg # NIL DO 
  579.     gad.ReplyIMsg(msg);
  580.     msg:=gad.GetIMsg(winPtr.userPort);
  581.   END;  
  582.   IF closed THEN Window(FALSE) END;
  583. END CheckWindow;  
  584.     
  585. PROCEDURE CheckArg(name:cx.String;default : cx.StrPtr) : BOOLEAN;    
  586. VAR res : e.STRPTR;
  587. BEGIN
  588.   res:=cx.ArgString(ToolTypes,name,default);
  589.   RETURN(res^#default^);
  590. END CheckArg;  
  591.  
  592.                         
  593. BEGIN      
  594.   (* $IF SmallData THEN *)
  595.   Assert(FALSE,"SwitchNTSC won't run with SMALLDATA!");
  596.   (* $END *)
  597.   WINDOW:=FALSE;
  598.   LETGO:=FALSE;
  599.   Version := s.ADR(VERSIONSTRING);
  600.   SVersion := s.ADR(SMALLVERSION);
  601.   ToolTypes:=cx.ArgArrayInit();
  602.   MyNewBroker:=com.NewBroker(com.nbVersion,s.ADR("SwitchNTSC"),
  603.                              s.ADR(SMALLVERSION),
  604.                              s.ADR("Forces Screens to open on NTSC"),
  605.                              com.notify+com.unique,{com.showHide},0,NIL,0);
  606.   IF ToolTypes # NIL THEN
  607.      MyNewBroker.pri:=SHORT(SHORT(cx.ArgInt(ToolTypes,"CX_PRIORITY",
  608.                                                        DefCXPri)));
  609.   ELSE    
  610.      MyNewBroker.pri:=DefCXPri;
  611.   END;   
  612.   MyPort:=e.CreateMsgPort();
  613.   Assert(MyPort#NIL,"Fatal Error!");
  614.   MyNewBroker.port:=MyPort;                           
  615.   cxSig := MyPort.sigBit;
  616.   Broker := com.CxBroker(MyNewBroker,error);
  617.   IF Broker = NIL THEN HALT(20) END;
  618.   IF ToolTypes # NIL THEN
  619.      Key    := cx.ArgString(ToolTypes,"CX_POPKEY",s.ADR(DefCXPopKey));
  620.      PAL    := CheckArg("USEPAL",s.ADR("OFF"));
  621.      NEWLOOK:= CheckArg("NEWLOOK",s.ADR("OFF"));
  622.      POPUP  := CheckArg("CX_POPUP",s.ADR("NO"));
  623.      BYPASS := CheckArg("BYPASS",s.ADR("OFF"));
  624.      CENTER := CheckArg("CENTER",s.ADR("OFF"));
  625.      XPos   := cx.ArgInt(ToolTypes,"XPOS",0);
  626.      YPos   := cx.ArgInt(ToolTypes,"YPOS",10);
  627.   ELSE   
  628.      Key:=s.ADR(DefCXPopKey);
  629.      PAL:=FALSE;
  630.      NEWLOOK:=FALSE;
  631.      POPUP:=FALSE;
  632.      BYPASS:=FALSE;
  633.      CENTER:=FALSE;
  634.      XPos:=0;
  635.      YPos:=10;
  636.  
  637.   END;   
  638.   
  639.   Filter:=cx.HotKey(Key,MyPort,SwitchID);
  640.   Assert(Filter#NIL,"Fatal Error!");
  641.   com.AttachCxObj(Broker,Filter);
  642.   IF com.CxObjError(Filter)=LONGSET{} THEN
  643.      long:=com.ActivateCxObj(Broker,-1);
  644.      Patch(TRUE,FALSE);
  645.      Window(POPUP);
  646.      LOOP
  647.        IF WINDOW THEN Signal := e.Wait(LONGSET{cxSig,winSig})
  648.        ELSE Signal:=e.Wait(LONGSET{cxSig})
  649.        END;
  650.        IF cxSig IN Signal THEN
  651.          CxMsg := s.VAL(com.CxMsgPtr,e.GetMsg(MyPort));
  652.          WHILE CxMsg # NIL DO
  653.            MsgType:= com.CxMsgType(CxMsg);
  654.            MsgID  := com.CxMsgID(CxMsg); 
  655.            e.ReplyMsg(s.VAL(e.MessagePtr,CxMsg));
  656.            IF com.cxmIEvent IN MsgType THEN
  657.               Window(TRUE);
  658.            END;
  659.            IF com.cxmCommand IN MsgType THEN
  660.               CASE MsgID OF
  661.                 |com.cmdDisable   : long:=com.ActivateCxObj(Broker,0);Patch(FALSE,FALSE);
  662.                                     IF WINDOW THEN Window(FALSE) END;
  663.                 |com.cmdEnable    : long:=com.ActivateCxObj(Broker,-1);Patch(TRUE,FALSE);
  664.                 |com.cmdKill      : Patch(FALSE,FALSE);IF WINDOW THEN Window(FALSE) END;EXIT;
  665.                 |com.cmdUnique    : IF NOT WINDOW THEN Window(TRUE) END;
  666.                 |com.cmdAppear    : Window(TRUE);
  667.                 |com.cmdDisappear : IF WINDOW THEN Window(FALSE) END;
  668.               ELSE
  669.               END (* CASE *);
  670.            END; (* IF *)  
  671.            CxMsg := s.VAL(com.CxMsgPtr,e.GetMsg(MyPort));
  672.          END (* WHILE *)
  673.        END;  
  674.        IF (winSig IN Signal) AND WINDOW THEN
  675.           CheckWindow(act);
  676.           CASE act.action OF
  677.           |quit   : Patch(FALSE,FALSE);EXIT;
  678.           |patch  : Patch(act.doIt,TRUE);
  679.           |newLook: NEWLOOK := act.doIt;
  680.           |pal    : PAL := act.doIt;
  681.           |center : CENTER := act.doIt;
  682.           ELSE
  683.           END;
  684.        END;   
  685.     END (* LOOP *)  
  686.   END (* IF *)   
  687.           
  688. CLOSE
  689.   IF WINDOW THEN Window(FALSE) END;
  690.   IF MyPort # NIL THEN 
  691.      msg:= e.GetMsg(MyPort);
  692.      WHILE msg # NIL DO 
  693.        e.ReplyMsg(msg);
  694.        msg:=e.GetMsg(MyPort);
  695.      END;  
  696.      e.DeleteMsgPort(MyPort);
  697.   END; (* IF *)   
  698.   
  699.   IF Broker # NIL THEN 
  700.      long:=com.ActivateCxObj(Broker,0);
  701.      com.DeleteCxObjAll(Broker) 
  702.   END (* IF *);
  703.  
  704. END SwitchNTSC.
  705.