Kontakt - Impressum •  Hilfe - FAQ •  AGB •  9. Februar 2010
Forum •  Live Beratung Offline •  Service & Support •  Einstellungen  • Login
Suche:     
Your browsersignature / IP seems to be a crawler (CCBot/) so we disabled some shop functions to reduce bandwidth and enhance download speed.

Zurück   waldbauer.com > SPI OA4 Open Access IV Anwender Forum

Hinweise

Antwort
 
Themen-Optionen Thema durchsuchen
Alt 26.11.2008, 11:13   #1
leecher
Moderator
 
Registriert seit: Dec 2005
Beiträge: 36
Open Access Pause+Enter Patch (Download siehe Button oben)

Wir OpenAccess-User kennen ja alle das Problem:

Wenn man oavision in der NTVDM unter windows startet, dann geht die CPU-Last auf 100% und oa tut solange nix, bis man PAUSE + ENTER drückt, dann startet es. Ein lästiges Problem, was leider auch im dosemu unter Linux auftritt. Der Workaround mit PAUSE+RETURN geht zwar unter Windows, unter Linux über ein Terminal funktioniert das mit dem Pause aber leider nicht mehr.

Grund genug, das Problem zu analysieren und zu beheben.


Ich habe mich also mit meinem Debugger mal auf die Suche gemacht und bin dabei auf folgende Schleife gestoßen, in die ich eigentlich immer reingekommen bin. Ich habe sie rudimentär kommentiert, damit man hoffentlich auch als Assembler-Unkundiger ungefähr versteht was hier los ist:

asm Code:
  1. cs:1B28 BB0100         mov    bx,0001
  2. cs:1B2B 32E4           xor    ah,ah
  3. cs:1B2D CD1A           int    1A    ; Get System Time
  4. cs:1B2F 52             push   dx
  5. cs:1B30 8BC3           mov    ax,bx
  6. cs:1B32 B9F10A         mov    cx,0AF1
  7. cs:1B35 E2FE           loop   1B35    ; AF1mal einfach hier loopen
  8. cs:1B37 48             dec    ax
  9. cs:1B38 75F8           jne    1B32    ; Schleife je nach Systemtime
  10. cs:1B3A 32E4           xor    ah,ah
  11. cs:1B3C CD1A           int    1A    ; Nochmal systemtime holen
  12. cs:1B3E 59             pop    cx
  13. cs:1B3F 3D0100         cmp    ax,0001    ; Mitternacht vergangen?
  14. cs:1B42 74E4           je     1B28    ; ..dann nochmal
  15. cs:1B44 2BD1           sub    dx,cx    ; Differenz errechnen
  16. cs:1B46 83FA02         cmp    dx,0002
  17. cs:1B49 7307           jnb    1B52    ; >=2, dann ok
  18. cs:1B4B F8             clc
  19. cs:1B4C 43             inc    bx
  20. cs:1B4D 73DC           jnb    1B2B
  21. cs:1B4F BBFFFF         mov    bx,FFFF    ; Return -1, Fehlgeschlagen
  22. cs:1B52 36891E3219     mov    ss:[1932],bx
  23. cs:1B57 CB             retf        ; Und Ende
  24.  

Aufgefallen ist mir, dass, sobald ich in den Debugger reingebreakt bin und dann den Programmfluss fortgesetzt habe, OA relativ schnell da war. Nur wenn mans einfach so aufgerufen hat wieder die hohe CPU-Auslastung. Denkt man dann an den Workaround mit PAUSE+ENTER wird einem schnell klar, was hier abläuft: Drückt man PAUSE, hält man temporär den Programmfluss an, drückt man eine beliebige Taste setzt man ihn wieder fort. Durch das kurzfristige Anhalten bewirkt man, dass zwischen den beiden "Get System Time" - Aufrufen eine Unterbrechung entsteht. Wenn wir dann noch die Geschwindigkeit heutiger Rechner und der Rechner vergleichen, für die OA entwickelt wurde kommt man zu dem Schluss: Die Differenz ist auf modernen Systemen und in der VDM ziemlich lange <2, was bewirkt, dass die Funktion sehr lange loopt.

Das Umgehen des Problems ist dann auch schnell mit einem 1-Byte-Patch getan:

PHP-Code:
1Open Access IV beenden
2
Öffnet die OA4.SPI oder die CMP.SPI je nachdem was ihr patchem wollt 
mit einem Texteditor der auch HEX Suche kann

3Sucht nach3D 01 00 74 E4 2B D1 83 FA 02 und ändert den Wert 
ganz hinten von 02 auf 00 

Update 28.11.2008:
Das Ganze funktioniert übrigens auch für die Runtime CMP.SPI. Der Patcher berücksichtigt nun auch die Runtime. Assembler-Sourcecode vom Patcher gibt's auf Anfrage...

Doch halt! Update 07.12.2008:
Wie Leser Gerd unten richtig bemerkt hat, funktioniert dann das Music-Kommando nicht mehr richtig, da die verbleibende Wartezeit 1 ist!
Für einene saubereren Workaround also bitte unten meinen Artikel lesen.
Ich habe meinen angehängten Patcher in patch.zip entsprechend auf die neue Methode aktualisiert, dieser Patch überspringt nicht nur die lästige Warteroutine am Programmanfang sondern korrigiert auch das Timing-Verhalten.
Bitte vor dem Patchen die OA4.SPI sichern, sicher ist sicher...!

Beim Debuggen ist mir dann auch aufgefallen, warum oa4.exe im Vergleich mit oavision relativ langsam läuft:

