MLOAD utility
MLOAD
1
is a utility to overlay an existing .COM file by one or more .HEX files. The tool is helpful in a hardware dependent program environment (such as programming MODEM drivers).
The actual MODEM program (.COM file) contains the hardware independent parts.
The hardware driver must be programmed separately (as .HEX file) and will be overlayed using MLOAD
2
.
Because many assemblers are producing the Microsoft REL80 format I modified the code, so .REL files may be used, too. In this implementation the modules must be assembled in the absolute mode (ASEG) and my not contain external rederences.
Look here for the source file:
MLOAD
1.
Hal Bower published on his
web side
a version fo Z-Systems:
MYLOAD13.LBR
(Source
MYLOAD13.Z80
).
2.
A good example using MLOAD is
KERMIT 4.11
. The required driver will be appended to the hardware-independent kernel.
The following example illustrates the process in principle. The main program creates the label
OVLAY
where the jump table starts. Without installing a driver a CP/M warm start (address
0000H
) is executed. With driver installed the screen will be cleared and a message placed on screen.
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
The main program
Driver with JOYCE sequences
Driver without sequences