The following article was printed in issue 10 1986 of the magazine „CT".
CP/M Plus supports a clock for accessing date and time through a BDOS call.
This article demonstrates once again how to process the format of date and time.
|
|
Fröhliches Rechnen - Teil 2
Noch einmal Turbo-Pascal und die CP/M-Plus-Uhr
Achim Walder/Tillman Reh
Schon einmal war eine Turbo-Pascal-Prozedur, die aus dem 'unmöglichen' Datenformat der CP/M-Plus-Uhrenfunktion 'ordentliche' Werte zaubert, Gegenstand eines c't-Artikels.
Die damals abgedruckte Prozedur hat nur einen Nachteil:
Sie ist in Assembler geschrieben und damit für diejenigen Leser, die dieser Sprache nicht mächtig sind, kaum änderbar.
Dies soll jetzt anders werden - mit einer neuen, vollständig in Turbo kodierten Uhrenprozedur.
Um noch einmal das Problem zu umreißen:
Als Neuerung gegenüber CP/M 2.2 kann CP/M-Plus unter anderem auch eine Uhr bedienen (BDOS-Funktion 105).
Allerdings verwendet diese Funktion ein etwas eigenwilliges Datenformat - die Uhrzeit (Stunde, Minute, Sekunde) wird BCD-kodiert, und das Datum erscheint als Anzahl der Tage seit dem 1.1.1978.
Mit diesen Werten kann kaum ein Programm etwas anfangen, in der Regel muß eine Datenumwandlungsroutine 'vorgeschaltet' werden.
Die Umwandlung ist zwar nicht besonders aufwendig, inzwischen stehen auch etliche Beispiellösungen zum 'Abkupfern' zur Verfügung.
Nur sind diese fast ausschließlich in Assembler geschrieben, was einem eingefleischten Turbo-Pascal-Programmierer nicht unbedingt das Leben erleichtert.
Selbst wenn er sie Turbo-freundlich als INLINE-Prozedur serviert bekommt, gibt es immer wieder den Fall, wo Änderungen erforderlich sind.
Und dann geht das Knobeln los...
Voll und ganz Turbo
Die hier abgedruckte Prozedur GET_TIME ist zur Abwechslung einmal vollständig in Turbo-Pascal abgefaßt.
Im Gegensatz zu anderen Pascal-Dialekten besitzt Turbo-Pascal mit den BDOS- und BIOS-Standardfunktionen einen unmittelbaren 'Draht' zu den Systemroutinen von CP/M.
Über diesen werden gleich zu Beginn der Prozedur Datum, Stunde und Minute in das Feld DAT und die Sekunden in die BYTE-Variable S eingelesen.
Das Weitere ist nur noch Umverteilen und Umrechnen:
S, M und H werden mit Hilfe der Funktion BINAER in 'vernünftige' Werte umgewandelt.
Mit dem Wert der Variablen DATUM (zusammengesetzt aus DAT[0] und DAT[1]) passiert etwas mehr, schließlich sind darin Tag, Monat, Jahr und Wochentag enthalten.
Wenn's sein muß, läßt sich aus dem 'Zähler-Datum' von CP/M-Plus ohne große Klimmzüge sogar die Kalenderwoche berechnen (hier nicht vorgesehen).
Die entsprechenden Variablen - in gleicher Reihenfolge - heißen T, MO, J und WT.
Das Hauptprogramm DIS-PLAY_TIME ist lediglich als Beispiel für den Aufruf von GET_TIME gedacht.
Es schreibt bis zum Drücken einer Taste laufend Tag, Monat, Jahr und die Uhrzeit auf den Bildschirm.
Literatur
W. Wagemuth, Einsteigen in CP/M, Teil 6: Das BDOS von CP/M-Plus, c't 12/85
R. Weitkunat/M. Bührer, Fröhliches Rechnen, Datum und Uhrzeit unter CP/M-Plus, c't 5/86
M. Neuhaus, Tag und Stunde in den Listings von CP/M-2-Programmen, c't 8/86
|
Das Programm berücksichtigt nicht das Jahr 2000, so dass ein Jahrzehnt größer 99 werden kann.
In der korrigierten Quelle ist das berücksichtigt.
|
BCD-Code
'BCD' ist die Abkürzung von 'binary coded decimal', was man mit 'binär kodierte Dezimalziffer' übersetzen kann.
Der BCD-Code ist ein 4-Bit-Code für Dezimalziffern, der sich vom 4-Bit-Hexadezimalcode lediglich darin unterscheidet, daß von den 16 möglichen 4-Bit-Kombinationen nur die zehn definiert sind, die einer Dezimalziffer entsprechen (siehe Tabelle).
Der BCD-Code erlaubt, binäre, speziell programmierbare Logik ohne große Veränderungen für Rechnungen mit Dezimalzahlen einzusetzen.
Man muß nur dafür sorgen, daß die 'verbotenen' Bitkombinationen nicht auftreten.
Ergibt beispielsweise die Addition zweier BCD-Ziffern einen Wert größer neun (= Überlauf in die nächste Dezimalstelle), so ist noch einmal sechs hinzuzufügen, um den ungültigen Wertebereich zu überspringen.
Mikroprozessoren besitzen zu diesem Zweck Korrekturbefehle (wie DAA beim 8080/Z80) oder einen speziellen Rechenmodus mit automatischer Korrektur (zum Beispiel beim 6502).
Anwendung findet der BCD-Code immer dann, wenn praktisch nur mit Dezimalzahlen gerechnet wird (etwa in kaufmännischen oder technisch/wissenschaftlichen Programmen), weil in dem Fall die BCD-Darstellung zu geringeren Rundungsfehlern führt als die Hex-Darstellung.
dez. Bitmuster hex BCD
|
0 0 0 0 0 0 0
1 0 0 0 1 1 1
2 0 0 1 0 2 2
3 0 0 1 1 3 3
4 0 1 0 0 4 4
5 0 1 0 1 5 5
6 0 1 1 0 6 6
7 0 1 1 1 7 7
8 1 0 0 0 8 8
9 1 0 0 1 9 9
10 1 0 1 0 A −
11 1 0 1 1 B −
12 1 1 0 0 C −
13 1 1 0 1 D −
14 1 1 1 0 E −
15 1 1 1 1 F −
|
(„−” sind ungültige Codes)
|
Scanned by
Werner Cirsovius
December 2002
© Heise Verlag