Bildschirm abschalten
-
Hallo,
ich möchte meinen Bildschirm abschalten. Ich hab die Info, dass ich das mit dem Interrupt 12h und dem unterpunkt 36h machen kann. Hab aber leider keine idee, wie ich das im assembler schreiben muss.
Kann mir da jemand helfen?mfg
Manuel
-
Hi.
Ich kann zwar nicht nachpruefen, ob deine Informationen richtig sind (hier steht zumindest nichts von Bildschirm abschalten) aber das ganze koennte theoretisch so aussehen:
mov ah,36h int 12h
Welches System benutzt du denn?
-
Mein OS ist Windows 2000.
-
In Windowsprogrammen sollte man eigentlich keine Interrupts verwenden.
Die Kommunikation mit dem System funktioniert hier im Allgemeinen ueber die WinAPI etc.
Leider kann ich dir nicht sagen, wie eine Funktion zum Abschalten des Monitors genau zu implementieren waere, da ich selbst nicht fuer Windows programmiere.
-
Ich habe das einfach mal ausprobiert (mit TASM):
.model tiny .code org 100h START: mov ah,36h ; Zum Abschalten des Bildschirms int 12h ; Abschalten! mov ah,4Ch ; Zum beenden des Programms int 21h ; Beende! END START
Funktioniert aber nicht
Keine Ahnung warum...[ Dieser Beitrag wurde am 29.05.2003 um 15:48 Uhr von nEo SkYwAlKeR editiert. ]
-
zum Abschalten:
Port $3da auslesen (Wert wird nicht gebraucht)
Port $3ba auslesen (Wert wird nicht gebraucht)
$00 nach Port $3c0 senden
-
Hi <qqqqqqqqq>.
Interessanter Vorschlag, aber wie schaltet man den Bildschirm dann wieder ein?
Mal abgesehen davon, dass dieser Code in Win2K-Anwendungen nicht funktionieren wird, ist das IMHO eine ziemliche Holzhammer-Methode, die du da versuchst...
Der Bildschirm wird hier eigentlich nur wegen einer falschen Bedienung der Grafikkarte schwarz (Die Palette Register sollten nur waehrend eines Vertical retrace angesprochen werden) ausserdem schaltet er sich nicht ab! (H/V-Retrace signale werden weiterhin gesendet)
Ich habe hier einen getesteten Code, der in DOS-Programmen (oder eben im eigenen OS
) den Bildschirm ausschgaltet, indem so ziemlich alle Signalgebenden Teile der Grafikkarte ausgeschaltet werden. (zudem wird auch noch der Systemspeicher, der von der Grafikkarte belegt wird freigegeben
)
mov dx,03DAh in al,dx ;reset Address/Attribute FlipFlop ;wers ganz genau nimmt, kann hier vorher mal auschecken, ob der Statusregister nun auf 03BA oder 03DA liegt... ;Disable sequencer Bit0=ASR=1/Bit1=SR=0 ;=>perform sinchronous reset/halt (no data loss) mov dx,03C4h mov ax,0100h ;Reset Register (Index=00 [in al]) out dx,ax ;Blank Screen mov al,01h ;select Clocking Mode Register (Index=01 [in al]) out dx,al inc dx in al,dx ;read contents dec dx or al,20h ;Set Bit5=SO=>disable access to video memory/blank screen (leaves Retrace signals enabled!) mov ah,al mov al,01h ;write back (Index=01 etc. s.a.) out dx,ax ;Disable H/V Retrace signals mov dx,03D4h mov al,17h ;select CRT Mode Control Register (Index=17 [in al]) out dx,al inc dx in al,dx ;read contents dec dx and al,7Fh ;Clear Bit7: RST=>Disable H/V-Retrace signals mov ah,al mov al,17h out dx,ax ;write back (Index=17h etc. s.a.)
Um den Bildschirm wieder einzuschalten, einfach alles was in der Prozedur da oben ablaeuft rueckgaengig machen:
- Retrace-Signale wieder einschalten, indem Bit7 vom CRT Mode Control Register wieder auf 1 gesetzt wird
- Bildschirm wieder einschalten, indem Bit5 vom Clocking mode Register wieder auf 0 gesetzt wird
- Sequencer wieder einschalten, indem Bit0 und 1 vom Reset Register auf 1 gesetzt werden.
-
Hallo,
danke für den Code der funktioniert schon recht gut aber leider nur in dem Dos Fenster, in dem der Assembler läuft.
Geht das auch, dass ich das Programm Systemweit laufen lassen kann? Wenn ich es als .com speichere gibt es einen Fehler und er startet wieder nur in einem kleinen Fenster.mfg
mattu82
-
Wenn du unetr Windows bist, musst du so oder so die WinAPI befragen, da darfst du als Benutzerprogramm leider nicht selbst ran
-
kmd