Assembler in Hochsprachen

Normalerweise nicht nötig, aber manchmal kommt man nicht darum herum: Probleme können nicht in einer reinen Hochsprache sondern nur mit Hilfe von Maschinencode gelöst werden.

Hier eine Zusammenstellung möglicher Lösungen.
RSX
Die RSX wird in Assembler programmiert und ihre Funktionen werden wie normale BDOS-Aufrufe abgerufen. Dazu wird der fertigen, in einer Hochsprache erstellten, .COM-Datei die RSX mit dem CP/M Systemprogramm GENCOM angehängt. Der Vorteil ist, dass diese RSX auch von anderen .COM-Dateien genutzt werden kann. Ein Artikel zur Funktion einer RSX findet sich hier.
Module
Microsoft hat das REL80-Format in vielen seiner Produkte realisiert, das auch andere Hersteller übernommen haben. Zu den Hochsprachen gehören meistens Bibliotheken (libraries), die durch eigene Routinen erweitert werden können, also auch durch Assembler-Routinen. Einige Hinweise dazu finden sich hier.
Auch der HI-TECH Z80 CP/M C Compiler unterstützt Bibliotheken, jedoch nicht im REL80-Format.
Konstante
Gerade in BASIC (aber auch TURBO-Pascal, siehe hier unter KERNEL.INC) können fertige Routinen mit dem DATA-Statement eingelesen werden. (Analog dazu in TURBO-Pascal mit z.B. const array). Ein Programmbeispiel zur Erzeugung von DATA-Statements aus einer .HEX-Datei findet sich hier. Ein weiteres Projekt zur Erzeugung von DATA-Statements aus einer .HEX, .REL oder .COM-Datei ist hier ausgehängt. Die Parameterübergabe erfolgt dann über die Z80-Register, siehe dazu AMSTRAD Benutzerhandbuch für den PCW, Band 2, Mallard-BASIC, Anhang III, Absatz 3.
Inline
TURBO-Pascal erlaubt das Einbinden von Maschinencode in beliebige Prozeduren und Funktionen. Allerdings als eine Folge konstanter Bytes, die wiederum aus einem Assembler-Programm erzeugt werden müssen. Das geht allerdings nicht mit „Bordmitteln" - dazu wird ein Extra-Programm benötigt, es sei denn die Bytes werden manuell eingetragen.

Zur Erzeugung des Inline-Codes bietet sich u.a. auch ein als REL80-Datei vorliegendes Modul an. Eine zweite Möglichkeit ist die Verarbeitung einer vom Assembler erzeugten LIST-Datei.

Das erste Verfahren wurde 1986 in der Zeitschrifte MC beschrieben.
Vorteil des ersten Verfahrens:
Die Verarbeitung ist nur an ein Format gebunden, nämlich REL80. Damit ergibt sich ein universeller Einsatz verschiedener Assembler.
Nachteil des ersten Verfahrens:
Der Quellcode ist nicht in der Datei enthalten.

Das zweite Verfahren wurde ebenfalls 1986 in der Zeitschrifte CT beschrieben.
Vorteil des zweiten Verfahrens:
In der Datei ist neben den Binärwerten auch der Quellcode enthalten, der dann einfach als Kommentar in das Pascal-Programm eingebunden werden kann. Dies ist ein großer Vorteil für die Dokumentation.
Nachteil des zweiten Verfahrens:
Man ist auf einen Assembler festgelegt, da die LIST-Formate verschiedener Assembler stark differieren. Eine Übersicht über einige Formate findet sich hier.

Ich habe mich damals für die Implementierung mit dem REL80-Format entschieden, meine Implementierung findet sich hier.
Später habe ich ein Programmpaket von MITEK entdeckt, das einen Assembler enthielt, der neben dem REL-80 Format auch Inline Code erzeugt. Mit dem Aufruf ZAS Datei [$]T wird die Datei DATEI.INC angelegt. Neben dem reinen Inline Code wird außerdem als Kommentar das erzeugte Listing eingefügt, wodurch der Inline Code verständlich wird.