'===========================================================================
' Subject: READ CMOS STATE                    Date: 01-13-97 (21:36)       
'  Author: John Woodgate                      Code: QB, QBasic, PDS        
'  Origin: FidoNet QUIK_BAS Echo            Packet: DOS.ABC
'===========================================================================
DEFINT A-Z

DECLARE FUNCTION CMOSBattery% ()
DECLARE FUNCTION BitOn% (Which%, IntVal%)
DECLARE FUNCTION DriveType% (Drv%)
DECLARE FUNCTION Hex2Bin$ (Hcs$)
DECLARE FUNCTION TotalMem% ()

DIM Day$(1 TO 7)
Day$(1) = "Sunday"
Day$(2) = "Monday"
Day$(3) = "Tuesday"
Day$(4) = "Wednesday"
Day$(5) = "Thursday"
Day$(6) = "Friday"
Day$(7) = "Saturday"

CLS
PRINT "CMOS Contents:"
FOR i = 0 TO &H7F
 OUT &H70, i: PRINT USING "\   \"; HEX$(INP(&H71));
NEXT i
PRINT " "
PRINT "CMOS Battery State: ";

IF CMOSBattery% THEN
 PRINT "Good"
ELSE
 PRINT "Battery low"
END IF
PRINT

FOR c = 1 TO 2
 k% = DriveType%(c)
 PRINT "Drive " + CHR$(c + 64) + ": ";
 IF k% = 0 THEN PRINT "None"
 IF k% = 1 THEN PRINT "5"; CHR$(172); " 360K"
 IF k% = 2 THEN PRINT "5"; CHR$(172); " 1.2M"
 IF k% = 3 THEN PRINT "3"; CHR$(171); " 720K"
 IF k% = 4 THEN PRINT "3"; CHR$(171); " 1.44M"
NEXT
PRINT

OUT &H70, &H19: B = INP(&H71)
PRINT "Hard Disk 0 Type:";
IF B <> 0 THEN
 PRINT B%
ELSE
 PRINT " Not Installed"
END IF
OUT &H70, &H1A
B% = INP(&H71)
PRINT "Hard Disk 1 Type:";
IF B <> 0 THEN
 PRINT B%
ELSE
 PRINT " Not Installed"
END IF
PRINT

OUT &H70, &H15: B = INP(&H71)
OUT &H70, &H16: B1 = INP(&H71)
PRINT "Base Memory:"; RTRIM$(STR$(CVI(CHR$(B) + CHR$(B1%)))); "K"

OUT &H70, &H17: B = INP(&H71)
OUT &H70, &H18: B1 = INP(&H71)
PRINT "Extended Memory:"; RTRIM$(STR$(CVI(CHR$(B) + CHR$(B1%)))); "K"
PRINT "Total System Memory:"; RTRIM$(STR$(TotalMem%)); "K"
PRINT
OUT &H70, &H6: a% = INP(&H71)
PRINT Day$(a%)
DO
 OUT &H70, 4: hr% = VAL(HEX$(INP(&H71)))
 OUT &H70, 2: mn% = VAL(HEX$(INP(&H71)))
 OUT &H70, 0: sc% = VAL(HEX$(INP(&H71)))
 LOCATE , 1
 IF hr% < 12 THEN
  Ex$ = " AM"
 ELSE
  Ex$ = " PM"
 END IF
 IF hr% = 0 THEN hr% = 12
 IF hr% > 12 THEN hr% = hr% - 12
 PRINT USING "##:##:##"; hr%; mn%; sc%;
 PRINT Ex$;
LOOP UNTIL LEN(INKEY$)

FUNCTION BitOn (Which, IntVal)

BitOn = 0
SELECT CASE Which
 CASE 1: IF (IntVal AND 128) THEN BitOn = (-1)
 CASE 2: IF (IntVal AND 64) THEN BitOn = (-1)
 CASE 3: IF (IntVal AND 32) THEN BitOn = (-1)
 CASE 4: IF (IntVal AND 16) THEN BitOn = (-1)
 CASE 5: IF (IntVal AND 8) THEN BitOn = (-1)
 CASE 6: IF (IntVal AND 4) THEN BitOn = (-1)
 CASE 7: IF (IntVal AND 2) THEN BitOn = (-1)
 CASE 8: IF (IntVal AND 1) THEN BitOn = (-1)
 CASE 9: IF (IntVal AND (-32768)) THEN BitOn = (-1)
 CASE 10: IF (IntVal AND 16384) THEN BitOn = (-1)
 CASE 11: IF (IntVal AND 8192) THEN BitOn = (-1)
 CASE 12: IF (IntVal AND 4096) THEN BitOn = (-1)
 CASE 13: IF (IntVal AND 2048) THEN BitOn = (-1)
 CASE 14: IF (IntVal AND 1024) THEN BitOn = (-1)
 CASE 15: IF (IntVal AND 512) THEN BitOn = (-1)
 CASE 16: IF (IntVal AND 256) THEN BitOn = (-1)
END SELECT
END FUNCTION

FUNCTION CMOSBattery%

OUT &H70, &HD
B% = INP(&H71)
c = BitOn%(1, B%)
CMOSBattery% = c
END FUNCTION

FUNCTION DriveType% (Drv%)

OUT &H70, &H10
B% = INP(&H71)
IF Drv% = 1 THEN
 t$ = LEFT$(Hex2Bin$(LTRIM$(RTRIM$(HEX$(B%)))), 4)
ELSE
 t$ = MID$(Hex2Bin$(LTRIM$(RTRIM$(HEX$(B%)))), 5, 4)
END IF
IF t$ = "0001" THEN DriveType% = 1
IF t$ = "0010" THEN DriveType% = 2
IF t$ = "0011" THEN DriveType% = 3
IF t$ = "0100" THEN DriveType% = 4
END FUNCTION

FUNCTION Hex2Bin$ (Hcs$)

Hcs$ = UCASE$(Hcs$)
lc = LEN(Hcs$)
FOR x = 1 TO lc
 SELECT CASE MID$(Hcs$, x, 1)
  CASE "0"
   Out$ = Out$ + "0000"
  CASE "1"
   Out$ = Out$ + "0001"
  CASE "2"
   Out$ = Out$ + "0010"
  CASE "3"
   Out$ = Out$ + "0011"
  CASE "4"
   Out$ = Out$ + "0100"
  CASE "5"
   Out$ = Out$ + "0101"
  CASE "6"
   Out$ = Out$ + "0110"
  CASE "7"
   Out$ = Out$ + "0111"
  CASE "8"
   Out$ = Out$ + "1000"
  CASE "9"
   Out$ = Out$ + "1001"
  CASE "A"
   Out$ = Out$ + "1010"
  CASE "B"
   Out$ = Out$ + "1011"
  CASE "C"
   Out$ = Out$ + "1100"
  CASE "D"
   Out$ = Out$ + "1101"
  CASE "E"
   Out$ = Out$ + "1110"
  CASE "F"
   Out$ = Out$ + "1111"
 END SELECT
NEXT
Hex2Bin$ = Out$
END FUNCTION

FUNCTION TotalMem%

OUT &H70, &H15
B% = INP(&H71)
OUT &H70, &H16
B1% = INP(&H71)
a1% = CVI(CHR$(B) + CHR$(B1%))
OUT &H70, &H17
B% = INP(&H71)
OUT &H70, &H18
B1% = INP(&H71)
a2% = CVI(CHR$(B) + CHR$(B1%))
TotalMem% = a1% + a2%
END FUNCTION
