Beiträge von Dosenware

    Hmm, Im moment bewirkt das deinstallieren des Interrupthandlers einen Fehler, Ich bin mir aber nicht sicher warum.

    (die alte Pasca/assembler Mischung funktioniert aber problemlos) - und ja, hier ist es noch 1C, ich will erstmal dieses Problem lösen bevor ich mich auf 08 stürze (und das nächste Problem habe)

    Also ein Interrupt "zerstört" Register nicht, er kommt nur von einer unvorhersehbaren Stelle

    Doch und nicht wirklich:
    das Nutzen des Interrupt 8 - den direkten Hardwareinterrupt - hat geholfen, der Interrupthandler an IRQ 8, der auch IRQ 1C generiert, hatte mir nur die Register zerwürfelt.

    Die Messroutine selbst ist sehr übersichtlich, CX und DX werden dort nur zur Messzwecken verwendet und kein externes Programm aufgerufen. Hardwareinterrupts sperren einander, sind also auch kein Problem - damit is das ganze deterministisch.


    CX/DX enthalten den Messwert, statt CX/DX zu nutzen könnte ich auch direkt in den Speicher schreiben, dann würde aber die Messroutine die Messung beeinflussen. (ist nur eine Messung für die Speichertransferrate)


    der Originale Interrupthandler auf 08H hat wohl nur etwas in der art gemacht:


    push register -> "Zeug" -> auslösen von 1C -> Pop Register


    und "Zeug" hat mir halt die Register zerwürfelt

    Wenn du den Original-Handler 65536 mal seltener aufrufen willst als deinen eigenen Handler

    Häh? Was? Huh? Nein.


    65536 ist nur der standardwert für den Timer, verbunden mit der Taktrate des Timers ergibt das ~18,2 Interrupts pro sekunde.


    d.h. wenn man den Timer umprogrammiert um z.b. 300 Interrupts zu haben (=wert für den Timer=3977) reicht es eine 16Bit Variable bei jedem Interrupt um 3977 zu erhöhen und bei Überlauf den alten Interrupthandler aufzurufen um einigermaßen genau zu sein.


    add oldinttimer, 3977

    {für 300 IRQs/s muss der Timer mit 3977 initialisiert werden -> 1.193MHz/3977~300HZz}

    jno @endInt

    {bei überlauf von oldinttimer ist der ursprungswert des Timers erreicht/Überschritten -> Aufrufen des alten Interrupts}

    call oldint

    [das Ergebnis ist dass der alte Interrupthandler mit der ursprünglichen Häufigkeit von ca. 18,2Hz aufgerufen wird - das Timing wackelt nur ein bisschen um 1/300s}

    @EndInt

    keine Sorge, eine funktionierende schnellere routine habe ich bereits an anderer stelle:

    dort Zähle ich einfach bei jedem Interupt eine Variable um einen bestimmten wert hoch und löse bei jedem Überlauf (= 65535 wird überschritten) den alten IRQ aus, das ist aber hier nicht nötig, die Interruptroutine soll nur die Geschwindigkeit messen.


    Ich habe jetzt den Interrupt komplett in der zu messenden routine verewigt und... ja... der IRQ zerstört die Register, werde jetzt nochmal direkt IRQ 8 versuchen.

    aber ram ist langsam


    "Also macht er meistens ein Backup, erledigt seine Arbeit, und holt das Backup zurück"
    genau dass funktioniert nicht, der kommt nicheinmal an die registerinhalte heran um diese dann in den ram zu schieben


    es handelt sich um eine kleine Messroutine

    Danke für die Antwort.

    Also, volatile gibt es nicht in Borland Pascal.


    Der Interrupt wird innerhalb einer Assemblerroutine verwendet und scheinbar ist es nicht möglich Daten über Register auszutauschen.

    In einer Richtung (Interrupt -> Messroutine) würde das durchaus Sinn machen z.b. wenn Pascal dort noch automatisch push/pop zur Interruptroutine hinzufügt, das erklärt aber nicht warum der Weg Routine -> Interrupt nicht funktioniert :-/


    werde mal schauen ob ich die interruptroutine mit in die Assemblerroutine hineinpacken kann

    Anderes Problem:


    Code
    procedure TimingINT_Mem; interrupt;assembler;  {Rechnen mit 1193/65536~18.2 int's/s}
      asm
      cmp Global_IntStopFlag,$FFFF
      je @AlreadyStopped
      mov Global_StopTotalRuns_RegLo, CX
      mov Global_StopTotalRuns_RegHi, DX
     @AlreadyStopped:
      mov  Global_IntStopFlag, $FFFF
      end;

    mov Global_StopTotalRuns_RegLo, CX

    mov Global_StopTotalRuns_RegHi, DX

    funktionieren nicht, ich komme nicht an die werte von cx und dx, stattdessen erhalte ich konstante Werte (auch wenn ich cmp+je auskommentiere)

    ideen?

    Grüße,

    folgendes Konstrukt:

    Code
    procedure inttest; interrupt; assembler;
        ...
    end;
    ..
    ..
     lds dx, inttest {@ tut's auch nicht}
     mov ax, $251C
     int $21

    Problem: "Ungültige Kombination aus Opcodes und Operanden"
    ich komme einfach nicht an die Adresse, lustig ist: den alten interruptvector (hole ich mir über die in pascal intigrierte function} kann ich in "var oldint:procedure;" speichern, jedoch gestattet mir pascal nicht dasselbe mit inttest zu machen :-/

    Ideen?

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.


    Achtung enthält Schlager Musik, anhören auf eigene Gefahr



    EDIT: LOL

    Zitat

    i really like how the english speaking community actually seems to like the first part of the video and all germans agree that the true horror is the schlager part.

    ich hatte schoneinmal spannung drauf gegeben, ohne erfolg. Daher bin ich davon ausgegangen dass noch externe Signale/bzw die Terminierung fehlen.

    oh, right, SysAdmin day:

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    die Soundblaster hat Adlib nicht wirklich verdrängt, die Soundblaster ist Adlib + ein bisschen extra. - sie hat Adlib quasi assimiliert.


    Creative hat die Firma Adlib später... mit kreativen Geschäftspraktiken... aus dem Markt gedrängt.