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


Anmelden zum Antworten