home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 10: Diskmags / nf_archive_10.iso / MAGS / INFO / IINFO51.MSA / PROGRAMS_COOKIE.MOD < prev    next >
Text File  |  1991-03-14  |  7KB  |  230 lines

  1. MODULE ReadCookie;
  2.  
  3. (*$T-*)
  4. (*$S-*)
  5.  
  6.  
  7. (*This program reads the ST's Cookie Jar. It is an extremely quick and 
  8.   nasty program, but it was written as an investigation only*)
  9.  
  10. (*This program is in the Public Domain. You are free to modify it
  11.   in any way you wish. It is written in TDI Modula-2/ST*)
  12.  
  13. IMPORT LongInOut;
  14.  
  15. FROM Strings IMPORT Compare, CompareResults,String,Assign,Length;
  16.  
  17. FROM InOut IMPORT WriteString, WriteCard, ReadString, WriteLn, Write,
  18.                   OpenOutputFile, CloseOutput;
  19.  
  20. FROM XBIOS IMPORT SuperExec;
  21.  
  22. FROM SYSTEM IMPORT CODE,ADDRESS;
  23.  
  24. (*Define two types of records to point at cookies. The first refers to the
  25.   cookie as containing an address. The second splits the cookie value into
  26.   two word. *)
  27.  
  28. TYPE CookieAddType = RECORD
  29.     Identifier : ARRAY[0..3] OF CHAR;
  30.     Pointer    : LONGCARD
  31. END;
  32.  
  33. TYPE CookieType = RECORD
  34.      Identifier : ARRAY[0..3] OF CHAR;
  35.      HiWord, LoWord : CARDINAL;
  36. END;
  37.  
  38. TYPE CookiePointer = POINTER TO CookieType;
  39. TYPE CookieAddPointer = POINTER TO CookieAddType;
  40.  
  41. CONST RTS = 04e75H;        (*68000 return from subroutine opcode*)
  42.  
  43. VAR CookieAddress[05a0H] : ADDRESS;
  44.     ind : CARDINAL;
  45.     Addval : LONGCARD;
  46.     OutputFile : String;
  47.     Cookie : CookiePointer;
  48.     CookieAdd : CookieAddPointer;
  49.  
  50. (*$P-  Turn off normal entry/exit code for this procedure*)
  51. PROCEDURE GetAddress;
  52.  
  53. BEGIN
  54.  
  55. (*This routine called by the SuperExec mode of the extended BIOS. Address
  56.   $5a0 contains a pointer to the start of the Cookie Jar. Apparently this
  57.   address is one of Atari's cast in concrete, guaranteed not to change
  58.   variables *)
  59.  
  60.   Cookie := CookieAddress;  
  61.   CookieAdd := CookieAddress;
  62.  
  63.   CODE(RTS)
  64. END GetAddress;
  65.  
  66. (*$P+*)
  67.  
  68. PROCEDURE DoComments;
  69.  
  70. (*Writes out some comments about our current cookie*)
  71. VAR KnownCookie : BOOLEAN; (*If we knew this Cookie will become true*)
  72.  
  73. BEGIN
  74.   KnownCookie := FALSE;
  75.   WriteString("    ");
  76.  
  77. (*Go through our list of known cookies*)
  78.  
  79. (*For the identifier _CPU, the low word contains 00,10,20,30 or 40
  80.   indicating that we have a 680xx processor. For example 00 indicates 
  81.   the 68000, 30 the 68030. *)
  82.  
  83.   IF Compare(Cookie^.Identifier,"_CPU") = Equal THEN
  84.      WriteString("Processor is 680");
  85.      IF Cookie^.LoWord < 10 THEN
  86.        Write("0");
  87.        WriteCard(Cookie^.LoWord,1);
  88.      ELSE
  89.        WriteCard(Cookie^.LoWord,2);
  90.      END;
  91.      KnownCookie := TRUE
  92.   END;
  93.  
  94. (*_SND. The low value contains, at the bit level what internal sound
  95.   generators are present. Bit 0 - The Yamaha chip of the original ST
  96.                           Bit 1 - The STE/TT Stereo chip *)
  97.  
  98.   IF Compare(Cookie^.Identifier,"_SND") = Equal THEN
  99.      WriteString("Sound chips present:-");
  100.      IF ODD(Cookie^.LoWord) THEN
  101.         WriteLn;
  102.         WriteString("                                      ");
  103.         WriteString("Normal ST sound chip (Yamaha/GI)")
  104.      END;
  105.      IF ODD(Cookie^.LoWord DIV 2) THEN
  106.         WriteLn;
  107.         WriteString("                                      ");
  108.         WriteString("STE/TT Hardware DMA stereo chip");
  109.      END;
  110.      KnownCookie := TRUE
  111.   END;
  112.  
  113. (*_VDO tells as about the graphics chip, in the high value in this case*)
  114.  
  115.   IF Compare(Cookie^.Identifier,"_VDO") = Equal THEN
  116.      CASE Cookie^.HiWord OF
  117.        0 : WriteString("Plain normal ST shifter"); |
  118.        1 : WriteString("Improved STE shifter");    |
  119.        2 : WriteString("TT Graphics chip")
  120.      ELSE
  121.        WriteString("Unknown graphics chip")
  122.      END;
  123.      KnownCookie := TRUE
  124.   END;
  125.  
  126. (*_MCH tells us a bit about the actual computer we've got*)
  127.  
  128.   IF Compare(Cookie^.Identifier,"_MCH") = Equal THEN
  129.      CASE Cookie^.HiWord OF
  130.      0 : WriteString("This is a plain ST"); |
  131.      1 : WriteString("This is a mega ST");  |
  132.      2 : WriteString("This is an STE");     |
  133.      3 : WriteString("This is a TT")
  134.      ELSE
  135.        WriteString("I don't know this computer type")
  136.      END;
  137.      KnownCookie := TRUE
  138.   END;
  139.  
  140. (*_FRB, A longword containing the where the Fast Ram Buffer on the TT is*)
  141. (*If it is zero, then there is no Fast Ram Buffer*)
  142.  
  143.   IF Compare(Cookie^.Identifier,"_FRB")= Equal THEN
  144.      WriteString("Fast Ram Buffer Address");
  145.      KnownCookie := TRUE
  146.   END;
  147.  
  148. (*_SWI tells us about configuration switches, whatever they do*)
  149.  
  150.   IF Compare(Cookie^.Identifier,"_SWI") = Equal THEN
  151.      WriteString("For configuration switches");
  152.      KnownCookie := TRUE
  153.   END;
  154.  
  155. (*_INF. This turns up after running STE_FIX, and seems to indicate where
  156.   the patch goes??*)
  157.  
  158.   IF Compare(Cookie^.Identifier,"_INF") = Equal THEN
  159.      WriteString("Desktop.INF patch installed");
  160.      KnownCookie := TRUE
  161.   END;
  162.  
  163.   IF ~KnownCookie THEN
  164.     WriteString("I don't know this cookie");
  165.   END
  166. END DoComments;
  167.  
  168. BEGIN
  169.   SuperExec(GetAddress); (*Get the Pointer to the Cookie Jar*)
  170.  
  171.   WriteString("Cookie jar check--Where would you like the");
  172.   WriteLn;
  173.   WriteString("output to be sent ? (Press <return> for screen-->");
  174.   Assign(OutputFile,"CON:");
  175.   ReadString(OutputFile);
  176.   WriteLn;
  177.   OpenOutputFile(OutputFile);
  178.  
  179.   WriteString("Quick and Nasty Cookie Jar Investigation");
  180.   WriteLn;
  181.   WriteLn;
  182.   IF LONGCARD(Cookie) = 0 THEN
  183.      WriteString("No Cookie Jar available");
  184.   ELSE
  185.      WriteString("Cookie Jar starts at (decimal) :-");
  186.      LongInOut.WriteLongCard(LONGCARD(Cookie),10);
  187.      WriteLn;
  188.      WriteString("                 (hexadecimal) :-");
  189.      LongInOut.WriteLongHex(LONGCARD(Cookie),10);
  190.      WriteLn;
  191.      WriteString("Contents :-");
  192.      WriteLn;
  193.      WriteLn;
  194.      WriteString("Identifier High  Low  Address     Comments");
  195.      WriteLn;
  196.  
  197.      WHILE (Length(Cookie^.Identifier)>0) DO
  198.  
  199. (*Replace nulls with spaces*)
  200.        FOR ind := 1 TO 4-Length(Cookie^.Identifier) DO
  201.          Write(" ")
  202.        END;
  203.  
  204. (*Output cookie and info*)
  205.        WriteString(Cookie^.Identifier);
  206.        WriteString("   ");
  207.        WriteCard(Cookie^.HiWord,6);
  208.        WriteCard(Cookie^.LoWord,6);
  209.        LongInOut.WriteLongHex(CookieAdd^.Pointer,10);
  210.        DoComments;
  211.        INC(Cookie,8);  (*Point to next cookie*)
  212.        INC(CookieAdd,8);
  213.        WriteLn;
  214.      END;
  215.  
  216. (*at The end of the list the null first null cookie contains the
  217.   number of reserved cookies*)
  218.  
  219.      WriteLn;
  220.      LongInOut.WriteLongCard(CookieAdd^.Pointer,7);
  221.      WriteString(" Slots reserved for cookies");
  222.  
  223.      WriteLn;
  224.      WriteLn;
  225.      CloseOutput;
  226.   END;
  227.   WriteString("Press return to exit");
  228.   ReadString(OutputFile)
  229. END ReadCookie.
  230.