home *** CD-ROM | disk | FTP | other *** search
File List | 1990-03-07 | 10.0 KB | 246 lines |
- ; **************************************************************************
- ; *** ***
- ; *** TEMPCALL V1.1 vom 27.6.89 ***
- ; *** ***
- ; *** ***
- ; *** Programm zum Aufruf von TEMPUS vom Manager des ST-Pascals aus ***
- ; *** ------------------------------------------------------------- ***
- ; *** ***
- ; *** (c) 1989 by Stefan Focke, Bonn ***
- ; *** ============================== ***
- ; *** ***
- ; *** ***
- ; *** ***
- ; *** ( GFA_Assembler V1.3, PC relative Adressierung ) ***
- ; *** ***
- ; *** ***
- ; **************************************************************************
-
-
-
- ; Beim direkten Aufruf von TEMPUS bekommt man Probleme, wenn .ERR Dateien
- ; geladen werden sollen. Der Manager ruft den Editor auf zwei verschiedene
- ; Arten auf:
- ;
- ; - Aufruf über den Menüpunkt 'Editor':
- ; An Tempus wird dabei einen Kommandozeile, bestehend aus dem Namen der
- ; zu editierenden Datei, übergeben. TEMPCALL formt diese Kommandozeile
- ; um. Es wird getestet, ob außer der in der Kommandozeile übergebenen
- ; Datei noch eine .ERR Datei gleichen Namens existiert. Falls dem so
- ; ist, so wird die Kommandozeile um die Angabe der .ERR-Datei erweitert
- ; und diese dadurch auch geladen.
- ;
- ; - Aufruf beim Compilieren
- ; Das Problem dabei ist, daß zum einen die .ERR-Datei nicht geladen wird
- ; und zum anderen, daß immer noch gefragt wird, ob eine Datei mit dem
- ; Namen der Fehlermeldung angelegt werden soll. TEMPCALL läd daher
- ; die .ERR-Datei und schneidet die Fehlermeldung ab.
-
-
-
- ; Einbinden von TEMPCALL in den Manager:
- ; --------------------------------------
- ;
- ; Wenn statt TEMPUS als Editor (Programme suchen) TEMPCALL eingetragen
- ; wird, so wird aus dem Manager TEMPCALL aufgerufen. TEMPCALL wiederum
- ; ruft TEMPUS auf. TEMPCALL muß sich dazu im gleichen Ordner wie Tempus
- ; befinden.
-
- ; Nach dem Verlassen von Tempus kann der Compiler und/oder der Linker
- ; aufgerufen werden. Dazu muß ein Returncode an den Manager zurück-
- ; gegeben werden:
- ; Returncode = 1 : Compiler aufrufen
- ; ReturnCode = 2 : Compiler und Linker aufrufen
- ; Von Tempus aus kann man den zurückgegebenen Returncode beeinflussen,
- ; indem man Tempus mit <Shift> <Alternate> <0..2> verläßt. Die gewählte
- ; Nummer (vom Ziffernblock) entspricht dem Returncode.
-
-
- ; Arbeitsweise von TEMPCALL:
- ; --------------------------
- ;
- ; Der Manager übergibt, wenn beim Compilieren ein Fehler auftritt und
- ; der Editors aufgerufen werden soll, folgende Kommandozeile:
- ; drv:\pfad\dateiname zeile spalte fehler
- ;
- ; Um Tempus richtig aufzurufen muß folgendes Kommando erzeugt werden:
- ; drv:\pfad\fehlerdatei drv:\pfad\dateiname zeile spalte
- ;
- ;
- ; Wenn der Editor direkt aufgerufen wird, steht in der übergebenen
- ; Kommandozeile nur der Namen der zu editierenden Datei:
- ; drv:\pfad\dateiname
- ;
- ; TEMPCALL formt diese Kommandozeile in Abhängigkeit davon, ob es eine
- ; .ERR-Datei gibt, wie folgt um:
- ; drv:\pfad\dateiname
- ; oder
- ; drv:\pfad\fehlerdatei drv:\pfad\dateiname
-
-
-
- ; Hinweis zum Assemblieren:
- ; --------------------------
- ;
- ; Das Programm sollte aus Gründen der Ausführungsgeschwindigkeit und
- ; der Programmlänge PC-relativ assembliert werden. Das Programm muß
- ; die Endung .PRG bekommen.
-
-
-
- ; Hinweise zur Version 1.1
- ; ------------------------
- ; Ein übergebener Dateiname ohne Extension erzeugt keine Bombem mehr.
- ; Bei solchen Dateien, wird keine .ERR-Datei gesucht
-
-
-
- .PRINTER 27,15
- .LIST
-
- gemdos equ 1
-
- ; Benötigte Gemdos - Funktionen
- Pterm0 equ 0
- Mshrink equ $4a
- Pexec equ $4b
- Fopen equ $3d
- Pterm equ $4c
-
-
-
- begin: lea.l begin,a6 ; Retten des Basisregisters für PC-relative Adressierung
-
- movea.l 4(sp),a0
- move.l a0,basepage(a6) ; Rette Basepage-Zeiger vom Stack
- move.l $18(a0),d0
- addi.l #$100,d0
- movea.l d0,sp
- sub.l a0,d0
-
- ; ; Freigeben des nicht gebrauchten Speichers
- move.l d0,-(sp)
- move.l a0,-(sp)
- move.w #0,-(sp)
- move.w #Mshrink,-(sp)
- trap #gemdos
- adda.l #12,sp
-
- lea.l Cmd_Str,a2 ; Zeiger auf neue Kommandozeile nach A2
- movea.l basepage,a1
- adda.l #$81,a1 ; Zeiger auf übergebene Kommand-Line
- cop1: move.b (a1)+,(a2)+ ; Kopieren DateiNamen aus alter in neue
- cmpi.b #' ',(a1) ; Kommandozeile
- beq cop2
- cmpi.b #0,(a1)
- bne cop1
-
- cop2: subq.l #1,a2 ; Bewege A2 soweit zurück, das es auf den
- cmpa.l #Cmd_Str,a2 ; Test, ob Punkt überhaupt vorhanden
- beq NoErrFile
- cmpi.b #'.',(a2) ; Punkt im Dateinamen zeigt
- bne cop2
- addq.l #1,a2 ; A2 zeigt auf Zeichen hinter dem Punkt
- move.b #'E',(a2)
- move.b #'R',1(a2)
- move.b #'R',2(a2)
- move.b #$00,3(a2) ; alte Extension durch 'ERR' ersetzen
-
- ; ; Test, ob zu dem übergebenen Dateinamen eine .ERR-Datei existiert
- lea.l Cmd_Str,a0 ; Dateiname mit .ERR - Endung
- bsr OpenFile
- cmpi.w #0,d0
- bmi NoErrFile ; Keine Datei mit der Endung '.ERR' vorhanden
-
- ; ; Es ist also eine Datei mit der Endung '.ERR' vorhanden.
- ; ; A2 zeigt im Moment auf das 'E' von 'ERR'
- addq.l #3,a2
- move.b #' ',(a2)+ ; A2 zeigt hinter den Dateinamen mit
- bra CopyOld ; der ERR-Endung
-
- ; ; Falls das .ERR-File nicht existiert, wird der Zeiger A2 wieder
- ; ; auf den Anfang der Kommandozeile gesetzt.
- NoErrFile: lea.l Cmd_Str,a2
-
-
- ; ; A2 zeigt auf die Stelle an die die alte Kommandozeile in die neue
- ; ; Kommandozeile hineinkopiert werden soll. Also, wenn keine .ERR
- ; ; Datei existiert auf den Anfang der neunen Zeile oder, wenn diese
- ; ; Datei existiert, hinter den mit .ERR endenden Dateinamen.
- CopyOld: movea.l basepage,a1
- adda.l #$81,a1 ; Zeiger auf alte Kommand-Line
- cop3: move.b (a1)+,(a2)+ ; Kopieren komplette alte Kommand-Line
- cmpi.b #0,(a1)
- bne cop3
-
- ; ; Nun muß noch getestet werden, ob hinter dem letzten Dateinamen
- ; ; noch Zahlen angegeben sind. Falls dem so ist, muß die letze
- ; ; Zahl, die Nummer des Fehlers, gelöscht werden.
- ; ; A2 zeigt hinter das letze Zeichen, das aus der alten Kommando-
- ; ; zeile heraus kopiert wurde.
-
- ; ; Suche von hinten das erste nichtnummerische Zeichen. A2 wird dabei
- ; ; immer wieder erniedrigt, sodaß es am Ende auf das erste nicht-
- ; ; numerische Zeichen zeigt.
- del1: move.b -(a2),d0
- cmpi.b #'0',d0
- bmi NoNum
- cmpi.b #'9'+1,d0
- bmi del1 ; Ziffer gefunden, A0 weiter erniedrigen
-
- ; ; Es wurde ein Zeichen gefunden, das keine Ziffer ist.
- ; ; A2 zeigt auf dieses Zeichen.
- NoNum: addq.l #1,a2
- move.b #0,(a2) ; Schreibe Null hinter die neue KommandoZeile
-
- move.l a2,d0 ; A2 zeigt hinter Kommandozeile
- lea.l Cmd_Len+1,a1 ; Ermittle Länge der Kommandozeile
- sub.l a1,d0
- move.b d0,Cmd_Len(a6) ; Speichern der Länge der Kommandozeile
-
- pea zero ; Zeiger auf Environment (leer)
- pea Cmd_Len ; Zeiger auf Start der Kommandozeile
- pea Prg_Name ; Zeiger auf den Programmnamen 'TEMPUS'
- clr.w -(sp)
- move.w #$4b,-(sp) ; Pexec
- trap #1
-
- ; ; Hierher kehrt TEMPUS zurück. Auch TEMPCALL kann dann verlassen
- ; ; werden. Es wird dann der Manager wieder gestartet.
- andi.w #$ff,d0
- move.w d0,-(sp) ; Weitergeben des Return-Codes
- move.w #Pterm,-(sp)
- trap #1
-
-
-
-
- ; Gemdos-Funktion zum öffnen einer Datei
- ; in: A0.l = Zeiger auf den Namen der Datei
- ; out: D0.w = Fehler beim Öffnen, wenn <> 0;
- OpenFile: movem.l d1/d2/a0-a2,-(sp)
- move.w #0,-(sp)
- move.l a0,-(sp)
- move.w #Fopen,-(sp)
- trap #gemdos
- addq.l #8,sp
- movem.l (sp)+,d1/d2/a0-a2
- rts
-
-
-
- basepage: .DS.l 1 ; Zeiger auf Baspage des Programmes TEMPCALL
-
- Prg_Name: .DC.b 'TEMPUS.PRG',0 ; Names des aufzurufenden Editors
-
- .EVEN
- zero: .DC.b 0 ; Environmentstring (leer)
-
- ; ; Die Kommandozeile die an TEMPUS übergeben werden soll,
- ; ; wird hier angelegt.
- Cmd_Len: .DS.b 1
- Cmd_Str: .DS.b 126
-
- endlab: .END
-
-