home *** CD-ROM | disk | FTP | other *** search
/ Programming Tool Box / SIMS_2.iso / bp_3_94 / power / sysinfo.bas < prev   
BASIC Source File  |  1994-05-10  |  15KB  |  441 lines

  1. '*********************************************************
  2. '! File       : SYSINFO.BAS
  3. '! Vers.      : 1.0
  4. '! Last Edit  : 10.5.94
  5. '! Autor      : G. Born
  6. '! Files      : INPUT, OUTPUT
  7. '! Progr. Spr.: Power Basic 2.1/3.0
  8. '! Betr. Sys. : DOS 2.1 - 5.0 - 6.x
  9. '! Funktion: Das Programm wird mit der Eingabe:
  10. '!
  11. '!           SYSINFO
  12. '!
  13. '!           aufgerufen. Es ermittelt die Konfiguration
  14. '!           des PC's und gibt das Ergebnis auf dem
  15. '!           Bildschirm aus. Dabei wird der Umgang mit
  16. '!           den systemnahen Schnittstellen gezeigt.
  17. '**********************************************************
  18. '! Variable definieren
  19. frei& = 0                             '! freier Speicher
  20. start& = 0                            '! Startadresse
  21.  
  22. '#########################################################
  23. '#                     Hauptprogramm                     #
  24. '#########################################################
  25.  
  26. ON ERROR GOTO fehler
  27.  
  28. PRINT
  29. PRINT "S y s t e m   I N F O             (c) Born Version 1.0"
  30. PRINT
  31.  
  32. CALL bios                              '! Bios Copyright
  33. CALL dosvers                           '! DOS Versionsnummer
  34. CALL memory                            '! Speicherbelegung
  35. CALL progadr                           '! Adr. Userprogramme
  36. CALL freemem                           '! freier Speicher
  37.  
  38. PRINT "Weiter bitte eine Taste betätigen"
  39. DO WHILE INKEY$ = "": WEND
  40.  
  41. CALL config                            '! Systemkonfigurierung
  42.  
  43. PRINT
  44. PRINT "Ende System Info"
  45. END                                    '! Ende
  46.  
  47. '#########################################################
  48. '#                    Hilfsroutinen                      #
  49. '#########################################################
  50.  
  51. fehler:
  52. '---------------------------------------------------------
  53. '! Fehlerbehandlung in HWINFO
  54. '---------------------------------------------------------
  55.  
  56.  PRINT "Fehler : ";ERR;" unbekannt"
  57.  PRINT "Programmabbruch"
  58. END                                 '! MSDOS Exit
  59.  
  60. SUB bios
  61. '!---------------------------------------------------------
  62. '! lese Bios Signatur
  63. '!---------------------------------------------------------
  64. LOCAL i%
  65.  
  66. DEF SEG = &HF800                    '! Segm. Bios ROM
  67.  
  68. PRINT
  69. PRINT "Bios Version ";
  70. FOR i% = 3 TO 50
  71.  PRINT CHR$(PEEK (i%));
  72. NEXT i%
  73. PRINT
  74.  
  75. END SUB
  76.  
  77. SUB dosvers
  78. '!---------------------------------------------------------
  79. '! Abfrage der DOS-Versionsnummer:
  80. '! 1. per INT 21, Funktion AH=30H (SETVER Version ab DOS 5)
  81. '! 2. per INT 21, Funktion AX3306H (True Version)
  82. '!---------------------------------------------------------
  83. '!
  84.  LOCAL AH%, AL%, BH%, BL%, AX%, DL%
  85. '!
  86. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  87. '! Erste Anfrage bezüglich der Systemversion
  88. '! Ermittle zuerst die DOS Version über die INT 21 Funkt. 30
  89. '! CALL: AH = 30   RETURN: AL = Untervers. AH = Hauptvers.
  90. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  91. '!
  92.  REG 1, &H3000                         '! AX = 3000 -> read
  93.                                        '! Version
  94.  CALL INTERRUPT &H21                   '! Dispatcher INT
  95.  
  96.  AH% = (REG (1) / 256) AND &HFF        '! lese Wert in AH
  97.  AL% = REG (1) AND &HFF                '! lese Wert in AL
  98.  PRINT
  99.  IF AL% = 0 THEN                       '! AL = leer ?
  100.   PRINT "MS-DOS Version 1.x"
  101.  ELSE
  102.   PRINT "MS-DOS Version ";             '! Versionsnummer
  103.   PRINT USING "##&"; AL%; ".";         '! AL = Hauptversion
  104.   PRINT USING "##"; AH%;               '! AH = Unterversion
  105.   PRINT " gemeldet"
  106.  END IF
  107.  
  108. '!
  109. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  110. '! Trau keinem DOS über 4.01, Prüfung über INT 21
  111. '! CALL: AX = 3306H RETURN: BX=Version, DX: Flag
  112. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  113. '!
  114.  REG 1, &H3306                         '! AX = 3306 -> read
  115.                        '! True Version
  116.  CALL INTERRUPT &H21                   '! Dispatcher INT
  117.  
  118.  AL% = REG (1) AND &HFF                '! Fehlerstatus
  119.  IF AL% <> &HFF THEN                   '! Aufruf ok
  120.   BH% = (REG (2) / 256) AND &HFF       '! lese Unterversion
  121.   BL% = REG (2) AND &HFF               '! lese Hauptversion
  122.   PRINT
  123.   PRINT "MS-DOS Version ";             '! Versionsnummer
  124.   PRINT USING "##&"; BL%; ".";         '! BL = Hauptversion
  125.   PRINT USING "##"; BH%;               '! BH = Unterversion
  126.   PRINT " (true Version)"
  127.   AX% = (REG(4) AND &H1000)
  128.   IF AX% <> 0 THEN
  129.    PRINT "DOS ist im HMA geladen"
  130.   ELSE
  131.    PRINT "DOS ist im konventionellen Speicher geladen"
  132.   END IF
  133.  END IF
  134.  
  135. '!
  136. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  137. '! Ermittle Bootlaufwerk ab DOS 5.0,
  138. '! Prüfung über INT 21, AX=3305H
  139. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  140. '!
  141.  REG 1, &H3305                         '! AX = 3305 -> read
  142.                        '! Boot Drive
  143.  CALL INTERRUPT &H21                   '! Dispatcher INT
  144.  
  145.  AL% = REG (1) AND &HFF                '! Fehlerstatus
  146.  IF AL% <> &HFF THEN                   '! Aufruf ok
  147.   PRINT "Boot Drive ";
  148.   DL% = REG(4) AND &HFF                '! DL lesen
  149.   PRINT CHR$(&H40+DL%)+":"             '! A:= 1
  150.  END IF
  151.  
  152. END SUB
  153.  
  154. SUB memory
  155. '!---------------------------------------------------------
  156. '! ermittle die RAM und ROM Speichergröße
  157. '!---------------------------------------------------------
  158. LOCAL i&
  159.  
  160. PRINT
  161.  
  162. '!
  163. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  164. '! ermittle die RAM Größe über den BIOS INT 12
  165. '! Ergebnis in AX in Kbyte
  166. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  167. '!
  168.  CALL INTERRUPT &H12                   '! BIOS: GET RAM SIZE
  169.  PRINT "RAM from  0000:0000 len ";
  170.  PRINT REG (1);" Kbytes"               '! AX = Größe
  171.  
  172. '!
  173. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  174. '! Prüfe die Lage des Bildschirmadadapters auf Segment
  175. '! A000H, B000H, B800H
  176. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  177. '!
  178.  DEF SEG = &HA000                      '! setze Segment
  179.  IF (PEEK(0) <> &HFF) AND _            '! Bildschirm RAM ?
  180.      (PEEK(1) <> &HFF) THEN
  181.    PRINT "RAM from  A000:0000"         '! Segmentadr.
  182.  END IF
  183.  
  184.  DEF SEG = &HB000                      '! setze Segment
  185.  IF (PEEK(0) <> &HFF) AND _            '! Bildschirm RAM ?
  186.      (PEEK(1) <> &HFF) THEN
  187.    PRINT "RAM from  B000:0000"         '! Segmentadr.
  188.  END IF
  189.  
  190.  
  191.  DEF SEG = &HB800                      '! setze Segment
  192.  IF (PEEK(0) <> &HFF) AND _            '! Bildschirm RAM ?
  193.      (PEEK(1) <> &HFF) THEN
  194.    PRINT "RAM from  B800:0000"         '! Segmentadr.
  195.  END IF
  196.  
  197. '!
  198. '! Prüfe ab C000:0 in 32 Kbyte Schritten auf ROM's
  199. '!
  200.  
  201.  FOR i& = &HC000 TO &HFFFF STEP &H800  '! teste ROM
  202.   DEF SEG = i&                         '! setze Segment
  203.   IF (PEEK(0) = &H55) AND _            '! ROM Signatur ?
  204.      (PEEK(1) = &HAA) THEN
  205.    PRINT "ROM from  "; HEX$(i&);":0000";'! Segmentadr.
  206.    PRINT " len "; PEEK(2);             '! Kbytes
  207.    PRINT " Kbyte"
  208.   ELSEIF (PEEK(0) <> &HFF) AND _       '! ROM Signatur ?
  209.      (PEEK(1) <> &HFF) THEN
  210.    PRINT "ROM from  "; HEX$(i&);":0000" '! Segmentadr.
  211.   END IF
  212.  NEXT i&
  213.  
  214. '!
  215. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  216. '! Ermittle of HMA frei ist (erst ab DOS 5)
  217. '! INT 2F, AX=4A01H, Ret. BX: freier HMA,
  218. '! ES:DI=Adr. HMA (FFFF:FFFF = keine HMA)
  219. '! AX = 0 -> HMA unbenutzt
  220. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  221. '!
  222.  REG 1, &H4A01                         '! Get Ext. Memory Size
  223.  CALL INTERRUPT &H2F                   '! GET HMA SIZE
  224.  IF (REG (9) <> &HFFFF) OR (REG (6) <> &HFFFF) THEN '! HMA ?
  225.   IF REG(1) = 0 THEN
  226.    PRINT "HMA unbenutzt"
  227.   ELSE
  228.    PRINT "HMA frei: ";
  229.    PRINT REG (1);" Byte"               '! AX = Größe
  230.   END IF
  231.  END IF
  232.  
  233.  
  234. END SUB
  235.  
  236. SUB freemem
  237. '!---------------------------------------------------------
  238. '! ermittle den freien Speicher
  239. '!---------------------------------------------------------
  240. SHARED start&
  241. LOCAL frei&, ram&
  242.  
  243.  CALL INTERRUPT &H12                   '! BIOS: GET RAM SIZE
  244.  
  245.  ram& = REG(1)                         '! RAM Größe
  246.  ram& = ram& * &H3FF
  247.  frei& = ram& - (start& * 16)          '! berechne. freie Größe
  248.  
  249.  PRINT
  250.  PRINT "MS-DOS Free Memory  : ";
  251.  PRINT frei&;" Kbyte"                  '! freier Speicher
  252.  PRINT "MS-DOS Used Memory  : ";
  253.  PRINT start& * 16;" Kbyte"           '! belegter Speicher
  254.  
  255. END SUB
  256.  
  257. SUB progadr
  258. '!---------------------------------------------------------
  259. '! Ermittle die Anfangsadresse des Anwenderprogrammes
  260. '! über die undokumentierte Funktion 51H des INT 21.
  261. '! Diese gibt im Register BX die Segmentadresse des
  262. '! aktuellen PSP an. Dies ist gleichzeitig die Start-
  263. '! adresse der Anwenderprogramme.
  264. '!---------------------------------------------------------
  265.  LOCAL res$
  266.  SHARED start&
  267.  
  268.  REG 1, &H5100                         '! AX = 5100 -> read
  269.                                        '! PSP Segm. Adr
  270.  CALL INTERRUPT &H21                   '! Dispatcher INT
  271.  
  272.  IF (REG (0) AND &H01) > 0 THEN        '! Fehler ?
  273.   PRINT "Fehler beim Systemaufruf "; REG (1) '! AX = Fehlercode
  274.  ELSE
  275.   PRINT "User Progr. Adresse : ";
  276.   start& = REG(2)                      '! merke Adresse
  277.   res$ = HEX$(REG(2))                  '! Segm. Adr in BX
  278.   res$ = STRING$(4-LEN(res$),"0") + res$ '! führende Nullen
  279.   PRINT res$;":0000"
  280.  END IF
  281.  
  282. END SUB
  283.  
  284. SUB config
  285. '!---------------------------------------------------------
  286. '! lese die Konfiguration der Hardware über den INT 11
  287. '!---------------------------------------------------------
  288. LOCAL ax%, drive%, bytes&, frei&, disp%, i% , tmp%, dblsp%
  289. DIM a%(2)                             '! Hilfsvariable für MOVE
  290.  
  291.  CALL INTERRUPT &H11                  '! Lese Konfiguration
  292.  
  293.  ax% = REG(1)                         '! Wert in ax%
  294.  PRINT
  295.  IF (ax% AND 1) = 0 THEN              '! Floppys ?
  296.   PRINT "keine Diskettenlaufwerke gefunden "
  297.  ELSE
  298.   drive% = (ax% AND &HC0) / 64         '! Floppys -> b14, b15
  299.   PRINT "Floppy-Disks"; SPACE$(8);
  300.   FOR i% = 0 TO drive%                 '! n Drives
  301.    PRINT CHR$(&H41 + i%);": ";         '! Kennbuchstabe A: .. F:
  302.   NEXT i%
  303.  END IF
  304.  PRINT
  305.  PRINT
  306.  
  307. '!
  308. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  309. '! ist eine Festplatte im System integriert ?
  310. '! Platten befinden sich oberhalb der Floppys (C:, D:, etc.).
  311. '! Prüfe per INT 21, Funktion 1CH ob Platten vorhanden sind.
  312. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  313. '!
  314.  IF drive% < 2 THEN                    '! weniger als 1 Floppy?
  315.   drive% = 3                           '! Platte ab c:
  316.  ELSE
  317.   INCR drive%                          '! oberhalb Floppy
  318.  END IF
  319.  
  320.  FOR i% = drive% to drive% + 2         '! max. 3 Disks
  321.   REG 1, &H3600                        '! Funktion 3600
  322.   REG 4, i% AND &HFF                   '! Laufwerkscode
  323.   CALL INTERRUPT &H21                  '! INT 21
  324.   IF (REG(1) AND &HFF) <> &HFF THEN    '! Platte gefunden ?
  325.    PRINT "Disk "; SPACE$(15); CHR$(&H40+i%);": ";
  326.    tmp% = REG(4)                       '! Cluster
  327.  
  328. '!
  329. '! Achtung: wegen I*2 ist eine Typkonvertierung erforderlich !!!!
  330. '!
  331.    a%(1) = VARPTR(tmp%)                '! Adr. Variable übergeben!!!
  332.    a%(2) = VARSEG(tmp%)
  333.    clust& = 1
  334.    CALL MOVE (2,clust&,a%(1))
  335.  
  336.    bytes& = clust& * REG(3) * REG(1)
  337.    PRINT bytes&;                      '! Speichergröße
  338.    PRINT " Bytes"
  339.    PRINT "Sektoren pro Cluster : "; REG(1)
  340.    PRINT "Bytes pro Sektor     : "; REG(3)
  341.    PRINT "Bytes pro Cluster    : "; REG(1)*REG(3)
  342.    PRINT "Cluster              : "; clust&
  343.  
  344.    tmp% = REG(2)                      '! freie Cluster
  345. '!
  346. '! Achtung: wegen I*2 ist eine Typkonvertierung erforderlich !!!!
  347. '!
  348.    a%(1) = VARPTR(tmp%)                '! Adr. Variable übergeben!!!
  349.    a%(2) = VARSEG(tmp%)
  350.    fclust& = 0
  351.    CALL MOVE (2,fclust&,a%(1))
  352.  
  353.    frei& = fclust& * REG(3) * REG(1)
  354.    PRINT "Freie Kapazität      : "; frei&;    '! in Bytes
  355.    PRINT USING "Bytes (##.#";(frei& * 100.0 / bytes&);
  356.    PRINT " %)"                         '! in %
  357.   END IF
  358.  NEXT i%    '! nächstes Laufwerk
  359.  
  360.  PRINT "Weiter bitte eine Taste betätigen"
  361.  DO WHILE INKEY$ = "": WEND
  362.  
  363. '!
  364. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  365. '! prüfe ob DBLSpace installiert ist
  366. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  367. '!
  368.   REG 1, &H4A11                        '! Funktion AX:=4A11
  369.   REG 2, 0                             '! BX := 0 Install check
  370.   CALL INTERRUPT &H2F                  '! INT 2F
  371.   IF (REG(1) = 0) THEN                 '! DBLSpace gefunden ?
  372.    IF REG(2) = &H444D THEN             '! Signatur DM
  373.     PRINT
  374.     PRINT "DBLSpace installiert"
  375. '!
  376. '!  CL sollte 1. Laufwerk enthalten, funktioniert aber nicht
  377. '!  PRINT "1. DBLSpace Laufwerk "; CHR$(&H41+(REG(3) AND &HFF))
  378. '!
  379.     dblsp% = (REG(3) / 256) AND &HFF
  380.     PRINT "DBLSpace Laufwerke "; dblsp%
  381.     PRINT
  382. '!
  383. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  384. '! Ermittle Zuordnung der Hostlaufwerke
  385. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  386. '!
  387.  
  388.    FOR i% = drive% to drive%+dblsp%-1    '! max. 3 Disks
  389.     REG 1, &H4A11                        '! Funktion AX:=4A11
  390.     REG 2, 1                             '! BX := 1 Get Drive Mapping
  391.     REG 4, i%-1                          '! Drive Nummer
  392.     CALL INTERRUPT &H2F                  '! INT 2F
  393.     IF (REG(1) = 0) THEN                 '! DBLSpace gefunden ?
  394.      tmp% = REG(2) AND &H7F
  395.      PRINT "DBLSpace-Laufwerk "; CHR$(&H40+i%); ": = Host: "; CHR$(&H41+tmp%)
  396.     END IF
  397.    NEXT I%
  398.  
  399.    END IF
  400.   END IF
  401.  
  402. '!
  403. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  404. '! Anzeige weiterer Informationen aus dem BIOS Aufruf
  405. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  406. '!
  407.  
  408.  PRINT
  409.   disp% = (ax% AND &H30) / 16          '! Bildschirmadapter
  410.   SELECT CASE disp%
  411.    CASE 0
  412.     PRINT "Illegal Display Mode"
  413.    CASE 1
  414.     PRINT "Colorcard 40 x 25 Monochrom"
  415.    CASE 2
  416.     PRINT "Colorcard 80 x 25 Monochrom"
  417.    CASE 3
  418.     PRINT "Monochromcard 80 x 25"
  419.   END SELECT
  420.  
  421.  PRINT
  422.  PRINT "Serial Interfaces   : "; (ax% AND &H0E00) / 512
  423.  tmp& = (ax% AND &HC000) / &HFF / &H2F
  424.  PRINT "Parallel Interfaces : "; tmp&
  425.  
  426. END SUB
  427.  
  428. SUB MOVE (BYVAL xlen%, dest&, source%)
  429. '!
  430. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  431. '! Verschiebe n Bytes, Aufruf mit:
  432. '! CALL MOVE (Len, Ziel, Quelle)
  433. '!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  434. '!
  435.  
  436. $INCLUDE "MOVE.INC"
  437.  
  438. END SUB
  439.  
  440. '***** Programm Ende ******
  441.