OA4 verwendet zur optimierten Bildschirmausgabe Informationen über den Vertical Retrace aus dem VGA I/O Port 3DAh. Dies funktioniert zwar auf einer echten VGA-Karte sehr schnell, wenn man das Ding allerdings in der NTVDM laufen lässt kann man den I/O Port nicht direkt abfragen und die VDM muss das Syncen übernehmen, was sehr langsam ist. Daher die verzögerte Ausgabe. Wen's interessiert kann sich The vertical retrace durchlesen. OAVISION verwendet hingegen einen Videotreiber, welcher die Ansteuerung übernimmt und da fällt das Ganze dann weg.
Der Code ist im Prinzip folgender:
asm Code:
  1. cs:2BEA BADA03         mov    dx,03DA       ; I/O Port 03DA
  2. cs:2BED 2E8B0E202C     mov    cx,cs:&#91;2C20]
  3. cs:2BF2 AD             lodsw
  4. cs:2BF3 8BD8           mov    bx,ax
  5. cs:2BF5 EC             in     al,dx         ; Einlesen
  6. cs:2BF6 D0D8           rcr    al,1          ; Sync?
  7. cs:2BF8 72FB           jb     2BF5          ; Nein, dann nochmal.
  8. cs:2BFA EC             in     al,dx
  9. cs:2BFB D0D8           rcr    al,1
  10. cs:2BFD 73FB           jnb    2BFA
Wer auch dieses "Problemchen" beheben will: Es reicht, den Sprung in der ersten einfach
einfach auszuNOPpen.
Also für die Hexeditor-Benutzer: Suche nach
Code:
AD 8B D8 EC D0 D8
und ersetze die zwei folgenden Bytes
Code:
72 FB
durch
Code:
90 90
.
Bequemer geht's wieder mit angehängtem Patch vdmpatch.zip. Auf einem echten DOS-System bringt dieser Patch aber eher Nachteile, also nur für Benutzer interessant, die OA4 in einer VDM z.B. unter Windows oder Linux betreiben.
Nachdem man das Problem mit oavision ja umschiffen kann ist der Patch wahrscheinlich hauptsächlich für Benutzer der Runtime CMP.SPI interessant.

Update 04.12.2008:
Asche auf mein Haupt! Der alte Patcher hatte einen Fehler und hat die falschen Bytes an die falsche Stelle gepatcht.. Sowas Dummes, ist mir erst jetzt aufgefallen. Ich habe den vdmpatch.zip aktualisiert, jetzt sollte es passen. Als Entschädigung kann er dafür auch OA3 patchen.

Einen weiteren Tip gibt's dann zum Abschluss noch für die Verwendung von OA4 mit Dosemu:

Leider verbraucht das Programm 100% CPU-Leistung in dosemu, weil es ja für dne Realmode ausgelegt ist und daher die CPU normalerweise für sich beanspruchen und schön die Tastatur pollen kann. Nachdem das aber doch einiges an Saft verbraucht und eigentlich nicht nötig ist gibt's auch dafür nen schönen Workaround (ist nicht von mir, aber die Idee ist gut):

auslast.zip

Einfach die auslast.com vor dem Start von OA ausführen. Das Ding hängt sich in den Tastaturinterrupt 0x16 als TSR hinein und setzt ein paar Release Current Virtual Machine Time-Slice Kommandos ab, was die VM zwingt, den Timeslice aufzugeben. Das funzt auch im dosemu, nicht nur unter Windows (dort hat man das Problem ja nicht) und senkt die CPU-Last merklich.

Soda, genug OA-Optimierung für heute

EDIT: Die Patcher findet ihr im Download Bereich !
Angehängte Grafiken
Dateityp: jpg hexadresse.jpg‎ (168.9 KB, 20x aufgerufen)
Dateityp: jpg hexadresse_patch.jpg‎ (146.5 KB, 12x aufgerufen)
leecher ist offline   Mit Zitat antworten
Alt 27.11.2008, 19:47   #2
RKabis
Registrierter Benutzer
 
Registriert seit: Oct 2006
Beiträge: 224
Super, und einen Dank an alle, die sich noch so unermüdlich mit dem Datenbank-Oldie OA auseinandersetzen und immer noch Lösungen anbieten.
RKabis ist offline   Mit Zitat antworten
Alt 01.12.2008, 15:11   #3
Gerd.Schmitz
Registrierter Benutzer
 
Registriert seit: Jul 2006
Beiträge: 2
Funktioniert Super ! Vielen Dank.

Ein kleiner Nachteil hat sich jedoch dadurch eingestellt:
Um einen automatischen Import (Lager Barcode-Buchungen) aus eine Fremdsystem durchzuführen, hatten wir im OA eine Schleifenfunktion programmiert, die nach Ablauf (Alle 5 Minuten) nachsieht ob eine Neue Importdatei vorliegt.

MUSIC (25000,20000) ! (Frequenz,Dauer)

Auch ein hochsetzten der Dauer bringt nichts. Der Import startet sofort wieder ohne die 5 Minuten zu warten.

Jedoch der Vorteil überwiegt ! Super !

Gruß Gerd Schmitz
Gerd.Schmitz ist offline   Mit Zitat antworten
Alt 01.12.2008, 18:41   #4
mhonline
Registrierter Benutzer
 
Registriert seit: Aug 2006
Beiträge: 1
Lob !!

Und die Sache mit AUSLAST.COM ist
für mich - und andere Anwendungen - nochmal so genial

Danke
Martin
mhonline ist offline   Mit Zitat antworten
Alt 02.12.2008, 11:37   #5
leecher
Moderator
 
Registriert seit: Dec 2005
Beiträge: 36
Hallo Gerd,

Zitat:
Zitat von Gerd.Schmitz Beitrag anzeigen
Ein kleiner Nachteil hat sich jedoch dadurch eingestellt:
Um einen automatischen Import (Lager Barcode-Buchungen) aus eine Fremdsystem durchzuführen, hatten wir im OA eine Schleifenfunktion programmiert, die nach Ablauf (Alle 5 Minuten) nachsieht ob eine Neue Importdatei vorliegt.

