Frage zu int 1Ah und BCD-Codierung



  • Ich versuche gerade vom Interrupt 1Ah (Systemuhr)
    die aktuelle Zeit auszulesen. Die Werte sind BCD-Codiert,
    also theoretisch:

    Zahl = BCD-Nummer

    0 = 0 0 0 0
    1 = 0 0 0 1
    2 = 0 0 1 0
    3 = 0 0 1 1
    4 = 0 1 0 0
    5 = 0 1 0 1
    6 = 0 1 1 0
    7 = 0 1 1 1
    8 = 1 0 0 0
    9 = 1 0 0 1

    Wenn ich jetzt aber um 18 Uhr die Werte von der Systemuhr auslese,
    dann kommt da bei CH weder 1001 (=9), noch 00011000 (=18) zurück.
    Was mache ich da falsch?

    MfG,
    [Morpheus]



  • 18h wäre eigentlich richtig, wenn das BCD-kodiert ist. Was kommt denn stattdessen?



  • könnte es sein, dass du 0110 (==6) erhälst 😃



  • Hi

    bzw den Wert für die Sommerzeit? also um eine Stunde verschoben? bzw sogar nur die UHC Zeit? Schau dir im Bios mal die zeit an dan solltest du wissen was er da zurückgeben sollte.

    gruss Glisglis



  • könnte es sein, dass du 0110 (==6) erhälst 😃

    Nein :p 😉

    bzw sogar nur die UHC Zeit?

    Meinst du, dass mein BIOS die Funktion nicht unterstützt?

    Was kommt denn stattdessen?

    Ich habe alle Werte von 0-24 ausprobiert (Normal und in BCD).
    Ich werde mir aber jetzt mal eine Funktion schreiben, die mir
    den Wert ausgibt ... oder gibt es eine einfachere Möglichkeit?

    Das Interrupt rufe ich so auf:

    mov ah,02h
    int 0x1A
    

    Danach prüfe ich den CH wert.
    http://www.ctyme.com/intr/rb-2273.htm

    MfG,
    [Morpheus]



  • Hallöchen,

    meine Zeit in Assembler und BCD liegt zwar schon ein bissel zurück, was hier aber offenbar missverstanden wird, ist die BCD-Codierung.

    Wenn ich richtig gerechnet habe, müsstest Du um 18 Uhr 24 geliefert bekommen.

    Die BCD-Kodierung = Binary Coded Dezimal benutzt für jede darzustellende Stelle ein Nibble (= 4 Bit). Damit werden in jedem Nibble nicht 0 bis 15, sondern nur 0 bis 9 dargestellt. Der Wert 18 stellt sich im Byte daher nicht so dar 00010010, sondern 00011000 = Oberes Nibble 1 und unteres Nibble 8.

    Um die Werte entsprechend auszulesen, mußt Du also das untere Nibble mit AND $0F nehmen und das obere Niblle mit AND $F0 dividiert durch 10 berechnen.

    Ich hoffe, das ich mich mit den ganzen Nullen und Einsen nicht vertippt habe.



  • Manfred Schmidtke schrieb:

    Der Wert 18 stellt sich im Byte daher nicht so dar 00010010, sondern 00011000 = Oberes Nibble 1 und unteres Nibble 8.

    das hat er doch im ersten beitrag schon erwähnt, aber 00011000 sieht er auch nicht



  • 🙄 Sorry, wer lesen kann ist klar im Vorteil!


Anmelden zum Antworten