ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > Registerzugriff in C | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
1 2 3 -4- | [ - Beitrag schreiben - ] |
25.11.2007, 22:36 Uhr MaikG Posts: 5172 Nutzer |
>Das Timing wurde komplett geändert. Habe ich jetzt beim Infrarot-Senden eine Abweichung dadurch? >Es wäre nett, wenn Du mir sagen könntest, ob mittels Digi >digitalisierte Dateien und mittels SampleEngine wiedergegebene >Dateien korrekt sind - d.h. ob keine Fehler (Blips) darin enthalten >sind. Also bei Basic keine änderung. Ja, Fehler sind relativ. Kleine störungen sind noch drin, also nicht so gut wie mit dem ASM-Beispiel. Samplemanager sagt was von über 14000 "crackles" wobei das sehr relativ zu sehen ist. [ - Antworten - Zitieren - Direktlink - ] |
28.11.2007, 00:15 Uhr jolo Posts: 110 Nutzer |
@MaikG: Hi. Zitat: Das wird nicht funktionieren, da beide, die Audio-Hardware und die CIA-Chips unterschiedliche Taktfrequenzen haben. Zitat: Ja, Klangeinbußen gibt es - aber das Timing (CIA zu Audio) war nicht akkurat (50 Hz vs. 60 Hz...). Zudem hat die DMA-freie Audioausgabe keinerlei Probleme mit Abschnitten die doppelt wiederholt werden. Es wird analog das ausgegeben, was rein kommt. Zitat: Nur wenn Deine Routine innerhalb des Interrupt aufgerufen wird (usersCode, usersData). Ansonsten, wenn's auf Prozess-Ebene läuft, nicht. Zitat: Nein, für normale Interrupt-Aufgaben, also alles ohne Digitalisierung, bleibt alles beim Alten. Nur für die Audio-Ausgabe wird eine Neuberechnung durchgeführt. Mir ist allerdings ein Malheur passiert und ich habe eine Version mit halber Ablaufverfolgung hochgeladen, die eigentlich nur für mich bestimmt war. Dementsprechend müsste es bei Deiner Version zu Störungen bei der Wiedergabe kommen (Abschnitte werden des Öfteren wiederholt). Zitat: Zu 1) Du digitalisierst auf Prozess-Ebene? Dementsprechend benutzt Du von Basic aus einen Interrupt, um 22000-mal in der Sekunde ein Signal zu empfangen - und wenn es eintrifft liest Du den Wert der am parallelen Port anliegt? Wenn dem so ist kann ich Dir jetzt schon sagen, dass Du das niemals auf Prozess-Ebene schaffen wirst - okay, vielleicht mit einem neuen OS und einer CPU die um ein vielfaches schneller ist als Deine 68060 - aber nicht mit der jetzigen Software und Hardware. Extra für diesen Zweck habe ich einen Digitizer auf Interrupt-Ebene entworfen. Er sollte Dir die Arbeit abnehmen. Zu 2) Wie schon im letzten Beitrag von mir geschildert, soll die Audio-Ausgabe nur grob einen Überblick über die tatsächliche Digitalisierung geben. Leider, wie oben geschildert, habe ich eine Version hochgeladen, die mit dem falschen Compiler-Aufruf erstellt worden ist - hier ist die Wiedergabe nicht ganz so genau wie bei der Version die Du eigentlich verwenden müsstest. Um eine Ablaufverfolgung zu starten, löscht die Version die Du jetzt besitzt, alle Audio-Interrupt-Quellen und wartet solange, bis diese durch die Hardware neu gesetzt wurden. Dementsprechend kann ich exakt bestimmen, wie viele Bytes pro Sekunde von der Audio-Hardware ausgegeben werden, bzw. wie viele Bytes pro Sekunde der Interrupt zu langsam oder zu schnell läuft. Der Nachteil der damit erkauft wird, ist, dass die Audio-Hardware kurzzeitig aus dem Tritt gebracht wird, da sie selber auf diese Audio-Interrupt-Quellen angewiesen ist, bzw. für einen Störungsfreien Ablauf diese Quellen nicht zurückgesetzt werden dürfen. SampleManager (hallo Thilo - nettes Programm!) habe ich mal runtergeladen und über die Dateien gejagt, die ich hier digitalisiere. Es sagt mir kein Crackle (Knistern?). Dementsprechend gehe ich davon aus, dass der Interrupt-Code in Ordnung ist. Bleibt nur noch die Frage was mit den Daten vom parallelen Port geschieht. Ich kann mir nicht vorstellen, dass der CIA-A Interrupt irgendwelchen Einfluss auf die Daten vom parallelen Port hat, da ansonsten das von Commodore vorgesehen Handshake zwischen CIA-A und CIA-B beim Senden oder Empfangen von Daten am parallelen Port gestört sein würde - und ich das als Hardwarebug bezeichnen würde, der mindestens mit dem Erscheinen des ECS-Chipsatz hätte verschwunden sein müssen. Zudem bist Du Dir auch nicht sicher, ob es an Deinem Programm liegt oder an der Bibliothek. Daher würde ich Dich bitten, mir Klarheit zu verschaffen. Tauchen Probleme beim Digitalisieren mittels Digi auf oder nicht? Zum CIA-B Interrupt: Meiner Meinung nach sollte dieser gar nicht verwendet werden, jedenfalls nicht bei gleichzeitiger Benutzung der Audio-Hardware - da die Audio-Hardware Interrupts der Ebene 4 generiert und bei der Benutzung eines Level-6 Interrupts diese nicht zum korrekten Zeitpunkt erstellt werden können - womit die Audio-Hardware dann aus dem Tritt kommt und es zu Störungen bei der Wiedergabe kommen muss (jedenfalls geschieht dies hier unter WinUAE). Somit ist das ASM-Beispiel eigentlich ein gutes Beispiel wie man es nicht machen sollte... Anbei, SetIRQAttrI( ihandle, 512) schaltet vom 8-Bit Modus in den 16-bittigen und umgekehrt. Dementsprechend kannst Du die Audio-Ausgabe über AHI bewerkstelligen, falls Du möchtest. Um die aktuelle Position in Deinem FAST-RAM Puffer zu erfahren, kannst Du: GetIRQAttrI( ihandle, 1024) benutzen - es retourniert die Position des aktuellen Samples im Puffer (FAST-RAM) - bei 16-Bit Samples musst Du den Wert mit 2 multiplizieren - dann hast Du die Byte-Position. Dementsprechend kannst Du z.B. auf Position 32 warten und dann mittels AHI die Audio-Daten ausgeben - falls Du dies möchtest. Neue Version ohne Ablaufverfolgung wurde hochgeladen. Gruß [ - Antworten - Zitieren - Direktlink - ] |
28.11.2007, 11:15 Uhr MaikG Posts: 5172 Nutzer |
>Zudem hat die DMA-freie Audioausgabe keinerlei Probleme mit >Abschnitten die doppelt wiederholt werden. Hat das ASM Beispiel und das C-Beispiel doch auch nicht, solange man den Puffer so lässt wie er ist. >Nur wenn Deine Routine innerhalb des Interrupt aufgerufen wird >(usersCode, usersData). Ansonsten, wenn's auf Prozess-Ebene läuft, >nicht. Ja, dachte ich mir auch so, geht aber nicht. >Zu 1) >Du digitalisierst auf Prozess-Ebene? Dementsprechend benutzt Du von Basic aus einen Interrupt, um 22000-mal in der Sekunde ein Signal zu empfangen - und wenn es eintrifft liest Du den Wert der am parallelen Port anliegt? >Wenn dem so ist kann ich Dir jetzt schon sagen, dass Du das niemals auf Prozess-Ebene schaffen wirst - okay, vielleicht mit einem neuen OS und einer CPU die um ein vielfaches schneller ist als Deine 68060 - aber nicht mit der jetzigen Software und Hardware. Nein, das macht die Library. Ich setzte nur noch beim Start den Parallel-port auf Eingang >Zudem bist Du Dir auch nicht sicher, ob es an Deinem Programm liegt >oder an der Bibliothek. Daher würde ich Dich bitten, mir Klarheit >zu verschaffen. Tauchen Probleme beim Digitalisieren mittels Digi >auf oder nicht? Ja, wie ich sagte es gibt diese (Intensiv) Knackser mit aktiver und deaktiver Audio-Ausgabe. >Somit ist das ASM-Beispiel eigentlich ein gutes Beispiel wie man es >nicht machen sollte... Hört sich aber so gut an wie Multimon bis auf die (kleinen) Knackser. >Neue Version ohne Ablaufverfolgung wurde hochgeladen. Jetzt geht die Monitorausgabe nicht mehr... Hier das Programm: code:' $INCLUDE Exec.bh ' $INCLUDE dos.bh ' $INCLUDE Timer.bh LIBRARY "ire.library" LIBRARY OPEN "exec.library" LIBRARY OPEN "dos.library" DECLARE FUNCTION InitIRQ& LIBRARY DECLARE FUNCTION StartIRQ& LIBRARY DECLARE FUNCTION DeleteIRQ& LIBRARY DECLARE FUNCTION GetIRQAttrI& LIBRARY DECLARE FUNCTION SetIRQAttrI& LIBRARY REM $NOEVENT REM $NOOVERFLOW REM $NOLINES POKEB &hBFE301,0 REM Parallelport auf Eingang MySample&=AllocVec(200004, MEMF_PUBLIC& OR MEMF_CLEAR&) test&=&h45454545 REM String für InitIRQ& "AAAA" t!=TIMER rem Zeit des Starts festhalten DIM pufferliste&(12) pufferliste&(0)=MySample& pufferliste&(1)=NULL& ihandle&=InitIRQ&(20000, VARPTR(test&),NULL&,0,VARPTR(pufferliste&(0)),200000) REM 16000 sigmask&=(1<<GetIRQAttrI&(ihandle&,1)) junk&=SetIRQAttrI&(ihandle&,4) REM junk&=SetIRQAttrI&(ihandle&,128) REM AudioAusgabe ON/OFF junk&=StartIRQ&(ihandle&) junk& = xWait&(sigmask&) Rem warten bis 200kb voll sind. PRINT TIMER-t! rem verbrauchte Zeit wiedergeben (Knapp über 10s) junk&=DeleteIRQ&(ihandle&) Rem Daten aus den vollen Puffer als Datei schreiben. fh& = xOpen&(SADD("ram:sample"+CHR$(0)), MODE_NEWFILE&) IF fh& THEN junk& = xWrite&(fh&,MySample&,200000) junk& = xClose&(fh&) END IF FreeVec MySample& rem Speicher Freigeben [ - Antworten - Zitieren - Direktlink - ] |
28.11.2007, 22:35 Uhr jolo Posts: 110 Nutzer |
@MaikG: Hi. Zitat: Leider wurden hier auf meiner Maschine Abschnitte doppelt wiedergegeben - das habe ich auf ein Minimum in der letzten Version reduzieren können (60 Hz / 50 Hz Timing). Zitat: Hier geht's. Hast Du das normale Signal-Handling abgeschaltet? - Dann kann es nicht funktionieren. Zitat: Wie oft pro Sekunde kommen diese vor (schätzungsweise)? Zitat: Hier funktioniert das nicht so gut. Zitat: Was heißt Monitorausgabe? code:REM Zwei Macken sind mir in MBasic aufgefallen: REM Umlaute mag es gar nicht und CALL funktioniert nicht so wie in AmigaBasic REM ON BREAK GOTO FastOut REM BREAK ON LIBRARY "exec.library" DECLARE FUNCTION AllocVec&() LIBRARY DECLARE FUNCTION FreeVec&() LIBRARY DECLARE FUNCTION xWait&() LIBRARY LIBRARY "dos.library" DECLARE FUNCTION xOpen&() LIBRARY DECLARE FUNCTION xWrite&() LIBRARY DECLARE FUNCTION xClose&() LIBRARY DECLARE FUNCTION Delay&() LIBRARY LIBRARY "ire.library" DECLARE FUNCTION InitIRQ&() LIBRARY DECLARE FUNCTION StartIRQ&() LIBRARY DECLARE FUNCTION DeleteIRQ&() LIBRARY DECLARE FUNCTION GetIRQAttrI&() LIBRARY DECLARE FUNCTION SetIRQAttrI&() LIBRARY LIBRARY OPEN "exec.library" LIBRARY OPEN "dos.library" LIBRARY OPEN "ire.library" CONST PGROESSE& = 40000 REM --- Puffergroesse CONST Hz& = 14880 REM --- Frequenz CONST MEMF_CLEAR& = 65536 CONST MODE_NEWFILE& = 1006 CONST SIGBREAKF_CTRL_C& = 4096 CONST THIS_SIGBIT_DBUF_FULL& = 1 CONST THIS_DBUF_FULL& = 16 CONST THIS_IRQ_SIGBIT& = 2 CONST DISABLE_SIGNALLING& = 4 CONST ENABLE_SIGNALLING& = 8 CONST THIS_FREQUENCY& = 32 CONST THIS_PERIOD& = 256 CONST THIS_SAMPLE_POS& = 1024 CONST TOGGLE_DMA_ACCESS& = 64 CONST TOGGLE_MAKE_AUDIBLE& = 128 CONST TOGGLE_16BIT& = 512 REM $NOEVENT REM $NOOVERFLOW REM $NOLINES REM --- Los geht's REM POKEB &hBFD000,2 --- Paper Out signalisieren POKEB &hBFE301,0 REM --- Parallel-Port auf Eingang Index& = 0 REM --- Dateinamenerweiterung MySample1& = AllocVec&( PGROESSE&, MEMF_CLEAR&) MySample2& = AllocVec&( PGROESSE&, MEMF_CLEAR&) IF MySample1& <> 0 AND MySample2& <> 0 THEN DIM pufferliste&(12) pufferliste&(0) = MySample1& pufferliste&(1) = MySample2& pufferliste&(2) = 0 REM --- Interrupt und benötigte Strukturen initialisieren ihandle& = InitIRQ&( Hz&, SADD("MBasic Digitizer"+CHR$(0)), 0, 0, VARPTR( pufferliste&(0) ), PGROESSE&) IF ihandle& <> 0 THEN REM --- Signal-Bit für "Puffer-Ist-Voll" holen und in Maske wandeln sigmask& = ( 1 << GetIRQAttrI&( ihandle&, THIS_SIGBIT_DBUF_FULL&) ) REM --- Normales Interrupt-Signal-Handling ausschalten junk& = SetIRQAttrI&( ihandle&, DISABLE_SIGNALLING&) REM --- Audio-Ausgabe aus/anschalten REM junk& = SetIRQAttrI&( ihandle&, TOGGLE_MAKE_AUDIBLE&) REM --- DMA Audio-Ausgabe einschalten junk& = SetIRQAttrI&( ihandle&, TOGGLE_DMA_ACCESS&) junk& = Delay&( 50) REM --- 1 Sekunde warten REM --- Interrupt starten junk& = StartIRQ&( ihandle&) DO PRINT "Starte Timer..." t! = TIMER REM --- Zeit des Starts festhalten REM --- Warten bis irgendetwas passiert... received& = xWait&( sigmask& OR SIGBREAKF_CTRL_C&) IF received& AND SIGBREAKF_CTRL_C& THEN EXIT LOOP ELSE t! = TIMER-t! REM --- Und Ende festhalten (TIMER ist seeeehr ungenau: REM --- bei 200004 Bytes 13,76 Sek. mit Stoppuhr aber 16,18 Sek. laut TIMER)! CALL WriteBuffer( GetIRQAttrI&( ihandle&, THIS_DBUF_FULL&), PGROESSE&) REM --- Benötigte Zeit wiedergeben PRINT PGROESSE& "Bytes wurden innerhalb von" t! "Sekunden mit"; PRINT GetIRQAttrI&( ihandle&, THIS_FREQUENCY&) "Hz digitalisiert." PRINT "Diese Angabe ist mit Vorsicht zu genießen!" END IF LOOP REM --- Interrupt beenden und Ressourcen freigeben FastOut: junk& = DeleteIRQ&( ihandle&) END IF END IF IF MySample2& <> 0 THEN REM --- Puffer freigeben junk& = FreeVec&( MySample2&) END IF IF MySample1& <> 0 THEN REM --- Puffer freigeben junk& = FreeVec&( MySample1&) END IF REM --- Alle geoeffneten Bibliotheken schliessen LIBRARY CLOSE END REM ---- PROGRAMMENDE ---- REM --- Pufferinhalt als Datei schreiben. SUB WriteBuffer( adr&, xlen&) fh& = xOpen&( SADD("RAM:sample_raw"+STR$(Index&)+CHR$(0)), MODE_NEWFILE&) IF fh& <> 0 THEN junk& = xWrite&( fh&, adr&, xlen&) junk& = xClose&( fh&) END IF Index& = Index& + 1 END SUB Habe die Demo-Version von MBasic runtergeladen und Dein Programm abgewandelt. Hier funktioniert es. Gruß [ - Antworten - Zitieren - Direktlink - ] |
29.11.2007, 11:24 Uhr MaikG Posts: 5172 Nutzer |
>Leider wurden hier auf meiner Maschine Abschnitte doppelt >wiedergegeben - das habe ich auf ein Minimum in der letzten >Version reduzieren können (60 Hz / 50 Hz Timing). Du hast doch nur UAE oder? >Hast Du das normale Signal-Handling abgeschaltet? - Dann kann es >nicht funktionieren. Ich glaub schon. >Wie oft pro Sekunde kommen diese vor (schätzungsweise)? 5 mal vielleicht. Das variiert. Ich kann dir eine Datei auch Mailen. >Was heißt Monitorausgabe? Die Wiedergabe während des Samplens, wenn man diese aktiviert hat. >t! = TIMER-t! REM --- Und Ende festhalten (TIMER ist seeeehr >ungenau: >REM --- bei 200004 Bytes 13,76 Sek. mit Stoppuhr aber 16,18 Sek. >laut TIMER)! Bei mir sinds 10.1x Sek. >Habe die Demo-Version von MBasic runtergeladen und Dein Programm >abgewandelt. Hier funktioniert es. Ja, funktioniert, leider nur so wie meins. Also mit Knackser. [ - Antworten - Zitieren - Direktlink - ] |
30.11.2007, 19:47 Uhr jolo Posts: 110 Nutzer |
@MaikG: Hi. Zitat: Ja, schon. Trotzdem kann ich es testen. Habe drei Möglichkeiten: 1) Die Bibliothek besteht zusätzlich aus einer Audio-Datei (2,2 Mbytes). Im Interrupt wird nicht das Datenbyte vom parallelen Port gelesen sondern das entsprechende Byte in der Audio-Datei. 2) Am Ende des Interrupt-Codes wird ein Byte der Audio-Datei auf den parallelen Port geschrieben. 3) AudioGrabber.asm wurde abgewandelt um aus einer Audio-Datei das entsprechende Byte auf den parallelen Port zu schreiben - hat allerdings den Nachteil, dass damit nur Frequenzen bis zu 7 kHz verwendet werden können (wie gesagt, WinUAE ist bei der Emulation des Chip-Satzes nicht so schnell wie die echte Hardware). Zitat: Was glaubst Du?!?!? Ich bin kein Hellseher. Zitat: Ja, mach das. Dann habe ich zumindest einen Anhaltspunkt. Zitat: Ich kann nicht mit 22 kHz digitalisieren - sondern bis maximal 14. Dementsprechend sind 200004 Bytes durch 14840 Bytes/Sekunde 13,4 Sekunden und nicht 16,1. Die Funktion TIMER ist mehr als ungenau. Zitat: Komisch. Hier funktioniert es ohne Knackser - dementsprechend muss ich etwas übersehen haben, was WinUAE ignoriert die originale Hardware aber nicht. Gruß [ - Antworten - Zitieren - Direktlink - ] |
01.12.2007, 00:13 Uhr MaikG Posts: 5172 Nutzer |
>Was glaubst Du?!?!? Ich bin kein Hellseher. der code steht doch oben: >junk&=SetIRQAttrI&(ihandle&,4) das war doch was du meinst? >Ja, mach das. Dann habe ich zumindest einen Anhaltspunkt. Hab deine Email Adresse aber nicht... >Die Funktion TIMER ist mehr als ungenau. Das muss an WinUAE liegen. >Hier funktioniert es ohne Knackser - dementsprechend muss ich etwas >übersehen haben, was WinUAE ignoriert die originale Hardware aber >nicht. Ja, ist halt so eine sache mit UAE<->Amiga was auf dem einen läuft tuts manchal nicht auf dem anderen. [ - Antworten - Zitieren - Direktlink - ] |
01.12.2007, 10:14 Uhr jolo Posts: 110 Nutzer |
@MaikG: Hi. Zitat: Für mich sind das Senden von Infrarotsignalen und das Digitalisieren zwei Paar Schuhe - dementsprechend zwei Programme. Beim Senden von Infrarotsignalen bist Du auf Signale vom Interrupt angewiesen um das Timing hinzubekommen; beim Digitalisieren aber nicht. Das Beispiel, dass Du aufzeigst, dient dem Digitalisieren - nicht dem Senden von Infrarotsignalen. Zitat: Habe übers Forumsformular Dir meine Email-Adresse zukommen lassen. Zitat: Nee, daran dass man oft bei der Amiga-Programmierung auf Programmierer stößt, die ein bestimmtes Verhalten voraussetzen - was aber nie von Commodore als solches dokumentiert wurde. Mache solche Fehler selber… Zitat: Eigentlich schon. Da aber Deine Timing-Intervalle an die Grenzen des Machbaren stoßen, wird's ein wenig kritisch. Gruß [ - Antworten - Zitieren - Direktlink - ] |
01.12.2007, 10:22 Uhr MaikG Posts: 5172 Nutzer |
>Für mich sind das Senden von Infrarotsignalen und das Digitalisieren zwei Paar Schuhe - dementsprechend zwei Programme. Ja, das Beispiel da oben ist zum Digitalisieren. Das Senden von Infrarotsignalen Funktioniert doch seit der 1.Version schon. >Habe übers Forumsformular Dir meine Email-Adresse zukommen lassen. Hab dir einen Sample gemailt. [ - Antworten - Zitieren - Direktlink - ] |
05.12.2007, 12:05 Uhr Holger Posts: 8116 Nutzer |
Zitat:Ich kann Dir auf Anhieb etwas nennen, in dem sich WinUAE und ein echter Amiga unterscheiden: Zitat:Auch, wenn Du das bereits korrigiert hast, bleibt ja immer noch der Fakt, dass Deine Daten von Dir mit demselben Timing generiert werden, mit dem Du hinterher liest, während der echte Parallelport vom Timing des Lesens unabhängig funktioniert und natürlich, um nur ein Beispiel zu nennen, wesentlich empfindlicher auf Störungen von anderer Software reagiert, wenn man z.B. die Ressource nicht korrekt gelockt hat. Es gibt viele mögliche Fehlerquellen. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
05.12.2007, 19:01 Uhr jolo Posts: 110 Nutzer |
@Holger: Hi. Zitat: Das ist ein wunder Punkt - Maik und ich probieren derzeit ein wenig herum, da anscheinend Störungen von außen die Daten am parallelen Port beeinträchtigen. Auch habe ich zwei Fehler in der Ire-Bibliothek ausgemacht: 1. Der CIA-A Interrupt wurde mit einer falschen Maske gestartet. 2. INTENA und INTREQ wurden vertauscht - was unter einem echten Chip-Satz fatale Folgen haben kann. Dementsprechend habe ich das schon korrigiert - INTENA und INTREQ werden jetzt auch nicht mehr benutzt. Wenn's denn irgendwann so läuft wie es laufen soll, wird der Quell-Code beigefügt - im Moment sind zu viele #ifdefs drin und ein Mix aus Deutsch und Englisch... Zitat: Das ist richtig - allerdings fällt mir keine bessere Lösung ein um das hier unter WinUAE auszuprobieren. Ich könnte natürlich von Windows aus Daten auf den Port zaubern - aber um ehrlich zu sein, ich hatte schon mal gravierende Probleme bezüglich des Timings unter XP dass ich da lieber die Hände von lasse... Zitat: In neueren Versionen wird der parallele Port gelockt - allerdings hat das meines Wissens nach keinen Einfluss auf irgendwelche Werte, da hier nur sichergestellt wird, dass ausschließlich ein Nutzer einen Baustein (Centronics) verwenden kann. Was ich derzeit mache, ist das DDRA und das DDRB Register zu initialisieren, abgesehen vom Generieren des Interrupts. Maik hat mittels eines anderen Digitizer herausgefunden, dass die Störgeräusche auch unter diesem aufgezeichnet werden. Verantwortlich dafür scheint ein kommerzielles Programm zu sein, welches einen CIA-B Timer-B Interrupt generiert um eine Hardware-Erweiterung nutzbar zu machen. Verantwortlich ist allerdings das falsche Wort: Ich gehe davon aus, dass dieses kommerzielle Programm alles richtig macht, jedoch es dadurch zu Störungen des Sound-Samplers (sprich Digitizer) kommt. Und hier muss ich jetzt irgendwie eine Lösung finden, die beiden, also diesem kommerziellen Programm als auch dem Digitizer der Ire-Bibliothek gerecht wird. Mal schauen ob ich's hinbekomme. Gruß [ - Antworten - Zitieren - Direktlink - ] |
19.12.2007, 21:25 Uhr jolo Posts: 110 Nutzer |
Hallo. Ich habe mit Hilfe von Maik die Bibliothek dahingehend zum Laufen gebracht, dass nun diese Knackser während der Aufnahme und dem gleichzeitigen Betrieb eines kommerziellen Programms nicht mehr aufgezeichnet werden. Ein kleiner Trick hilft hier - meines Wissens nach von Bert Jahn (WHDLoad) - und als Interrupt Acknowledge Fix bekannt: Unter schnellen Prozessoren (68040 und höher) kann es passieren, dass ein Interrupt-Acknowledge unter geht, falls kurzeitig danach der Supervisor-Modus (Interrupts werden im Supervisor-Modus abgearbeitet) verlassen wird (rte). Was hier hilft, ist vor dem eigentlichen Bestätigen (Acknowledge) eines Interrupts und verlassen des Supervisor-Modus eins der CIA-Register oder eins der Custom-Register auszulesen. Dann klappt es wieder mit der Bestätigung (im ROM). Maik hat mich mit der Nase darauf gestoßen... Ich ziehe meinen Hut vor Bert Jahn - ich selber wäre nie auf die Idee gekommen... Neue Version inklusive Quellcode kann unter http://www.amimedic.de heruntergeladen werden. Gruß [ - Antworten - Zitieren - Direktlink - ] |
1 2 3 -4- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > Registerzugriff in C | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |