title DATA Generator fuer BASIC - .REL Loader name ('DATAREL') maclib base80 maclib reldef ; Das Programm wandelt eine Binaerdatei in DATA-Anweisungen fuer BASIC ; ; Dieser Teil laedt eine .REL Datei ; ; Das Format einer .REL-Datei ist Bit-codiert. ; Datei darf entweder nur mit CSEG oder ASEG erzeugt werden. ; ; Copyright (c) Werner Cirsovius ; Hohe Weide 44 ; D-20253 Hamburg ; Tel.: +49-40-4223247 ; ; Version 1.0, Januar 1995 entry RELexe extrn memok,$MODNAM,Sopt extrn dskget,indexa extrn biterr,dskpc,bit1,bit2,bit4,bit8,bit16,AField,BField dseg StkSave: ds 2 AdrMode: db -1 LocCtr: db FALSE MSTAB: dw MS.0 dw MS.1 dw MS.2 dw MS.3 dw MS.4 dw MS.5 dw MS.6 dw MS.7 dw MS.8 dw MS.9 dw MS.A dw MS.B dw MS.C dw MS.D dw MS.E dw MS.F cseg ; ; Adressmodus testen ; TstAdrMode: ld b,a ld a,(AdrMode) cp -1 ; Test ob schon defininiert jr z,NewMode ; Nein, dann eintragen cp b ; Muss gleich sein jr nz,RELerr ; Sonst Fehler NewMode: ld a,b ; Asressmodus eintragen ld (AdrMode),a ret ; ; Fehlerroutine ; RELerr: ld sp,(StkSave) ; Stack laden ld b,1 xor a inc a ld a,b ret ; ; REL-Laderoutine ; RELexe: ld (StkSave),sp ; Stack retten ld de,dskget ; Adressen festlegen ld (dskpc),de ld de,RELerr ld (biterr),de RELloop: call bit1 ; Bit lesen jr c,NoCons ; Keine Konstante call bit8 ; Byte laden ld (hl),a inc hl call memok ; Test ob genug Speicher jr RELloop NoCons: call bit2 ; Typ lesen or a ; Test ob Spezial jr z,MSLINK ; Ja cp 01b ; Test CSEG jr nz,RELerr ; Fehler call TstAdrMode ; Adressmode testen ex de,hl call bit16 ; Adresse holen ex de,hl ld (hl),e ; Und eintragen inc hl ld (hl),d inc hl jr RELloop MSLINK: call bit4 ; Typ lesen push hl ld hl,MSTAB call indexa ; Routine laden ld hl,RELret push hl ; Ruecksprung-Adresse ablegen push de ret ; Routine ausfuehren RELret: pop hl jr RELloop ; ; Special Link Item 0000: Symbol-Definition ; Special Link Item 0001: Common Block auswaehlen ; Special Link Item 0011: Bibliotheksanfrage ; Special Link Item 0100: Erweiterter MS-Link ; Special Link Item 0101: Common-Groesse definieren ; Special Link Item 0110: Externe Verkettung ; Special Link Item 0111: Entry Point definieren ; Special Link Item 1000: Externer negativer Offset ; Special Link Item 1001: Externer positiver Offset ; Special Link Item 1100: Adresse verketten ; MS.0: MS.1: MS.3: MS.4: MS.5: MS.6: MS.7: MS.8: MS.9: MS.C: jp RELerr ; Nicht erlaubt ; ; Special Link Item 0010: Programm-Name ; MS.2: ld hl,$MODNAM-1 ; Zeiger auf Modulnamen call BField ; Namen lesen ret ; ; Special Link Item 1010: Daten-Laenge definieren ; MS.A: call AField ; Laenge holen ld a,l ; Muss 0 sein or a jp nz,RELerr ret ; ; Special Link Item 1011: Adress-Zeiger setzen ; MS.B: call AField ; Adresse holen call TstAdrMode ; Adressmode testen ld a,(LocCtr) ; Test ob bereits eine Adresse eingetragen cp TRUE jp z,RELerr ; Fehler falls ja ld (Sopt),hl ; Adresse eintragen ld a,TRUE ld (LocCtr),a ret ; ; Special Link Item 1101: Programm-Laenge definieren ; MS.D: call AField ; Adresse holen call TstAdrMode ; Adressmode testen ret ; ; Special Link Item 1110: Ende des Moduls ; Special Link Item 1111: Ende der Datei ; MS.E: MS.F: pop bc ; Stack auf Hauptebene pop hl ; Speicheradresse holen xor a ; Ende anzeigen ret end