title DATA Generator fuer BASIC - .HEX Loader name ('DATHEX') maclib base80 ; Das Programm wandelt eine Binaerdatei in DATA-Anweisungen fuer BASIC ; ; Dieser Teil laedt eine .HEX Datei ; ; Format der HEX-Datei: ; ; :<08> <0100> <00> <00 00 00 08 31 32 33 34> <25> ; Ln Adr Ty --- Daten --- Ck ; ; Pruefsumme 'Ck' ist -(Ln+Adr+Ty+..Daten..> ; ; Der letzte Eintrag ist: ; ; :<00> <0000> <01> ; ; ; Copyright (c) Werner Cirsovius ; Hohe Weide 44 ; D-20253 Hamburg ; Tel.: +49-40-4223247 ; ; Version 1.0, Januar 1995 entry HEXexe extrn geteof,adda extrn memok,Sopt dseg StkSave: ds 2 StrtAdr: ds 2 CodeLen: ds 1 cseg ; ; Hex-Byte laden ; gethex: call get ; Zeichen laden sub '0' ; Ohne Offset cp 10 ; Bereich testen ret c ; Ok bei 0..9 add a,'9'-'A'+1 ; Justieren fuer A..F cp 15+1 ret c ; Bereich ok jr illHEX ; .. ungueltig ; ; Zeichen aus Datei lesen ; get: call geteof ; Zeichen lesen ret nc ; Darf nicht Ende der Datei sein illHEX: ld sp,(StkSave) ; Stack laden ld b,1 jr ..err empHEX: ld b,0 ..err: xor a inc a ld a,b ret ; ; HEX-Laderoutine ; HEXexe: ld (StkSave),sp ; Stack retten call HEXline ; Lesen der ersten Zeile jr c,illHEX ; Fehler in der Zeile jr z,empHEX ; Auch Fehler bei leerer Datei ld (StrtAdr),bc ; Adresse speichern ld (Sopt),bc ld a,e ld (CodeLen),a ; Und Laenge ablegen HEXloop: call HEXline ; Lesen der naechsten Zeilen ret z ; Ende der Datei jr c,illHEX ; Fehler in der Zeile call tstadr ; Adresse ueberpruefen jr nc,HEXloop jr illHEX ; Fehler ; ; Lesen einer HEX Zeile ; Im Fehlerfall ist Carry-Flag gesetzt ; Bei Dateiende ist die Zero-Flag gesetzt ; HEXline: call get ; Zeichen lesen sub ':' ; Synchronisationszeichen testen scf ret nz ; Fehler wenn nicht ld d,a ; Pruefsumme setzen call getCKS ; Laenge lesen ld e,a call getCKS ; Hochwertiges Addressbyte lesen ld b,a call getCKS ; Niederweriges Addressbyte lesen ld c,a ld a,e ; Test ob Laenge Null or a ret z ; Ende der Datei wenn ja push af ; Laenge ablegen call getCKS ; Typen ueberlesen LdHEXloop: call getCKS ; Byte lesen ld (hl),a ; Und speichern inc hl dec e jr nz,LdHEXloop pop af ; Laenge zurueckholen ld e,a call memok ; Test ob genug Speicher call getCKS ; Pruefsumme lesen scf ret nz ; Pruefsumme sollte Null sein call get ; Zeilenende testen cp cr scf ret nz call get cp lf scf ret nz xor a inc a ; Erfolg setzen ret ; ; Byte aus .HEX-Datei lesen und Pruefsumme aktualisiern ; getCKS: push bc push hl push de call getByte ; Byte lesen ld b,a ; Sichern pop de ; Pruefsumme holen add a,d ; Aktualisieren ld d,a ld a,b ; Byte zurueckholen pop hl pop bc ret ; ; Byte von Datei lesen ; getByte: call gethex ; Hex laden rlca ; Obere Bits holen rlca rlca rlca and HiMask ; Bits extrahieren push af call gethex ; Hex laden pop bc ; Untere Bits einfuegen or b ret ; ; Ueberpruefen der Adresse in Register BC ; Laenge der Zeile in Register E ; Im Fehlerfall ist Carry-Flag gesetzt ; tstadr: push hl ld a,(CodeLen) ; Alte Laenge holen ld hl,(StrtAdr) ; Alte Adresse holen call adda ; Neue Adresse berechnen ld (StrtAdr),hl ; Adresse speichern ld a,e ld (CodeLen),a ; Neue Laenge ablegen or a sbc hl,bc ; Adressen muessen gleich sein pop hl ret z ; Ja scf ret end