MUSIC (25000,20000) ! (Frequenz,Dauer)

Auch ein hochsetzten der Dauer bringt nichts. Der Import startet sofort wieder ohne die 5 Minuten zu warten.
Irgendsowas in der Art habe ich befürchtet.

Also ich erklär mal die Problematik, viell. fällt euch was ein: Mit dem jetzigen Patch ist die Delayzeit, die er sich errechnet eigentlich immer 1, dh. solche Verzögerungsschleifen wie bei MUSIC gehen nimmer.

Ich habe auch dieses Problem mal etwas genauer unter die Lupe genommen:

Mit der bisherigen PAUSE+Enter Methode war das Ganze auch schon ein bisserl so wie Russisches Roulette: Wenn mans ganz schnell drückt ist der Wert der Delayschleife relativ klein, MUSIC wartet kürzer. Lässt man sich mit Pause+Enter Zeit rennt die Schleife länger und MUSIC wartet dementsprechend auch länger. Selbst wenn man auf PAUSE+ENTER verzichtet erhält man tw. unterschiedliche Werte je nachdem, wie der Task Scheduler des Multitasking-Betriebssystems arbeitet. Bekommt der Prozess mal nicht die volle Rechenleistung ist eventuell die Abbruchbedingung mit 2 erfüllt und der Wert entspreicht jenem zum Zeitpunkt des Abbruchs.

Ist euch viell. auch schon aufgefallen, ohne PAUSE+Enter wartet OA4 beim Start auch unterschiedlich lang.

Insofern lässt sich für ein Multitasking-System kein wirklich "korrekter", eindeutiger Wert ermitteln.
Ich bin nun also auf Ideensuche, wie man das Problem am Besten umschiffen kann. Eine Idee wäre, dass man von einem alten PC den Wert ermittelt und dann auf die CPU-Geschwindigkeit hochrechnet, bräuchte man aber irgendeine Formel dafür. Man könnte theoretisch auch nen Wert hardcodieren aber das ist dann auch keine saubere Lösung. Hat irgendwer ne Idee wie man das Ganze "sauber" lösen könnte? Bin für Vorschläge offen.

Was Du einstweilen als Workaround machen kannst:
Bei mir lag der Delaywert so grob gepeilt um die 700h. Dh. du kannst den Initialisierungswert des Resultatregisters BX einfach von 1 auf 700 ändern. Dazu musst Du nur folgenden zusätzlichen Patch mit Deinem Hexeditor machen:

Suche nach
Code:
BB 01 00 32 E4 CD 1A 52
Wie man sieht entspricht das dem Anfangscode der Routine. Wie man oben im Disassemblierten Code sehen kann befüllt er am Anfang die Variable mit dem Wert 1. So, und wir ändern das nun auf den Wert der Deinem System entspricht.
Dazu patcht Du die Bytes
Code:
01 00
aus oben genannter Sequenz auf Deinen Initialisierungswert (bei mir also 700h)
Achtung: Wir sind auf einer Intel-CPU, also ist das Little Endian (also quasi "vertauscht")!
Wenn Du auf 701h patchen willst ändere einfach 00 auf 07 und fertig.
Alles unklar?
leecher ist offline   Mit Zitat antworten
Alt 03.12.2008, 12:38   #6
waldbauer.com
Benutzer
 
Registriert seit: Apr 2003
Ort: Wien
Beiträge: 919
EDIT: Auf meinem Notebook mit einem Pentium 4 / 1.4 Ghz habe ich 00 07 eingetragen.
Bei music (20000, 200) habe ich dann die gewünschten ~ 2 sek. Delay.
Angehängte Grafiken
Dateityp: jpg delay_patch.jpg‎ (39.1 KB, 9x aufgerufen)
waldbauer.com ist offline   Mit Zitat antworten
Alt 04.12.2008, 13:56   #7
waldbauer.com
Benutzer
 
Registriert seit: Apr 2003
Ort: Wien
Beiträge: 919
UPDATE: Ludwig hat den VDMPATCH wegen einem Fehler upgedated. Die neue Version ist im alten Thread zu finden. Nachdem wir auch ein Problem mit dem Mailversand hatten schreibe ich hier im Anschluß dazu um zu sehen ob nun auch wieder Nachrichten aus dem Forum versendet werden.
waldbauer.com ist offline   Mit Zitat antworten
Alt 07.12.2008, 14:44   #8
leecher
Moderator
 
Registriert seit: Dec 2005
Beiträge: 36
UPDATE:
Nachdem ich eine saubere Lösung für Gerds Problem mit dem music-Aufruf wollte, habe ich mich das Wochenende mal etwas genauer damit auseinandergesetzt.
Folgende Erkenntnisse hat das Ganze gebracht:
1) Das Ergebnis dieser Schleife am Anfang des Programms scheint wirklich nur für music() verwendet zu werden (wenn wer was anderes entdeckt bitte melden!).
2) Die Erkenntnisse, die bereits in meinem vorhergehenden Post erwähnt wurde:
Die Schleife frisst 100% CPU-Zeit, das lastet den Prozessor unnötig aus und ist unter Multitasking-Systemen inakkurat (v.A. wenn man mit PAUSE+Enter abbricht).

Der hier nun vorgestellte Patch hat folgende Vorteile:
1) Er lastet die CPU nicht zu 100% aus, die VDM wird freigegeben.
2) Das timing ist in Multitasking-Umgebungen um einiges exakter als mit der OA-eigenen Methode
3) Er beseitigt natürlich - was ja die ursprüngliche Intention war - die lästige Warteroutine beim OA4-Start.

Zur Funktionsweise:
Nachdem Gerd das Problem gemeldet hat, habe ich mir einmal den originalen Code der music-Routine angesehen und auch gesehen wo er im Speicher liegt (die relevanten Teile habe ich kommentiert):

