CMOS RTC - Real Time Clock and Memory (ports 70h & 71h)
Reg# Description 00 RTC seconds 01 RTC seconds alarm 02 RTC minutes 03 RTC minutes alarm 04 RTC hours 05 RTC hours alarm 06 RTC day of week 07 RTC day of month 08 RTC month 09 RTC year 0A RTC Status register A: │7│6│5│4│3│2│1│0│ RTC Status Register A │ │ │ │ └─┴─┴─┴──── rate selection Bits for divider output │ │ │ │ frequency (set to 0110 = 1.024kHz, 976.562µs) │ └─┴─┴────────── 22 stage divider, time base being used; │ (initialized to 010 = 32.768kHz) └────────────── 1=time update in progress, 0=time/date available 0B RTC Status register B: │7│6│5│4│3│2│1│0│ RTC Status Register B │ │ │ │ │ │ │ └──── 1=enable daylight savings, 0=disable (default) │ │ │ │ │ │ └───── 1=24 hour mode, 0=12 hour mode (24 default) │ │ │ │ │ └────── 1=time/date in binary, 0=BCD (BCD default) │ │ │ │ └─────── 1=enable square wave frequency, 0=disable │ │ │ └──────── 1=enable update ended interrupt, 0=disable │ │ └───────── 1=enable alarm interrupt, 0=disable │ └────────── 1=enable periodic interrupt, 0=disable └─────────── 1=disable clock update, 0=update count normally 0C RTC Status register C (read only): │7│6│5│4│3│2│1│0│ RTC Status Register C (read only) │ │ │ │ └─┴─┴─┴──── reserved (set to 0) │ │ │ └────────── update ended interrupt enabled │ │ └────────── alarm interrupt enabled │ └────────── periodic interrupt enabled └────────── IRQF flag 0D RTC Status register D (read only): │7│6-0│ RTC Status Register D (read only) │ └───── reserved (set to 0) └────── 1=CMOS RAM has power, 0=CMOS RAM has lost power 0E Diagnostic status byte: │7│6│5│4│3│2│1│0│ Diagnostic Status Byte │ │ │ │ │ │ └─┴──── reserved │ │ │ │ │ └─────── 1=time is invalid, 0=ok (POST validity check) │ │ │ │ └──────── 1=fixed disk 0 failed initialization, 0=ok │ │ │ └───────── 1=memory size doesn't match config info, 0=ok │ │ └────────── 1=invalid config info found, 0=ok (see below) │ └─────────── 1=config record checksum is bad, 0=ok └──────────── 1=RTC lost power, 0=power state stable 0F Shutdown status byte: 0 soft reset or unexpected shutdown 1 shut down after memory size determination 2 shut down after memory test 3 shut down with memory error 4 shut down with boot loader request 5 JMP DWORD request with INT init 6 protected mode test 7 passed 7 protected mode test 7 failed 8 protected mode test1 failed 9 block move shutdown request A JMP DWORD request without INT init 10 Diskette drive type for A: and B: │7│6│5│4│3│2│1│0│ Diskette drive type for A: and B: │ │ │ │ └─┴─┴─┴──── second diskette type └─┴─┴─┴─────────── first diskette type 0000 no drive installed 0001 DSDD 48 TPI drive 0010 DSQD 96 TPI drive other values are reserved 11 Reserved 12 Fixed disk drive type for drive 0 and drive 1 │7│6│5│4│3│2│1│0│ Diskette drive type for A: and B: │ │ │ │ └─┴─┴─┴──── second hard disk drive code (0000=no disk) └─┴─┴─┴─────────── first hard disk drive code (0000=no disk) 13 Reserved 14 Equipment byte │7│6│5│4│3│2│1│0│ Equipment byte │ │ │ │ │ │ │ └──── 1=diskette drives installed, 0=none │ │ │ │ │ │ └───── 1=math coprocessor installed, 0=none │ │ │ │ └─┴────── unused │ │ └─┴─────── primary display └─┴────────── number of diskette drives installed Bits Bits 54 Primary Display 76 Number of Drives 00 reserved 00 1 diskette drive 01 40 column color 01 2 diskette drives 10 80 column color 10 reserved 11 monochrome 11 reserved 15 LSB of system base memory in 1k blocks 16 MSB of system base memory in 1k blocks 17 LSB of total extended memory in 1k blocks 18 MSB of total extended memory in 1k blocks 19 Drive C extension byte (reserved AT) 1A Drive D extension byte (reserved AT) 1B 13 bytes reserved 2E CMOS checksum of bytes 10h-20h (MSB) 2F CMOS checksum of bytes 10h-20h (LSB) 30 LSB of extended memory size found above 1 megabyte during POST 31 MSB of extended memory size found above 1 megabyte during POST 32 Date century byte in BCD ( BIOS interface to read and set) 33 Information flags (set during power-on) │7│6│5-0│ Information Flags │ │ └───── reserved │ └─────── initial setup message flag └──────── 1=IBM 128k expansion installed, 0=none 34 12 bytes reserved Programming Considerations: Write CMOS address to read or write to port 70h Read/write port 71h to get/set data - the information here is only applicable to AT and PS/2 systems - INT 1A is used to read/set the Time of Day and Alarm. To use the alarm, INT 4A must be a valid interrupt service routine. - configuration settings are maintained using the Motorola MC146818 Real Time Clock. Each of this chips 64 memory registers is used for storage (0-3F). - Bit 5 of the diagnostic (0Eh) status byte is set during a power on test. This Bit is set if no floppy disks are found or the display doesn't match the system display switch setting. - all addresses sent to port 70h have Bits 7&6 clear since Bit 7 of port 70h is used to enable/disable NMI. Setting this Bit 7 enables NMI, clearing this Bit disables NMI. - when masking the NMI through using port 70H, port 71H should be read immediately after or the RTC may be left in an unknown state. This wont affect the PS/2 watchdog timer or system channel timeout. - see INT 1A