OpenBCM V1.07b12 (Linux)

Packet Radio Mailbox

DB0FHN

[JN59NK Nuernberg]

 Login: GUEST





  
DO3GM  > PROGSPR  25.05.99 20:42l 154 Lines 5754 Bytes #-9125 (0) @ 
BID : P59DB0PRT039
Read: DG4SGE DB3YAD DG8MP GUEST DD3IA
Subj: RE: hilfe zu pascal-problem!!!
Path: DB0PRT
Sent: 990525/1836z @:DB0PRT.#BW.DEU.EU [Reutlingen JN48OM] bcm1.40q1
From: DO3GM @ DB0PRT.#BW.DEU.EU
To:   PROGSPR
Reply-To: DO3GM @ DB0CZ.#BW.DEU.EU
X-Info: No login password

Hallo Björn [DG2BHB] und alle anderen Programmierer!

Hier ist ein kleiner Beispiel Source für ein TSR unter Turbo Pascal.
Das TSR zeigt nach dem starten ständig die Uhrzeit auf dem Textscreen
ganz oben rechts an, alle 5 Sekunden (auf den Programmstart bezogen,
nicht auf eine durch 5 restlos teilbare Sekundenzahl) wird zusätzlich
ein 1000 Hz-Pieps und das 'Bell'-Zeichen (0x07) angezeigt.
Die Funktionsweise des Programms ist folgende:
Das Programm installiert einen eigenen Interrupt-Handler, hier die
'procedure timerhandler', auf den Interrupt 0x1c. Dieser Interrupt
wird ca. alle 18,2 Sekunden von Interrupt 0x08 (= IRQ0 = Timer) aufge-
rufen. Danach wird die Function 'keep()' aufgerufen, die das Programm
zwar beendet, aber das Programm (und damit auch die procedure
'timerhandler') trotzdem noch im Speicher lässt.
Wenn man am Ende den 'keep' Befehl nicht benutzt, wird der Rechner
höchstwahrscheinlich 'abschmieren', da der durch dieses Programm belegte
Speicher wieder freigegeben wird und danach durch andere Programme
überschrieben werden kann (die CPU ruft weiterhin die Prozedur an einer
bestimmten Adresse - der von 'timerhandler' - auf, und zwar unabhängig
davon, ob sich an der Adresse gültiger Programmcode befindet oder 
nicht...). Um dies zu verhindern sollte man am Ende des Programms den
ursprünglichen Interruptvektor wiederherstellen ( setintvec($1c,@old-
timerhandler); ),wenn man kein TSR programmiert.

Bei TSR-Programmen gibt es allerdings ein sehr grosses Problem: DOS.
Man sollte nämlich in einem TSR keine DOS-Funktionen aufrufen, während
das Programm im Vordergrund welche benutzt, da DOS nicht re-entrant ist.
(wenn man es trotzdem macht, wird die Funktion zwar korrekt ausgeführt,
aber das Vordergrundprogramm wird Probleme bekommen und man darf den
Reset-Knopf drücken...)
Deshalb habe ich in 'timerhandler' nicht die Prozedur 'gettime' von Turbo
Pascal benutzt, weil sie sich eben einer DOS-Funktion bedient, sondern
die aktuelle Uhrzeit direkt von der Echtzeituhr ausgelesen.
Wenn man in einem TSR unbedingt DOS-Funktionen aufrufen muss, um z.b.
Dateien zu bearbeiten, dann sollte man die jeweiligen DOS-Funktionen nur
aufrufen, wenn das Programm im Vordergrund gerade keine benutzt.


____________________________________________________________________
øøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøø

{$M 1024,0,0 }                    { 1024 bytes stack, keinen heap }
USES crt,dos;
VAR oldtimerhandler : procedure;
    count : byte;
    time_h1,time_h2,time_m1,time_m2,time_s1,time_s2 : byte;

{$F+}
PROCEDURE timerhandler; interrupt;
BEGIN
  inc(count);
  ASM                             {  aktuelle uhrzeit aus der rtc holen }
    mov   al,0ah                  {  und in die jeweiligen byte-variablen }
    out   70h,al                  {  schreiben }
    in    al,71h
    test  al,128
    jnz   @updateinprogress

    mov   al,0
    out   70h,al
    in    al,71h
    mov   bl,al
    and   al,15
    shr   bl,4
    add   al,48
    add   bl,48
    mov   time_s2,al              {  sekunden, 2. stelle }
    mov   time_s1,bl              {  sekunden, 1. stelle }

    mov   al,2
    out   70h,al
    in    al,71h
    mov   bl,al
    and   al,15
    shr   bl,4
    add   al,48
    add   bl,48
    mov   time_m2,al              { minuten }
    mov   time_m1,bl

    mov   al,4
    out   70h,al
    in    al,71h
    mov   bl,al
    and   al,15
    shr   bl,4
    add   al,48
    add   bl,48
    mov   time_h2,al              { stunden }
    mov   time_h1,bl
@updateinprogress:
  END;
  memw[$b800:142] := 0;           { uhrzeit auf den bildschirm schreiben }
  mem[$b800:144] := time_h1;
  mem[$b800:145] := 13;
  mem[$b800:146] := time_h2;
  mem[$b800:147] := 13;
  mem[$b800:148] := ord(':');
  mem[$b800:149] := 13;
  mem[$b800:150] := time_m1;
  mem[$b800:151] := 13;
  mem[$b800:152] := time_m2;
  mem[$b800:153] := 13;
  mem[$b800:154] := ord('.');
  mem[$b800:155] := 13;
  mem[$b800:156] := time_s1;
  mem[$b800:157] := 13;
  mem[$b800:158] := time_s2;
  mem[$b800:159] := 13;

  if(count = 91) then              { nur alle 91 mal ausführen: }
  BEGIN                            { = alle 5 sekunden, der handler wird }
    memw[$b800:142] := 2567;       { 18.2 mal in der sekunde aufgerufen }
    sound(1000);
    delay(200);                    { 0x07 himalen und piepsen... }
    nosound;
    memw[$b800:142] := 0;
    count := 0;                    { count wieder auf null stellen! }
  END;

  inline($9c);         { der alte vorherige handler sollte auch noch aufge- }
  oldtimerhandler;     { rufen werden - es gibt auch noch andere tsr's etc }
END;

{$F-}

BEGIN
  count := 0;
  writeln(' TSR - Demonstration ');
  writeln(' copyright (c) Marcus [DO3GM] 25/05/99');

  getintvec($1c,@oldtimerhandler);          { alten handlervector speichern }
  setintvec($1c,@timerhandler);             { meinen handler installieren }
  writeln(' þ> Handler für IRQ0 (Timer) installiert.');

  writeln(' Programm wird beendet, Interrupthandler bleibt im Speicher');
  keep(0);                        { programm beenden und im speicher lassen }
END.


-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-


...hoffe dies hilft dir weiter. Bei weiteren Fragen schau doch einfach
mal in den Convers-Kanal 8086 'Der Kanal für Programmierer'.

              73++ und viel Spass beim Programmieren,  Marcus DO3GM :)
                                                DO3GM@DB0CZ.#BW.DEU.EU

______________________________________________________  __    __
\                                                     \ \\\  _\_\  __ / /__
 \  do3gm -    c h a o s   s o f t w a r e    - do3gm  \ \ \/_\\ \/  /_//_
  \_____________________________________________________\  /   \  \__  __/



Read previous mail | Read next mail


 19.05.2024 00:25:15lGo back Go up