Hardware > Hardware (Classic 16-/32-Bit)

Unterschiede zw. TOS 2.06 und TOS 1.62 auf einem 1040STE

<< < (7/8) > >>

Thorsten Otto:
@dbsys : versuch doch bitte mal angehängte gepatchte Version (insbesondere mit EmuTOS, aber ruhig auch mit anderen TOS).

Zur Info: die problematische Stelle wurde so gepatcht, daß sie auch mit EmuTOS gefunden werden sollte. Intern wird dort der komplette ACIA handler ersetzt. Hintergrund ist wohl der, daß MROS Midi-Daten selber auswerten will (hätte man wohl auch über midisys machen können), bei Tastatur-Daten wird dann zur ursprünglichen Stelle im TOS gesprungen. Die gefundene Addresse wird dort mit der Addresse des Tastatur-IOREC Pointers in a0 aufgerufen, das sollte eigentlich auch unter EmuTOS funktionieren.

Es gibt noch drei weitere Stellen, in denen ähnliches gemacht wird. Eine Stelle, die den etv_timer Code ersetzt. Diese ist hier ebenfalls gepatcht, und zwar so daß der interrupt nicht modifiziert wird. Hoffe das funktioniert, wird aber in einer für CT60 gepatchten Version ebenfalls so gemacht.

Dann gibt es noch zwei Stellen, die den USER_BUT und USER_MOT handler vom VDI ersetzen. Diese sollten (da sie ebenfalls in Assembler programmiert sind) auch in EmuTOS gefunden werden, und wurden deshalb so gelassen wie sie sind.

Ansonsten wäre es gut, wenn du mal alles was du an Entwickler-Dokumentation hast, rauskramen könntest. Insbesondere wäre es interessant zu wissen, welche Funktionen über Trap #8 und Trap #10 zur Verfügung gestellt werden.

dbsys:
@Thorsten Otto vielen Dank für das gepatchte MROS. Ich finde es klasse, daß Du mal in den Code geschaut hast!

Wir sollten @cyberish informieren, damit er das gepatchte MROS auf seiner EmuTOS Installation ausprobieren kann, denn ich selbst betreibe (noch) keinen EmuTOS Rechner.

Ich teste aber gerne mal auf einem 1040ST mit TOS 1.04 und einem 1040STE mit TOS 2.06. Am kommenden Wochenende komme ich eventuell schon dazu und berichte dann.

Leider besitze ich keine Entwickler-Dokumentation von Steinberg.

cyberish:
@Thorsten Otto
Klasse, vielen Dank für den Patch. - I.d.F. hat Tango MROS 345 unter EmuTOS 1.3 geladen, MIDI Daten kommen an und gehen weg! Jedoch stürzt das Programm ab, sobald die Maus bewegt wird. - s.h. Bildschirmfotos: Jeweils nach dem Absturz durch das Bewegen der Maus.

dbsys:

--- Zitat von: cyberish am Do 06.02.2025, 11:16:36 ---@Thorsten Otto
Klasse, vielen Dank für den Patch. - I.d.F. hat Tango MROS 345 unter EmuTOS 1.3 geladen, MIDI Daten kommen an und gehen weg! Jedoch stürzt das Programm ab, sobald die Maus bewegt wird. - s.h. Bildschirmfotos: Jeweils nach dem Absturz durch das Bewegen der Maus.

--- Ende Zitat ---

Immerhin startet Tango schon mal....

Thorsten Otto:
Der Absturz dürfte dann wohl in den Routinen liegen die MROS noch patcht. Hab mal die entsprechenden Stellen extrahiert (vlt. hat @czietz eine Idee was da schief geht?)