asm Code:
  1. cs:1B00 8AC4           mov    al,ah
  2.   cs:1B02 E642           out    42,al        ; Timer 3 für Frequenz Speaker setzen
  3.   cs:1B04 E461           in     al,61
  4.   cs:1B06 8AE0           mov    ah,al        ; Alten Wert sichern
  5.   cs:1B08 0C03           or     al,03
  6.   cs:1B0A E661           out    61,al        ; Speaker ein
  7.   cs:1B0C 368B163219     mov    dx,ss:&#91;1932]    ; Delayzyklen laden
  8.   cs:1B11 B9D80E         mov    cx,0ED8
  9.   cs:1B14 E2FE           loop   1B14
  10.   cs:1B16 4A             dec    dx        ; .. und solange loopen bis
  11.   cs:1B17 75F8           jne    1B11        ; verbraucht
  12.   cs:1B19 4B             dec    bx
  13.   cs:1B1A 75F0           jne    1B0C        ; und das für alle 10ms intervalle
  14.   cs:1B1C 8AC4           mov    al,ah
  15.   cs:1B1E E661           out    61,al        ; Speaker aus
  16.   cs:1B20 CA0400         retf   0004        ; bye
  17.   cs:1B23 0000           add    &#91;bx+si],al    ; Start Müll...
  18.   cs:1B25 00FF           add    bh,bh
  19.   cs:1B27 FF             db     FF        ; ..Ende Müll
  20.   cs:1B28 BB0100         mov    bx,0001        ; Einsprungpunkt Timerloop
  21.   cs:1B2B 32E4           xor    ah,ah        ; Den Rest kennen wir ja schon...
  22.   cs:1B2D CD1A           int    1A
  23.   cs:1B2F 52             push   dx
  24.   cs:1B30 8BC3           mov    ax,bx
  25.   cs:1B32 B9F10A         mov    cx,0AF1
  26.   cs:1B35 E2FE           loop   1B35
  27.   cs:1B37 48             dec    ax
  28.   cs:1B38 75F8           jne    1B32
  29.   cs:1B3A 32E4           xor    ah,ah
  30.   cs:1B3C CD1A           int    1A
  31.   cs:1B3E 59             pop    cx
  32.   cs:1B3F 3D0100         cmp    ax,0001
  33.   cs:1B42 74E4           je     1B28
  34.   cs:1B44 2BD1           sub    dx,cx
  35.   cs:1B46 83FA02         cmp    dx,0002
  36.   cs:1B49 7307           jnb    1B52
  37.   cs:1B4B F8             clc
  38.   cs:1B4C 43             inc    bx
  39.   cs:1B4D 73DC           jnb    1B2B
  40.   cs:1B4F BBFFFF         mov    bx,FFFF
  41.   cs:1B52 36891E3219     mov    ss:&#91;1932],bx
  42.   cs:1B57 CB             retf
Es wird also gewartet, indem die Anzahl der beim Programmstart errechneten Zyklen geloopt, die CPU also solange mit einer Schleife beschäftigt wird, bis die jeweilige zehntelsekunde abgelaufen ist.

Außerdem habe ich entdeckt, dass derselbe Code nicht nur in OA4.SPI sondern auch noch in APP.SPI zu finden ist, wir müssen also beide Dateien patchen.

So, nun stellt sich die Frage nach einer vernünftigen Lösung fürs Warten.
Mal sehen, ob es DOS/BIOS-Funktionen hierfür gibt.
Grundsätzlich gibt es sie:
Einmal die Die BIOS-Wait funktion des INT15h und einmal die MS-DOS 4 SLEEP-Funktion.
Also gleich einmal ausprobieren, ob sie funktionieren. Es stellt sich jedoch bald Ernüchterung ein: Sie funktionieren problemlos in "echtem" DOS, die NTVDM zeigt sich aber ziemlich unbeeindruckt und scheint keine der beiden Funktionen zu unterstützen. Das war's dann also mit der Idee vom relativ einfachen Patch.
Doch es muss ja auch noch andere Möglichkeiten geben. Wenn es nicht so komfortabel geht, muss man sich wohl seine eigene Warteschleife bauen.

Wie stellt man das nun am Besten an?
Hier kommt einem der programmierbare Zeitgeberbaustein 8253 in den Sinn, welcher für die Echtzeituhr zuständig ist.
Dieser erhält die Schwingungen des Oszillators 8284, welcher 1.193.180 Impulse pro Sekunde erzeugt. Dieser Zeitgeber wird übrgens auch zur Tonerzeugung mit dem PC-Speaker verwendet. Der dritte der 3 verfügbaren Timer ist mit dem PC-Speaker verschaltet und gibt dann in entsprechender Frequenz Signale, sodass ein Ton entsteht. Der erste Timer wird für die Systemzeit verwendet und schwingt 18.2mal pro Sekunde. Dem 8253er Baustein kann man nun mittels eines Divisors mitteilen, dass dieser seinen internen Zähler nur dann um 1 erhöhen soll, wenn entsprechend viele Durchläufe vergangen sind. Den Wert des Systemzeitgebers kann man aus dem BIOS-Datenbereich an 46Ch auslesen.
Die Idee ist daher folgende: Man stelle den Sytemzeitgeber so um, dass er mit 10Hz läuft und bei jedem Inkrementieren des Zählers ist eine der Zehntelsekunden, die der User als Dealy-Wert angibt, vergangen. Der Divisor für ein 10Hz-Signal wäre somit 119318. Aber halt! Der Wert ist für ein 16bit-Register zu groß! Bleibt uns also nur der Divisor 11931, welcher dann ein 100Hz-Signal erzeugt.. Reicht ja auch zum Messen, warten wir halt die entsprechende Anzahl an Durchläufen ab.
Während man nun wartet, bis der Timer entsprechend hochgezählt hat, sollte man nun zwecks Vermeidung von hoher CPU-Auslastung den Timeslot der VDM freigeben. Dies geschieht mit bereits oben vorgestellter Funktion Release Current Virtual Machine Time-Slice.
Nach getanener Arbeit muss man natürlich den Timer wieder auf seinen ursprünglichen Wert zurücksetzen.

Soviel zur Theorie. In der Praxis klingt das zwar recht nett, aber eine Routine, die das alles bewerkstelligt braucht natürlich entsprechend viel Platz. Nie und nimmer bekommt man die in dem durch das eliminieren der Schleife freigewordenen Platz unter. Was also tun?

Wer sich das oben angegebene Codestück genauer angesehen hat wird folgendes feststellen: Direkt nach der music()-Routine befindet sich unsere altbekannte Berechnungsroutine vom Programmstart. Nun ja, die brauchen wir ja eignetlich nicht mehr, die nervt uns sowieso nur. Es erscheint also naheliegend, den Code durch unsere neuen Warte-Routine zu ersetzen und mittels CALL anzuspringen. Natürlich dürfen wir nicht den Anfangscode der Routine überschreiben, sonst würde es uns beim Programmstart zerbröseln. Stattdessen lassen wir ihn das Register BX beschreiben, fügen danach einen Sprung ans Ende der originalen Routine ein, wo die Stackvariable entsprechend gesetzt wird und lukrieren den dazwischen freigewordenen Platz für uns.
Aber das Ganze ist immer noch relativ wenig Platz, weshalb man durch trickreiche Programmierung das Ganze irgendwie reinbekommen muss. Wie ich das Ganze dann gelöst habe ist dem unten stehenden Code zu entnehmen, ich werde darauf garnicht weiter eingehen, kann sich jeder selbst ansehen. 1 Byte ist sogar noch frei geblieben und wurde mit einem NOP aufgefüllt

Hier ist der Code, durch den ich den originalen ersetzt habe:
asm Code:
  1. cs:1B06 8AE8           mov    ch, al        ; In ch-Register statt ah, cx bleibt ja unberührt
  2.  cs:1B08 0C03           or     al,03
  3.  cs:1B0A E661           out    61,al        ; PC-Lautsprecher ein   
  4.  cs:1B0C 90             nop            ; 1 Byte blieb übrig ;)
  5.  cs:1B0D 1E             push   ds        ; DS sichern
  6.  cs:1B0E 33D2           xor    dx,dx
  7.  cs:1B10 8EDA           mov    ds,dx        ; DS auf 0 legen fürs Lesen von BIOS-Dataarea
  8.  cs:1B12 BA9B2E         mov    dx,2E9B        ; 100hz Timerauflösung für 8523-5 Baustein
  9.  cs:1B15 E82D00         call   1B45        ; Divisor setzen
  10.  cs:1B18 E81200         call   1B2D        ; Warteroutine aufrufen
  11.  cs:1B1B 1F             pop    ds        ; DS wiederherstellen
  12.  cs:1B1C 8AC5           mov    al,ch        ; Aus ch statt ah-Reg. holen
  13.  cs:1B1E E661           out    61,al
  14.  cs:1B20 CA0400         retf   0004
  15.  cs:1B23 0000           add    &#91;bx+si],al    ; Start Müll
  16.  cs:1B25 00FF           add    bh,bh
  17.  cs:1B27 FF             db     FF        ; Ende Müll
  18.  cs:1B28 BB0100         mov    bx,0001        ; Loopwert mit 1 init (unbrauchbar!)
  19.  cs:1B2B EB25           jmp    1B52        ; Zur Initialisierung d. Speicherstelle und ret
  20.  cs:1B2D BA0800         mov    dx,0008        ; -- Hier beginnt unsere Delayroutine --
  21.  cs:1B30 03166C04       add    dx,&#91;046C]    ; Endzeit in dx
  22.  cs:1B34 B88016         mov    ax,1680        ; Release current VM timeslice
  23.  cs:1B37 CD2F           int    2F        ; CPU in VM entlasten!
  24.  cs:1B39 3B166C04       cmp    dx,&#91;046C]    ; Loop abgelaufen?
  25.  cs:1B3D 79F5           jns    1B34        ; Nein -> Warte weiter
  26.  cs:1B3F 4B             dec    bx        ; Warteschleife bis zum Ablauf der Zeit
  27.  cs:1B40 75EB           jne    1B2D
  28.  cs:1B42 BAFFFF         mov    dx,FFFF        ; Timer 0 des 8523-5 wiederherstellen
  29.  cs:1B45 B036           mov    al,36        ; Setze Timeraufl.
  30.  cs:1B47 E643           out    43,al
  31.  cs:1B49 8BC2           mov    ax,dx
  32.  cs:1B4B E640           out    40,al
  33.  cs:1B4D 8AC4           mov    al,ah
  34.  cs:1B4F E640           out    40,al
  35.  cs:1B51 C3             ret            ; Fertig
  36.  
Für all jene, die die Routine mit dem Hexeditor in ihre OA4.SPI, APP.SPI und CMP.SPI hineinpatchen wollen: In den Zeilen mit Assemblercode steht - wie unschwer zu erkennen ist - links neben den Mnemonics die Bytesequenz.

Zum Download
Nachdems doch ganz schön viel zu patchen ist, empfehle ich, besser die neue Version meines Patchers zu verwenden, welcher wieder am 1. Beitrag oben angehängt ist. Bitte vor dem Patchen die originale OA4.SPI wieder zurückkopieren, um sicherzugehen, dass der Patch sauber funktioniert.

..und dann soll noch einer sagen, wir Assembler-Programmierer würden nicht mehr gebraucht werden
Feedback, ob es bei euch funktioniert ist erwünscht!

Schönes verlängertes Wochenende!
leecher ist offline   Mit Zitat antworten
Alt 11.12.2008, 21:47   #9
Hans Jürgen
Registrierter Benutzer
 
Registriert seit: Feb 2005
Beiträge: 42
Santa

Hallo Leecher,

es funktioniert perfekt - das ist eine Leistung, die den Nobelpreis verdient! Die Geschwindigkeitssteigerung im Fenster ist unglaublich.

Gruß
Hans Jürgen (hjlint#)

P.S.: Kann es sein, dass der Patcher die OA3.SPI vergißt?

P.P.S.: Und wenn gerade mal jemand am Patchen ist: kann man die automatisch eingesetzte 19 bei 2-stelliger Eingabe einer Jahreszahl nicht mal auf 20 umpatchen? Ist eigentlich noch lästiger als Pause-Enter und kommt häufiger vor.
Hans Jürgen ist offline   Mit Zitat antworten
Alt 12.12.2008, 00:18   #10
leecher
Moderator
 
Registriert seit: Dec 2005
Beiträge: 36
Hallo Hans Jürgen!

Zitat:
Zitat von Hans Jürgen Beitrag anzeigen
es funktioniert perfekt - das ist eine Leistung, die den Nobelpreis verdient!
Prima, wann ist die Preisverleihung?
Gut zu wissen, dass es nicht nur bei mir und Günther funktioniert.

Zitat:
Zitat von Hans Jürgen Beitrag anzeigen
P.S.: Kann es sein, dass der Patcher die OA3.SPI vergißt?
Du meinst beim normalen timing-Patch? Ich hab ein OA3 hier, das hat diese Schleife am Anfang nicht, die gibt's meines Wissens nach ja nur bei OA4. Oder hat OA3 auch so ein Problem?
leecher ist offline   Mit Zitat antworten
Alt 12.12.2008, 07:13   #11
waldbauer.com
Benutzer
 
Registriert seit: Apr 2003
Ort: Wien
Beiträge: 919
Zitat:
Zitat von Hans Jürgen Beitrag anzeigen
P.P.S.: Und wenn gerade mal jemand am Patchen ist: kann man die automatisch eingesetzte 19 bei 2-stelliger Eingabe einer Jahreszahl nicht mal auf 20 umpatchen? Ist eigentlich noch lästiger als Pause-Enter und kommt häufiger vor.
Der 2000er Patch ist bei DISPI direkt zu bekommen :-)
http://www.do-it-so.com/index.php?ds=&page=DOWNLOAD
waldbauer.com ist offline   Mit Zitat antworten
Alt 12.12.2008, 15:32   #12
Hans Jürgen
Registrierter Benutzer
 
Registriert seit: Feb 2005
Beiträge: 42
Zitat:
Zitat von leecher Beitrag anzeigen
Hallo Hans Jürgen!

Du meinst beim normalen timing-Patch? Ich hab ein OA3 hier, das hat diese Schleife am Anfang nicht, die gibt's meines Wissens nach ja nur bei OA4. Oder hat OA3 auch so ein Problem?
Hallo Leecher,

habe die OA3.SPI von Hand genau nach Deiner Anleitung gepatched und danach war das Timing-Problem weg. Die Hex-Suche hat zumindest genau Deinen String gefunden, ich habe die 02 durch 00 ersetzt und wir sparen uns jetzt mit 6 Mann täglich mindestens 2 Tastendrücke. Du kannst den Patcher somit auf die OA3.SPI erweitern, wenn Du willst, dann ist er universell.

Noch besser kommt allerdings der VDM-Patch. Wir konnten bisher im Fenster nicht arbeiten, da schnelle Tastatureingaben hoffnungslos verschluckt wurden. Also immer Umschalten in den DOS-Vollbildmodus und zurück. Jetzt ist es im Fenster augenscheinlich schneller als im Vollbild.

Gruß und nochmals vielen Dank,
Hans Jürgen
Hans Jürgen ist offline   Mit Zitat antworten
Alt 12.12.2008, 15:36   #13
Hans Jürgen
Registrierter Benutzer
 
Registriert seit: Feb 2005
Beiträge: 42
Zitat:
Zitat von waldbauer.com Beitrag anzeigen
Der 2000er Patch ist bei DISPI direkt zu bekommen :-)
http://www.do-it-so.com/index.php?ds=&page=DOWNLOAD
Hallo Waldbauer (=Günther?),

irgendwo im Forum habe ich gelesen (kann auch irgendwo bei Google gewesen sein in den unendlichen Weiten des Internet), dass der 2000-Patch Probleme macht.

Wie sind Deine Erfahrungen?

Die Links dort sind kaputt, zumindest jetzt im Moment. Und es gibt 2 Versionen, eine kleine "2000 patch for Open Access (Authentical)" mit 9KB und eine große mit 300KB ohne Authentical.

Hast Du noch einen anderen Link oder kannst Du mir die Dateien mailen?

Gruß
Hans Jürgen
Hans Jürgen ist offline   Mit Zitat antworten
Alt 12.12.2008, 15:43   #14
waldbauer.com
Benutzer
 
Registriert seit: Apr 2003
Ort: Wien
Beiträge: 919
Hallo hier Günther :-)

Ich habe den 2000er Patch seit Anfang an und überhaupt keine Probleme damit (zumindest sind mir nie welche aufgefallen)...*grml* und ich habe damals sogar die ~ 5 USD an DISPI überwiesen :-)
waldbauer.com ist offline   Mit Zitat antworten
Alt 12.12.2008, 16:50   #15
Hans Jürgen
Registrierter Benutzer
 
Registriert seit: Feb 2005
Beiträge: 42
Hallo Günther,

habe gefunden, dass die Dateien oaup_001.exe und oapatch.exe heißen, finde aber nirgendwo eine Downloadmöglichkeit und die Links bei do-it-so.com funktionieren nicht mehr.

