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 >
Wrap
File List
|
1990-03-07
|
10KB
|
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