MLOAD Utility
MLOAD
1
ist ein Programm, das es erlaubt, eine vorhandene .COM-Datei mit Hilfe einer oder mehrerer .HEX-Dateien zu modifizieren. Nützlich ist dieses Programm dort, wo z.B. von der Hardware abhängige Programmierung zum Einsatz kommt (wie bei Modem-Programmen).
Das eigentliche Modem-Programm (.COM-Datei) beinhaltet alle Teile, die von der Hardware unabhängig sind.
Der Treiber für die Hardware wird dann gesondert programmiert (als .HEX-Datei) und mittels MLOAD mit der .COM-Datei verbunden
2
.
Da viele Assembler das Microsoft REL80-Format erzeugen, habe ich MLOAD so erweitert, dass auch eine .REL-Datei geladen werden kann. Voraussetzung ist dabei allerdings, dass das Modul im absoluten Modus (ASEG) erzeugt wird und keine externen Referenzen enthält.
Hier die Quelldatei:
MLOAD
1.
Hal Bower hat auf seiner
Web-Seite
eine Version für Z-Systeme ausgehängt:
MYLOAD13.LBR
(Quelle
MYLOAD13.Z80
).
2.
Ein gutes Beispiel für den Gebrauch von MLOAD ist
KERMIT 4.11
. Zum hardwareunabhängigen Kern wird der benötigte Treiber dazugeladen.
Das folgende Beispiel veranschaulicht den prinzipellen Ablauf. Das Hauptprogramm erzeugt das Label
OVLAY
, wo die Sprungleiste beginnt. Ohne Treiber wird der CP/M Warmstart (Adresse
0000H
) ausgeführt. Mit Treiber wird der Bildschirm gelöscht und ein Text an einer Position ausgegeben.
title MLOAD Test Programm ; Das Programm loescht den Bildschirm und positioniert den Cursor. ; Dort wird eine maschinenabhaengige Meldung ausgegeben. aseg org 0100h OS equ 0000h BDOS equ 0005h TPATOP equ BDOS+1 .string equ 9 ld hl,(TPATOP) ; Letzte Speicheradresse laden call setmem ; An overlay uebergeben call clrscr ; Bildschirm loeschen ld h,10 ; Zeile laden ld l,15 ; Spalte laden call atxy ; Cursor positionieren call idstrg ; Maschinennamen holen call string ; Namen ausgeben jp OS ; ; Meldung in Registerpaar DE ausgeben ; string: push bc push de push hl ld c,.string call BDOS ; Ausgabe pop hl pop de pop bc ret ; Adresse auf Seite einstellen (0XX00H) org ($+000ffh) AND 0ff00h ; Adresse ausgeben entry OVLAY OVLAY equ $ ; ; Sprungleiste zu den Routinen ; setmem: jp OS clrscr: jp OS atxy: jp OS idstrg: jp OS end
title MLOAD Test Programm ; Das Programm stellt zum JOYCE gehoerige Routinen zur Verfuegung. aseg org 0200h BDOS equ 0005h .condir equ 6 esc equ 1bh eot equ '$' ; Sprungleiste jp setmem jp clrscr jp atxy jp idstrg ; ------------------------------------ ; ; Speicherinitialisierung ; Registerpaar HL haelt die hoechste Speicheradresse ; Diese wird abgelegt und als Stackpointer verwendet ; Bei Rueckkehr haelt Registerpaar HL die erste freie Adresse ; setmem: ld (last),hl ; Adresse speichern pop bc ld sp,hl ; Stackpointer laden push bc ld hl,top ; Freie Adresse laden ret ; ; Bildschirm loeschen ; clrscr: ld a,'H' call escout ; ESCape Sequenz ausgeben ld a,'E' call escout ret ; ; Cursor positionieren auf H=Reihe und L=Spalte ; atxy: ld a,'Y' call escout ; Vorsoann ausgeben ld a,h ; Reihe laden call offs ld a,l ; Spalte laden offs: add a,' ' ; Offset addieren call cot ; Und Ausgabe ret ; ; Zeichensequenz ESC
ausgeben ; escout: push af ld a,esc call cot ; ESCape ausgeben pop af ; Dann Akku ; ; Zeichen im Akku ausgebebn ; cot: push bc push de push hl ld e,a ld c,.condir call BDOS ; Ausgabe pop hl pop de pop bc ret ; ; Maschinennamen laden ; idstrg: ld de,$IDSTRG ret $IDSTRG: db 'JOYCE/PCW 8256' db eot last: ds 2 top: end
title MLOAD Test Programm ; Das Programm stellt generische CP/M Routinen zur Verfuegung. aseg org 0200h BDOS equ 0005h .condir equ 6 lf equ 0ah eot equ '$' ; Sprungleiste jp setmem jp clrscr jp atxy jp idstrg ; ------------------------------------ ; ; Speicherinitialisierung ; Registerpaar HL haelt die hoechste Speicheradresse ; Diese wird abgelegt und als Stackpointer verwendet ; Bei Rueckkehr haelt Registerpaar HL die erste freie Adresse ; setmem: ld (last),hl ; Adresse speichern pop bc ld sp,hl ; Stackpointer laden push bc ld hl,top ; Freie Adresse laden ret ; ; Bildschirm loeschen ; clrscr: ld b,24 ; Anzahl Zeilen clr: ld a,lf call cot ; Zeilen vorwaerts djnz clr ret ; ; Cursor positionieren auf H=Reihe und L=Spalte ; atxy: ld b,h ; Anzahl Zeilen call clr ; Bildschirm schieben ld b,l ; Anzahl Spalten at: ld a,' ' call cot ; Cursor nach rechts djnz at ret ; ; Zeichen im Akku ausgebebn ; cot: push bc push de push hl ld e,a ld c,.condir call BDOS ; Ausgabe pop hl pop de pop bc ret ; ; Maschinennamen laden ; idstrg: ld de,$IDSTRG ret $IDSTRG: db 'GENERIC CP/M' db eot last: ds 2 top: end
Das Hauptprogramm
Treiber mit JOYCE-Sequenzen
Treiber ohne Sequenzen