home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / program / tempcall / tempcall.lst < prev    next >
File List  |  1990-03-07  |  10KB  |  246 lines

  1. ; **************************************************************************
  2. ; ***                                                                    ***
  3. ; ***                      TEMPCALL V1.1 vom 27.6.89                     ***
  4. ; ***                                                                    ***
  5. ; ***                                                                    ***
  6. ; ***    Programm zum Aufruf von TEMPUS vom Manager des ST-Pascals aus   ***
  7. ; ***    -------------------------------------------------------------   ***
  8. ; ***                                                                    ***
  9. ; ***                   (c) 1989 by Stefan Focke, Bonn                   ***
  10. ; ***                   ==============================                   ***
  11. ; ***                                                                    ***
  12. ; ***                                                                    ***
  13. ; ***                                                                    ***
  14. ; ***          ( GFA_Assembler V1.3, PC relative Adressierung )          ***
  15. ; ***                                                                    ***
  16. ; ***                                                                    ***
  17. ; **************************************************************************
  18.  
  19.  
  20.  
  21. ; Beim direkten Aufruf von TEMPUS bekommt man Probleme, wenn .ERR Dateien
  22. ; geladen werden sollen. Der Manager ruft den Editor auf zwei verschiedene
  23. ; Arten auf:
  24. ;
  25. ; - Aufruf über den Menüpunkt 'Editor':
  26. ;   An Tempus wird dabei einen Kommandozeile, bestehend aus dem Namen der
  27. ;   zu editierenden Datei, übergeben. TEMPCALL formt diese Kommandozeile
  28. ;   um. Es wird getestet, ob außer der in der Kommandozeile übergebenen
  29. ;   Datei noch eine .ERR Datei gleichen Namens existiert. Falls dem so
  30. ;   ist, so wird die Kommandozeile um die Angabe der .ERR-Datei erweitert
  31. ;   und diese dadurch auch geladen.
  32. ;
  33. ; - Aufruf beim Compilieren
  34. ;   Das Problem dabei ist, daß zum einen die .ERR-Datei nicht geladen wird
  35. ;   und zum anderen, daß immer noch gefragt wird, ob eine Datei mit dem
  36. ;   Namen der Fehlermeldung angelegt werden soll. TEMPCALL läd daher
  37. ;   die .ERR-Datei und schneidet die Fehlermeldung ab.
  38.  
  39.  
  40.  
  41. ; Einbinden von TEMPCALL in den Manager:
  42. ; --------------------------------------
  43. ;
  44. ; Wenn statt TEMPUS als Editor (Programme suchen) TEMPCALL eingetragen
  45. ; wird, so wird aus dem Manager TEMPCALL aufgerufen. TEMPCALL wiederum
  46. ; ruft TEMPUS auf. TEMPCALL muß sich dazu im gleichen Ordner wie Tempus
  47. ; befinden.
  48.  
  49. ; Nach dem Verlassen von Tempus kann der Compiler und/oder der Linker
  50. ; aufgerufen werden. Dazu muß ein Returncode an den Manager zurück-
  51. ; gegeben werden:
  52. ; Returncode = 1 : Compiler aufrufen
  53. ; ReturnCode = 2 : Compiler und Linker aufrufen
  54. ; Von Tempus aus kann man den zurückgegebenen Returncode beeinflussen,
  55. ; indem man Tempus mit <Shift> <Alternate> <0..2> verläßt. Die gewählte
  56. ; Nummer (vom Ziffernblock) entspricht dem Returncode.
  57.  
  58.  
  59. ; Arbeitsweise von TEMPCALL:
  60. ; --------------------------
  61. ;
  62. ; Der Manager übergibt, wenn beim Compilieren ein Fehler auftritt und
  63. ; der Editors aufgerufen werden soll, folgende Kommandozeile:
  64. ;   drv:\pfad\dateiname zeile spalte fehler
  65. ;
  66. ; Um Tempus richtig aufzurufen muß folgendes Kommando erzeugt werden:
  67. ;   drv:\pfad\fehlerdatei drv:\pfad\dateiname zeile spalte
  68. ;
  69. ;
  70. ; Wenn der Editor direkt aufgerufen wird, steht in der übergebenen
  71. ; Kommandozeile nur der Namen der zu editierenden Datei:
  72. ;   drv:\pfad\dateiname
  73. ;
  74. ; TEMPCALL formt diese Kommandozeile in Abhängigkeit davon, ob es eine
  75. ; .ERR-Datei gibt, wie folgt um:
  76. ;   drv:\pfad\dateiname
  77. ; oder
  78. ;   drv:\pfad\fehlerdatei drv:\pfad\dateiname
  79.  
  80.  
  81.  
  82. ; Hinweis zum Assemblieren:
  83. ; --------------------------
  84. ;
  85. ; Das Programm sollte aus Gründen der Ausführungsgeschwindigkeit und
  86. ; der Programmlänge PC-relativ assembliert werden. Das Programm muß
  87. ; die Endung .PRG bekommen.
  88.  
  89.  
  90.  
  91. ; Hinweise zur Version 1.1
  92. ; ------------------------
  93. ; Ein übergebener Dateiname ohne Extension erzeugt keine Bombem mehr.
  94. ; Bei solchen Dateien, wird keine .ERR-Datei gesucht
  95.  
  96.  
  97.  
  98.                .PRINTER 27,15
  99.                .LIST 
  100.  
  101. gemdos         equ 1
  102.  
  103. ; Benötigte Gemdos - Funktionen
  104. Pterm0         equ 0
  105. Mshrink        equ $4a
  106. Pexec          equ $4b
  107. Fopen          equ $3d
  108. Pterm          equ $4c
  109.  
  110.  
  111.  
  112. begin:         lea.l      begin,a6      ; Retten des Basisregisters für PC-relative Adressierung
  113.  
  114.                movea.l    4(sp),a0
  115.                move.l     a0,basepage(a6) ; Rette Basepage-Zeiger vom Stack
  116.                move.l     $18(a0),d0
  117.                addi.l     #$100,d0
  118.                movea.l    d0,sp
  119.                sub.l      a0,d0
  120.  
  121. ;              ; Freigeben des nicht gebrauchten Speichers
  122.                move.l     d0,-(sp)
  123.                move.l     a0,-(sp)
  124.                move.w     #0,-(sp)
  125.                move.w     #Mshrink,-(sp)
  126.                trap       #gemdos
  127.                adda.l     #12,sp
  128.  
  129.                lea.l      Cmd_Str,a2    ; Zeiger auf neue Kommandozeile nach A2
  130.                movea.l    basepage,a1
  131.                adda.l     #$81,a1       ; Zeiger auf übergebene Kommand-Line
  132. cop1:          move.b     (a1)+,(a2)+   ; Kopieren DateiNamen aus alter in neue
  133.                cmpi.b     #' ',(a1)     ; Kommandozeile
  134.                beq        cop2
  135.                cmpi.b     #0,(a1)
  136.                bne        cop1
  137.  
  138. cop2:          subq.l     #1,a2         ; Bewege A2 soweit zurück, das es auf den
  139.                cmpa.l     #Cmd_Str,a2   ; Test, ob Punkt überhaupt vorhanden
  140.                beq        NoErrFile
  141.                cmpi.b     #'.',(a2)     ; Punkt im Dateinamen zeigt
  142.                bne        cop2
  143.                addq.l     #1,a2         ; A2 zeigt auf Zeichen hinter dem Punkt
  144.                move.b     #'E',(a2)
  145.                move.b     #'R',1(a2)
  146.                move.b     #'R',2(a2)
  147.                move.b     #$00,3(a2)    ; alte Extension durch 'ERR' ersetzen
  148.  
  149. ;              ; Test, ob zu dem übergebenen Dateinamen eine .ERR-Datei existiert
  150.                lea.l      Cmd_Str,a0    ; Dateiname mit .ERR - Endung
  151.                bsr        OpenFile
  152.                cmpi.w     #0,d0
  153.                bmi        NoErrFile     ; Keine Datei mit der Endung '.ERR' vorhanden
  154.  
  155. ;              ; Es ist also eine Datei mit der Endung '.ERR' vorhanden.
  156. ;              ; A2 zeigt im Moment auf das 'E' von 'ERR'
  157.                addq.l     #3,a2
  158.                move.b     #' ',(a2)+    ; A2 zeigt hinter den Dateinamen mit
  159.                bra        CopyOld       ; der ERR-Endung
  160.  
  161. ;              ; Falls das .ERR-File nicht existiert, wird der Zeiger A2 wieder
  162. ;              ; auf den Anfang der Kommandozeile gesetzt.
  163. NoErrFile:     lea.l      Cmd_Str,a2
  164.  
  165.  
  166. ;              ; A2 zeigt auf die Stelle an die die alte Kommandozeile in die neue
  167. ;              ; Kommandozeile hineinkopiert werden soll. Also, wenn keine .ERR
  168. ;              ; Datei existiert auf den Anfang der neunen Zeile oder, wenn diese
  169. ;              ; Datei existiert, hinter den mit .ERR endenden Dateinamen.
  170. CopyOld:       movea.l    basepage,a1
  171.                adda.l     #$81,a1       ; Zeiger auf alte Kommand-Line
  172. cop3:          move.b     (a1)+,(a2)+   ; Kopieren komplette alte Kommand-Line
  173.                cmpi.b     #0,(a1)
  174.                bne        cop3
  175.  
  176. ;              ; Nun muß noch getestet werden, ob hinter dem letzten Dateinamen
  177. ;              ; noch Zahlen angegeben sind. Falls dem so ist, muß die letze
  178. ;              ; Zahl, die Nummer des Fehlers,  gelöscht werden.
  179. ;              ; A2 zeigt hinter das letze Zeichen, das aus der alten Kommando-
  180. ;              ; zeile heraus kopiert wurde.
  181.  
  182. ;              ; Suche von hinten das erste nichtnummerische Zeichen. A2 wird dabei
  183. ;              ; immer wieder erniedrigt, sodaß es am Ende auf das erste nicht-
  184. ;              ; numerische Zeichen zeigt.
  185. del1:          move.b     -(a2),d0
  186.                cmpi.b     #'0',d0
  187.                bmi        NoNum
  188.                cmpi.b     #'9'+1,d0
  189.                bmi        del1          ; Ziffer gefunden, A0 weiter erniedrigen
  190.  
  191. ;              ; Es wurde ein Zeichen gefunden, das keine Ziffer ist.
  192. ;              ; A2 zeigt auf dieses Zeichen.
  193. NoNum:         addq.l     #1,a2
  194.                move.b     #0,(a2)       ; Schreibe Null hinter die neue KommandoZeile
  195.  
  196.                move.l     a2,d0         ; A2 zeigt hinter Kommandozeile
  197.                lea.l      Cmd_Len+1,a1  ; Ermittle Länge der Kommandozeile
  198.                sub.l      a1,d0
  199.                move.b     d0,Cmd_Len(a6) ; Speichern der Länge der Kommandozeile
  200.  
  201.                pea        zero          ; Zeiger auf Environment (leer)
  202.                pea        Cmd_Len       ; Zeiger auf Start der Kommandozeile
  203.                pea        Prg_Name      ; Zeiger auf den Programmnamen 'TEMPUS'
  204.                clr.w      -(sp)
  205.                move.w     #$4b,-(sp)    ; Pexec
  206.                trap       #1
  207.  
  208. ;              ; Hierher kehrt TEMPUS zurück. Auch TEMPCALL kann dann verlassen
  209. ;              ; werden. Es wird dann der Manager wieder gestartet.
  210.                andi.w     #$ff,d0
  211.                move.w     d0,-(sp)      ; Weitergeben des Return-Codes
  212.                move.w     #Pterm,-(sp)
  213.                trap       #1
  214.  
  215.  
  216.  
  217.  
  218. ; Gemdos-Funktion zum öffnen einer Datei
  219. ;  in: A0.l = Zeiger auf den Namen der Datei
  220. ; out: D0.w = Fehler beim Öffnen, wenn <> 0;
  221. OpenFile:      movem.l    d1/d2/a0-a2,-(sp)
  222.                move.w     #0,-(sp)
  223.                move.l     a0,-(sp)
  224.                move.w     #Fopen,-(sp)
  225.                trap       #gemdos
  226.                addq.l     #8,sp
  227.                movem.l    (sp)+,d1/d2/a0-a2
  228.                rts        
  229.  
  230.  
  231.  
  232. basepage:      .DS.l 1    ; Zeiger auf Baspage des Programmes TEMPCALL
  233.  
  234. Prg_Name:      .DC.b 'TEMPUS.PRG',0     ; Names des aufzurufenden Editors
  235.  
  236.                .EVEN 
  237. zero:          .DC.b 0    ; Environmentstring (leer)
  238.  
  239. ;              ; Die Kommandozeile die an TEMPUS übergeben werden soll,
  240. ;              ; wird hier angelegt.
  241. Cmd_Len:       .DS.b 1
  242. Cmd_Str:       .DS.b 126
  243.  
  244. endlab:        .END 
  245.  
  246.