Was war/ist der Unterschied zwischen den beiden außer dass die eine 9KB und die andere 300KB hat?

Kannst Du mir die Dateien vielleicht mailen?

Gruß
Hans Jürgen
Hans Jürgen ist offline   Mit Zitat antworten
Alt 12.12.2008, 17:05   #16
waldbauer.com
Benutzer
 
Registriert seit: Apr 2003
Ort: Wien
Beiträge: 919
Die OAUP hab ich noch, die oapatch aber nicht mehr. Ludwig sieht sich das Jahr 2000 Problem an dann haben wir vielleicht eine Lösung für das Jahr 2100 auch :-)
waldbauer.com ist offline   Mit Zitat antworten
Alt 12.12.2008, 17:14   #17
Hans Jürgen
Registrierter Benutzer
 
Registriert seit: Feb 2005
Beiträge: 42
Was war denn nun der Unterschied zwischen den beiden Dateien?

Als Problem sehe ich derzeit eigentlich nur, dass das Datum immer mit 1900 anstatt mit 2000 ergänzt wird, was zu vielen überflüssigen Tastendrücken führt.

Ansonsten wüsste ich nichts, was gepatched werden müsste.

Gruß
Hans Jürgen
Hans Jürgen ist offline   Mit Zitat antworten
Alt 12.12.2008, 17:28   #18
waldbauer.com
Benutzer
 
Registriert seit: Apr 2003
Ort: Wien
Beiträge: 919
Ich habe - ehrlichgesagt - keine Ahnung was damals Dispi alles patchen musste. Das Jahr 2000 Problem habe ich seit 2000 nicht mehr aber ich habe Ludwig gebeten nachzusehen was an welcher Stelle gepatcht wird damit die Eingabe von 99 zu 2099 statt zu 1999 wird.

Ich nehme an es wird nicht allzulange dauern dann wissen wir es :-)
waldbauer.com ist offline   Mit Zitat antworten
Alt 12.12.2008, 17:50   #19
Hans Jürgen
Registrierter Benutzer
 
Registriert seit: Feb 2005
Beiträge: 42
Super, das ist eigentlich auch alles, was mich stört. Wenn mir nicht noch etwas anderes einfällt.
Hans Jürgen ist offline   Mit Zitat antworten
Alt 12.12.2008, 20:12   #20
RKabis
Registrierter Benutzer
 
Registriert seit: Oct 2006
Beiträge: 224
Hallo Zusammen,

habe gerade die Disk's (2000 Patch) gefunden.

Zum einen gab's eine getrennte Disk, eine für Einzelplatz und eine fürs Netzwerk.

Die Dateien sind in Unterverzeichnisse gepackt gewesen.

Das eine Verzeichnis mit der OAUP_001.exe (10 KB) ist im Verzeichnis NORMAL.
Die OAPATCH.EXE ist in einem Verzeichnis PENTIUM2.

Gruß Rainer
RKabis ist offline   Mit Zitat antworten
Alt 12.12.2008, 20:20   #21
Hans Jürgen
Registrierter Benutzer
 
Registriert seit: Feb 2005
Beiträge: 42
Hallo Rainer,

wo befinden sich denn die Verzeichnisse PENTIUM2 und NORMAL?

Hoppla, schon gemerkt, vermutlich auf der gefundenen Disk, nicht hier irgendwo im Forum.

Gruß
Hans Jürgen
Hans Jürgen ist offline   Mit Zitat antworten
Alt 12.12.2008, 21:02   #22
RKabis
Registrierter Benutzer
 
Registriert seit: Oct 2006
Beiträge: 224
Hallo Jürgen,

genau, hab gerade gemerkt, dass ich etwas verdreht geschrieben habe.

Gruß Rainer
RKabis ist offline   Mit Zitat antworten
Alt 12.12.2008, 21:03   #23
waldbauer.com
Benutzer
 
Registriert seit: Apr 2003
Ort: Wien
Beiträge: 919
Der Patch ist schon fertig und im Unterschied zum Dispi Patch super klein und rasend schnell. Ludwig wird ihn vermutlich hier im Anhang gleich hochladen. Ab morgen wird er dann auch auf unserer Downloadseite zu finden sein.
waldbauer.com ist offline   Mit Zitat antworten
Alt 12.12.2008, 21:56   #24
leecher
Moderator
 
Registriert seit: Dec 2005
Beiträge: 36
Soda, ich hab mir mal den DISPI-Patch angesehen.
Was lustig war, der war in Borland Pascal geschrieben und dort hat die CRT einen Bug auf zu schnellen CPUs (Runtime Error 200 ...). Also zuerst mal den Patcher patchen, dass er geht
Damit auch unsere Hexeditor-Hexer wissen, was sie zu tun haben, hier mal was der Patcher prinzipiell tut:

Er sucht nach folgender Hex-Sequenz:
Zitat:
81 6C 07 A2 6B
Und ersetzt
Zitat:
6C
durch
Zitat:
D0
.

Alle Credits für den Patch gehen an DISPI. Nachdem ich nicht weiß, ob ich eine "gepatchte" Version (damits auf modernen CPUs funktioniert) ihres Patchers hier posten darf, habe ich schnell einen eigenen geschrieben.
Befindet sich im Anhang. Ich hoffe er funktioniert und ich habe nicht irgendwelche Spezialitäten übersehen.
leecher ist offline   Mit Zitat antworten
Alt 12.12.2008, 22:12   #25
leecher
Moderator
 
