Index: boot/freeldr/freeldr/arch/i386/pcrtc.c =================================================================== --- boot/freeldr/freeldr/arch/i386/pcrtc.c (revision 36330) +++ boot/freeldr/freeldr/arch/i386/pcrtc.c (working copy) @@ -48,20 +48,27 @@ * CF set on error */ Regs.b.ah = 0x04; - Int386(0x1A, &Regs, &Regs); - - if (NULL != Year) + do { - *Year = 100 * BCD_INT(Regs.b.ch) + BCD_INT(Regs.b.cl); + Int386(0x1A, &Regs, &Regs); } - if (NULL != Month) + while ((Regs.x.eflags & I386FLAG_CF) != 0); + + if ((Regs.x.eflags & I386FLAG_CF) == 0) { - *Month = BCD_INT(Regs.b.dh); + if (NULL != Year) + { + *Year = 100 * BCD_INT(Regs.b.ch) + BCD_INT(Regs.b.cl); + } + if (NULL != Month) + { + *Month = BCD_INT(Regs.b.dh); + } + if (NULL != Day) + { + *Day = BCD_INT(Regs.b.dl); + } } - if (NULL != Day) - { - *Day = BCD_INT(Regs.b.dl); - } } if (NULL != Hour || NULL != Minute || NULL != Second) @@ -84,20 +91,27 @@ * CF set on error (i.e. clock not running or in middle of update) */ Regs.b.ah = 0x02; - Int386(0x1A, &Regs, &Regs); - - if (NULL != Hour) + do { - *Hour = BCD_INT(Regs.b.ch); + Int386(0x1A, &Regs, &Regs); } - if (NULL != Minute) + while ((Regs.x.eflags & I386FLAG_CF) != 0); + + if ((Regs.x.eflags & I386FLAG_CF) == 0) { - *Minute = BCD_INT(Regs.b.cl); + if (NULL != Hour) + { + *Hour = BCD_INT(Regs.b.ch); + } + if (NULL != Minute) + { + *Minute = BCD_INT(Regs.b.cl); + } + if (NULL != Second) + { + *Second = BCD_INT(Regs.b.dh); + } } - if (NULL != Second) - { - *Second = BCD_INT(Regs.b.dh); - } } }