--- Code: ---install_cur_motv:
[00011aa2] 247a 08bc                 movea.l    linevars(pc),a2
[00011aa6] 45ea ffce                 lea.l      -50(a2),a2      /* lea user_mot(a2),a2 */
[00011aaa] 2052                      movea.l    (a2),a0         /* get original user_motv */
[00011aac] 23c8 0001 1b02            move.l     a0,new_user_mot-4    /* save it */
install_cur_motv_2:
[00011ab2] 0ca8 5842 5241 fff4       cmpi.l     #$58425241,-12(a0) /* XBRA chain? */
[00011aba] 6606                      bne.s      install_cur_motv_1 /* no */
[00011abc] 2068 fffc                 movea.l    -4(a0),a0          /* continue searching */
[00011ac0] 60f0                      bra.s      install_cur_motv_2
install_cur_motv_1:
[00011ac2] 43fa 006a                 lea.l      old_motv_code(pc),a1
[00011ac6] 47fa 003e                 lea.l      new_user_mot(pc),a3
[00011aca] 41e8 000c                 lea.l      12(a0),a0        /* skip the lea gstack,a7 in original code */
[00011ace] 323c 007a                 move.w     #123-1,d1
install_any_motv_2:
[00011ad2] 3018                      move.w     (a0)+,d0         /* get opcode */
[00011ad4] b07c 2e79                 cmp.w      #$2E79,d0        /* movea.l abs.l opcode at end of routine? */
[00011ad8] 6708                      beq.s      install_any_motv_1
[00011ada] 32c0                      move.w     d0,(a1)+         /* copy old code */
[00011adc] 51c9 fff4                 dbf        d1,install_any_motv_2
[00011ae0] 4e75                      rts
install_any_motv_1:
[00011ae2] 22fc 4e71 4e71            move.l     #$4E714E71,(a1)+ /* write 3 nops */
[00011ae8] 32fc 4e71                 move.w     #$4E71,(a1)+
[00011aec] 41e8 0004                 lea.l      4(a0),a0         /* skip remaining opcode of orginal routine */
install_any_motv_3:
[00011af0] 32d8                      move.w     (a0)+,(a1)+      /* copy rest of old code if any */
[00011af2] 51c9 fffc                 dbf        d1,install_any_motv_3
[00011af6] 248b                      move.l     a3,(a2)          /* set new vector */
[00011af8] 4e75                      rts

dc.l 'XBRA'
dc.l 'MROS'
dc.l 0
new_user_mot:
[00011b06] 4af9 0001 1c2e            tas.b      $00011C2E
[00011b0c] 661e                      bne.s      new_user_mot_1
[00011b0e] 23df 0001 1c30            move.l     (a7)+,$00011C30
[00011b14] 027c f4ff                 andi.w     #$F4FF,sr
[00011b18] 6100 0014                 bsr.w      old_motv_code
[00011b1c] 007c 0700                 ori.w      #$0700,sr
[00011b20] 4279 0001 1c2e            clr.w      $00011C2E
[00011b26] 2f39 0001 1c30            move.l     $00011C30,-(a7)
new_user_mot_1:
[00011b2c] 4e75                      rts

old_motv_code:  ds.w 123

--- Ende Code ---

Der user_mot vector in den linea-variable zeigt ursprünglich auf die far_mchange routine: https://github.com/emutos/emutos/blob/69d289251f119e19031265ea6f9ea41ac394c303/aes/gemdosif.S#L327-L349 (siegt in TOS 2.x praktisch genauso aus). Was der patch macht hat zur Folge daß
- die routine nicht mehr auf einem eigenen Stack ausgeführt wird (der ist aber eh sehr klein, und wenn das in TOS funktioniert, sollte es auch in EmuTOS kein Problem sein)
- Interrupts werden während dieser Zeit zugelassen, und erst hinterher wieder gesperrt. Ich vermute mal daß hier irgendwas schief geht.

Warum das überhaupt gemacht wird, kann ich nur vermuten. Möglicherweise gehen sonst MIDI Daten verloren. Allerdings halt ich das zulassen von Interrupts an dieser Stelle auch für gefährlich (siehe auch https://github.com/emutos/emutos/blob/69d289251f119e19031265ea6f9ea41ac394c303/aes/gemdisp.c#L48, das ist die C-Routine die vom ursprünglichen Code aufgerufen wird). Man könnte aber mal ausprobieren was passiert wenn man diese Routinen auspatcht. Ist in der angehängten Version der Fall.



Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln