taskit MoDOS II
Anwendungsbeispiel
Demonstration von Ausgabe und Powermanagement des MoDOS II
Eines der wichtigsten Features beim MoDOS II ist die Möglichkeit Strom zu sparen, da er mit Akkus betrieben wird. Hier ist ein einfaches Beispiel das in der Praxis sehr oft anwendbar ist. Oft wartet ein Programm auf eine Eingabe vom Benutzer. Obwohl nichts geschieht wird trotzdem viel Strom verbraucht. Um nun den Stromverbrauch zu reduzieren kann man das MoDOS II für diese Wartezeit "schlafen" legen bis die Eingabe vom Benutzer getätigt wird, um dann wieder zu "erwachen" und die Eingabe zu verarbeiten.
Geschrieben wurde dieses Programm für PowerBasic 3.2 es sollte aber auch mit anderen Basic Varianten Funktionieren.
Beispiel:
' ***************************************************************** '
' *** Demonstration von Ausgabe und Powermanagement des MoDOSII *** '
' ***************************************************************** '
' * Geschrieben wurde dieses Programm für PowerBasic 3.2 * '
' * es sollte aber auch mit anderen Basic Varianten Funktionieren * '
' * Kompilieren: PBC PM_DEMO.BAS -CE * '
' ***************************************************************** '
' ----------- Konstanten und Sonderzeichen definieren ----------- '
ENTER$ = CHR$(13) + CHR$(10) ' ENTER = Carriage Return + Line Feed
' Die folgenden Konstanten werden benötigt um den Sparmodus zu aktivieren
' sie sind dem MoDOSII Handbuch (Abschnitt: BIOS Referenz) zu entnehmen
%SPEED_VECTOR = &h15 'INT Interrupt
%SPEED_FUNC = &hC300 'AH Speed Funktion
%MODE_DOWN = &h0013 'AL Modus POWERDOWN
%VERY_LOW = &h0000 'BL Sparnivieau
' ------------------ Funktionen bekanntmachen ------------------- '
' *** Sparmodus aktivieren
DECLARE SUB PM_DOWN_MODE()
' *** Text auf den LCD ausgeben
DECLARE SUB printc(zeile AS STRING)
' *** Text unter Verwendung der Sparfunktion(PM_DOWN_MODE) einlesen
DECLARE FUNCTION PM_GETSTRING() AS STRING
' *** Tastaturpuffer leeren, da sonst das Erwachen durch Interrupt gestört wird
DECLARE SUB FLUSH_STDIN()
' ----------------------- Das HAUPTPROGRAMM --------------------- '
DIM ihr_name AS STRING
' Meldung auf dem LCD ausgeben
printc(ENTER$ + "Bitte ihren Namen")
printc(ENTER$ + "eingeben:")
' Name einlesen
ihr_name$ = PM_GETSTRING
' Name auf dem LCD ausgeben
printc(ENTER$ + ENTER$ + " Hallo " + ihr_name$ + "!")
printc(ENTER$ + ENTER$ + "mit ENTER beenden")
' Sparmodus aktivieren bis das Programm beendet wird
DO
PM_DOWN_MODE
LOOP WHILE INKEY$ <> chr$(13) ' wenn gedrückte Taste ENTER (chr$(13)) ist ->
' Programm beenden
END
' --------------------- Ende des HAUPTPROGRAMMs ----------------- '
' ---------------------- Funktionen definieren ------------------ '
' *** versetzt den Rechner in den POWERDOWN-Mode
' *** zum Normalbetrieb durch IRQ (4ms) (MATIXTASTATUR UND COM)
' *** das MoDOS ist so konfiguriert das es je Sekunde einen interrupt auslösst
SUB PM_DOWN_MODE()
' falls zuvor eine Textausgabe auf das LCD stattgefunden
' hat, wird hier die Aktualisierung erzwungen
CALL interrupt &h72 ' LCD BIOS
reg 1, %SPEED_FUNC + %MODE_DOWN ' AX Parameter festlegen
reg 2, %VERY_LOW ' BX (BL) Parameter
CALL interrupt %SPEED_VECTOR ' Funktion ausführen
delay(0.05) ' Aufwachzeit ~5ms
END SUB
' *** Textusgabe (BIOS Funktion) auf das LCD
' ### Parameter: Ausgabestring
' !!! Stringverknüpfung mit "+" möglich
SUB printc(zeile AS STRING)
DIM counter AS INTEGER
FOR counter% = 1 TO len(zeile$) ' Schleife: Alle Zeichen einzeln ausgeben
reg 1,&h0200 ' Text ausgeben
reg 4,asc(MID$(zeile$, counter%, 1)) ' Paramter: ein Zeichen
call interrupt &h21 ' LCD Erweiterungs-BIOS Funktion ausführen
NEXT
END SUB
' ******* Ein String einlesen ****************** '
' Daniel Carl @ taskit GmbH '
' Erstellt: 21.01.2005 '
FUNCTION PM_GETSTRING$()
DIM keyAS STRING, , inputstring AS STRING
DIM position AS INTEGER, max_length AS INTEGER
key$ = "" ' Tastatureingabe
position% = 0 ' Stringposition
max_length% = 255 ' maximale Stringlänge
inputstring$ = "" ' fertiger String
DO
PM_DOWN_MODE ' "SCHLAFEN" legen, Aufwachen bei Tastendruck(IRQ)
key$ = INKEY$ ' gedrückte Taste einlesen
' falls während der "Aufwachphase" mehrere Tasten gedrückt wurden diese
' löschen, da dies den Ablauf stören würde
FLUSH_STDIN
' wenn die Eingabe ein Zeichen war, dieses an den String anfügen
IF key$ <> "" AND key$ <> CHR$(8) AND key$ <> CHR$(13) THEN ' CHAR
' nur dann anfügen wenn die Maximale stringlänge noch nicht
' erreicht ist
IF position% = max_length% THEN
beep
ELSE
printc(key$) ' Eingabe anzeigen
inputstring$ = inputstring$ + key$ ' Eingabe anhängen
position% = position% + 1 ' Stringposition erhöhen
END IF
key$ = ""
' wenn DEL gedrückt wurde und schon ein Zeichen eingegeben wurde,
' dieses löschen
ELSEIF key$ = CHR$(8) AND position% <> 0 THEN ' DEL
printc(CHR$(8) + " " + CHR$(8)) ' Zeichen von Anzeige löschen
position% = position% - 1 ' Stringposition dekrementieren
inputstring$ = LEFT$(inputstring$, position%) ' Zeichen löschen
key$ = ""
END IF
LOOP WHILE key$ <> CHR$(13) ' solange bis ENTER gedrückt wird
FUNCTION = inputstring$ ' Eingegeben String zurückgeben
END FUNCTION
' tastaturpuffer leeren
SUB FLUSH_STDIN()
DIM counter AS INTEGER, zeichen AS STRING
counter% = 0
DO
zeichen$ = INKEY$
counter% = counter% + 1
LOOP WHILE counter% <> 256 ' Tastaturpuffer von 256
END SUB 