Registriert seit: Dec 2005
Beiträge: 36
Zitat:
Zitat von Hans Jürgen Beitrag anzeigen
habe die OA3.SPI von Hand genau nach Deiner Anleitung gepatched und danach war das Timing-Problem weg. Die Hex-Suche hat zumindest genau Deinen String gefunden, ich habe die 02 durch 00 ersetzt und wir sparen uns jetzt mit 6 Mann täglich mindestens 2 Tastendrücke. Du kannst den Patcher somit auf die OA3.SPI
Hmn, das ist interessant, meine OA3.SPI hat weder die Bytesequenz drinnen, noch hat sie die OA4-Startprobleme. Keine Ahnung was für eine Version ich hier habe, aber kannst Du mir viell. mal Deine OA3.SPI schicken?
Der Grund ist der, dass ich analysieren möchte, wo bei Dir die Sequenz liegt.
Denn wie du eventuell weiter oben gelesen hast, ersetzt ja der neue Patcher wegen dem Problem mit MUSIC nicht bloß 02 durch 00 sondern patcht meine eigene Timer-Routine hinein. Da ich wie oben beschrieben dadurch eine andre Routine eliminiere, die ganz in der Nähe der MUSIC-routine liegt, muss ich wissen, ob ich das bei OA3 auch so machen kann und dafür bräucht ich wie gesagt Deine OA3.SPI zur Analyse. Danke schonmal!
leecher ist offline   Mit Zitat antworten
Alt 14.12.2008, 15:46   #26
Hans Jürgen
Registrierter Benutzer
 
Registriert seit: Feb 2005
Beiträge: 42
Hallo Ludwig,

kann die OA3.SPI hier wegen der Beschränkung auf 100KB nicht hochladen, ist gezippt 750KB groß. Habe Sie per Mail an edv@w... geschickt. Ansonsten, schick mir bitte eine Mail, wie ich Dir die Datei zusenden kann.

Der Y2K-Patch funktioniert übrigens auch einwandfrei, danke!

Gruß
Hans Jürgen

P.S.: Habe schon versucht, die Datei per PM zu schicken, ging nicht.
Hans Jürgen ist offline   Mit Zitat antworten
Alt 14.12.2008, 16:47   #27
leecher
Moderator
 
Registriert seit: Dec 2005
Beiträge: 36
Hallo Hans Jürgen,

Habe festgestellt, dass hier scheinbar ein Unterschied zwischen Netzwerk- und Einzelplatzverseion von OA3 besteht. Bei OA3 Einzelplatz gibt's weder das Problem, noch die Bytefolge, bei der Netzwerkversion die Du benutzt gibt's das Ganze aber.
Dh. Du hattest recht, es lässt sich genau so wie OA4 patchen.
Ich habe den Patcher entsprechend erweitert, jetzt geht er auch mit der OA3.SPI
Danke für Deine Mithilfe.
leecher ist offline   Mit Zitat antworten
Alt 14.12.2008, 17:22   #28
Hans Jürgen
Registrierter Benutzer
 
Registriert seit: Feb 2005
Beiträge: 42
Nichts zu danken, die Hauptarbeit machst doch Du!

Aber jetzt noch für mich: wie kann man in diesem Forum jemandem eine Datei schicken?

Gruß
Hans Jürgen
Hans Jürgen ist offline   Mit Zitat antworten
Alt 15.12.2008, 14:12   #29
waldbauer.com
Benutzer
 
Registriert seit: Apr 2003
Ort: Wien
Beiträge: 919
...kann man leider nicht zumindest noch nicht.
waldbauer.com ist offline   Mit Zitat antworten
Alt 16.02.2009, 16:21   #30
Yvar
Registrierter Benutzer
 
Registriert seit: Sep 2008
Beiträge: 9
OA4 Pause-Enter korrigieren

Hallo

Ich benütze das OpenAccess Netzwerk und wollte das Y2K-Patch installieren. Leider geht es bei mir nicht - Ich denke das ich etwas falsch mache.

Ich habe das Y2KPatch.com auf dem Server wo das OA4.SPI ist installiert und gestartet. Jedoch hat sich beim Starten nichts geändert.

Ich danke für die Infos

Yvar Vonlanthen
Yvar ist offline   Mit Zitat antworten
Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
OA II/III/IV PHP Extension für Open Access - Bugfix Thread waldbauer.com SPI OA4 Open Access IV Anwender Forum 62 17.11.2009 18:01
OA II/III/IV DBF/DBT/CSV+MEMO Konverter v1.08 für OA (siehe Download) PierreX SPI OA4 Open Access IV Anwender Forum 31 03.10.2009 13:36
OA II/III/IV Open Access mit MySQL Plugin und ODBC waldbauer.com SPI OA4 Open Access IV Anwender Forum 4 28.11.2008 14:33
Woher Open Access IV beziehen? eldegede SPI OA4 Open Access IV Anwender Forum 3 05.09.2006 10:47
Open Access Forum Willkommen Shop SPI OA4 Open Access IV Anwender Forum 2 19.02.2006 12:35

Powered by vBulletin® Version 3.8.4 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
FEHLER MELDEN • WIR üBER UNS • KONTAKT - IMPRESSUM • HILFE - FAQ • MUSEUM
JOBS • PRESSE • SPONSORING • DATENSCHUTZ • NUTZUNGSBEDINGUNGEN • AGB • GESAMTKATALOG

Laxenburger Strasse 37 | 1100 Wien | Tel.: +43 (1) 603 13 62 | Fax.: +43 (1) 603 13 62 DW 22
© 2000-2010 WALDBAUER BÜROTECHNIK e.U.


Lesen Sie sich bitte - bevor Sie diese Website benutzen - unsere allgemeinen Geschäfts- und Nutzungsbedingungen sorgfältig durch.
Durch die Benutzung dieser Website erklären Sie Ihr Einverständnis mit den allgemeinen Geschäfts- und Nutzungsbedingungen,
ebenso wie mit anderweitig anfallenden Gesetzen und Regulierungen dieser Website, des Internets und/oder des World Wide Webs.

Der Google Analytics© Code wurde für dieses Session Cookie dauerhaft entfernt.
Sie können dies auch anhand des Quelltextes dieser Seite kontrollieren.