title DATA Generator fuer BASIC name ('DATAMAIN') maclib base80 ; Das Programm wandelt eine Binaerdatei in DATA-Anweisungen fuer BASIC ; ; Aufruf mit: ; ; BASDATA [-Opt] Quelle.Frm [Ziel[.Typ]] ; ; Mit ".Frm" wird das Binaerformat gewaehlt. ; ; Das Binaerformat kann sein: ; .HEX INTEL HEX Format ; .REL Microsoft REL80 Format ; .COM CP/M COM-Datei Format ; ; Mit den Optionen: ; ; Option Wirkung Voreinstellung ; ======= =============================== ============== ; -Lxxxx Start der DATA oder Kopfzeile 50000 ; -Ixx Zeileninkrement 10 ; -Sxxxx Start der Daten &HC000 ; -H Voranstellung eines Lade-Kopfes Aus ; -C Pruefsumme Aus ; ; Ohne Angabe einer Zieldatei wird die Datei "Quelle.BAS" erzeugt. ; ; Copyright (c) Werner Cirsovius ; Hohe Weide 44 ; D-20253 Hamburg ; Tel.: +49-40-4223247 ; ; Version 1.0, Januar 1995 entry $memry,TopPag,Heap,argc entry Lopt,Iopt,Hopt,Copt entry FI,FO,$MODNAM,Sopt,DatLen entry memok entry @error extrn IniDAT,getarg extrn HEXexe,COMexe,RELexe extrn WrHead,wrDATA extrn getver,shfrhl,indexa,hexout extrn string,fildrv extrn open,creatd,closef MAXARG equ 5+2 ; Maximale Anzahl Parameter ; ; Richtwert fuer Assembler Lade-Routine ; Ermittelt unter Mallard-BASIC mit ; ; PRINT HEX$(HIMEM-FRE(0)) ; ; (Wert nach oben gerundet) ; BASADR equ 7e00h dseg $LOWADR: db 'Warnung: Ladeadresse ' $LDADR: db 'xxxx liegt unter dem Minimalwert (&H7E00)' db cr,lf,eot $HELP: db 'Das Programm wandelt eine Binaerdatei in DATA-Anweisungen fuer BASIC' db cr,lf,lf db 'Aufruf mit:' db cr,lf,lf db tab,'BASDATA [-Opt] Quelle.Frm [Ziel[.Typ]]' db cr,lf,lf db 'Mit ".Frm" wird das Binaerformat gewaehlt.' db cr,lf,lf db 'Das Binaerformat kann sein:' db cr,lf db '.HEX INTEL HEX Format' db cr,lf db '.REL Microsoft REL80 Format' db cr,lf db '.COM CP/M COM-Datei Format' db cr,lf,lf db 'Mit den Optionen:' db cr,lf,lf db tab,'Option',tab,tab,'Wirkung',tab,tab,tab,'Voreinstellung' db cr,lf db tab,'=======',tab,'===============================',tab,'==============' db cr,lf db tab,'-Lxxxx',tab,'Start der DATA oder Kopfzeile',tab,'50000' db cr,lf db tab,'-Ixx',tab,'Zeileninkrement',tab,tab,tab,'10' db cr,lf db tab,'-Sxxxx',tab,'Start der Daten',tab,tab,tab,'&HC000' db cr,lf db tab,'-H',tab,'Voranstellung eines Lade-Kopfes',tab,'Aus' db cr,lf db tab,'-C',tab,'Pruefsumme',tab,tab,tab,'Aus' db cr,lf,lf db 'Ohne Angabe einer Zieldatei wird die Datei "Quelle.BAS" erzeugt.' db eot $ILLCPU: db 'Programm benoetigt die Z80 CPU',eot $ILLENV: db 'Programm benoetigt CP/M PLUS',eot $TOOMANY: db cr,lf db 'Erneut mit weniger Parametern versuchen',eot $ILLTYP: db 'Ungueltiger Dateityp der Quelldatei' db cr,lf db 'Gueltig sind .HEX, .COM und .REL',eot $FILE: db 'Datei ',eot $NOFND: db ' nicht gefunden',eot $NOCREC: db ' kann nicht erzeugt werden',eot $NOCLOS: db ' kann nicht geschlossen werden',eot $NOMEM: db 'Nicht genug Speicher - Abbruch',eot $NOFILE: db 'Quelldatei fehlt',eot $DONE: db 'DATA-Datei erzeugt...' db cr,lf,eot ErrTab: dw $EMPTY ; 0: Leere Datei dw $FORMER ; 2: Fehlerhafte Datei $EMPTY: db ' ist leer',eot $FORMER: db ' ist fehlerhaft',eot TopPag: db 0 ; Hoechste Speicherseite TopAdr: ds 2 ; Hoechste Ladeadresse DatLen: ds 2 ; Laenge der Daten $memry: dw 0 ; Vom LINKer eingetragene Adresse Heap: dw 0 ; Freie Adresse argc: ds 1 ; Anzahl Parameter Lopt: dw 50000 ; Option -L: Zeilennummer Iopt: dw 10 ; Option -I: Zeileninkrement Sopt: dw 0c000h ; Option -S: Start der Daten Hopt: db FALSE ; Option -H: Lade-Kopf Copt: db FALSE ; Option -C: Pruefsumme FI: db 0,' ' FO: db 0,' BAS' ; ds 1 ; Fuer REL Datei - Laenge $MODNAM: ds .fname+1 cseg ; ; Testen der Load-Adresse ; chkLdAdr: ld hl,(Sopt) ; Adresse laden ld bc,BASADR or a sbc hl,bc ; Bereich testen ret nc ; Sollte ueber Adresse sein add hl,bc ; Wert wiederherstellen ld de,$LDADR call hexout ; Und wandeln ld de,$LOWADR call string ; Warnung ausgeben ret ; ; Speicher mit Nullen fuellen ; Fill0: ld a,l and 00000111b ; Test ob Grenze ret z ld (hl),0 ; Fuellen inc hl jr Fill0 ; ; Dateinamen als Modulnamen abspeichern ; CpyModName: ld de,FI+.fdrv ld hl,$MODNAM ld b,.fname namon: ld a,(de) ; Zeichen laden cp ' ' call nz,stout ; Kein Leerzeichen speichern inc de djnz namon ld (hl),null ; Namen abschliessen ret stout: ld (hl),a inc hl ; ; Dummy fuer Bibliotheksfunktion ; @error: ret ; ; Test ob Adresse in HL noch im verfuegbaren Bereich ist ; memok: ld a,(TopPag) cp h ; Testen ret nc ; Ok ld de,$NOMEM jp FinMess ; ; Datei erzeugen ; MakeFile: ld de,FO+.fdrv ld a,(de) cp ' ' ; Ist Datei definiert? jr nz,GotBASfile ; Ja push de ld hl,FI+.fdrv ld bc,.fname ldir ; Dateinamen eintragen pop de GotBASfile: ex de,hl dec hl ld de,FCB push de ld bc,.fdrv+.fname+.fext ldir ; Dateinamen umkopieren pop de call creatd ; Datei erzeugen ret nc ld de,$NOCREC jr FileErr ; ; Datei schliessen ; CloseFile: call closef ; Datei schliessen ret nc ; Ok ld de,$NOCLOS jr FileErr ; ; Datei laden ; NotFound: ld de,$NOFND FileErr: push de ld de,$FILE call string ; Datei nicht gefunden ld de,FCB call fildrv pop de jr FinMess LoadFile: ld de,EndLoad push de ; Ruecksprungadresse setzen push hl ; Ladeadresse setzen ld hl,FI ld de,FCB push de ld bc,.fdrv+.fname+.fext ldir ; Dateinamen umkopieren pop de call open ; Datei oeffnen jr c,NotFound ; Datei nicht gefunden call CpyModName ; Modulnamen eintragen ld hl,(Heap) ; Datenadresse holen ret ; Ausfuehren ; ; Sprung hierhin, wenn Ladevorgang beendet ist ; Gesetzte Z Flag zeigt Erfolg an ; Sonst haelt Akku die Fehlernummer ; EndLoad: jr nz,LoadErr ; Ladefehler call Fill0 ; Speicher auf Grenze einstellen ld (TopAdr),hl ; Letzte Adresse ablegen ld de,(Heap) or a sbc hl,de ; Laenge berechnen call shfrhl ; Durch 8 dividieren call shfrhl call shfrhl ld (DatLen),hl ret ; ; Ausfuehren eines Fehlers beim Laden ; Akku haelt Fehlernummer: ; 0 - Leere Datei ; 1 - Ungueltiges Format ; LoadErr: ld hl,ErrTab call indexa ; Adresse holen jr FileErr ; Und ausgeben ; ; Dateityp testen - Z gesetzt wenn Typ gefunden ; isExt: cp (ix+0) ; Einfacher Test ret nz ld a,d cp (ix+1) ret nz ld a,e cp (ix+2) ret ; ; Hilfstext ausgeben ; help: ld de,$HELP call string ; Einfache Ausgabe ret ; ; Fehlermeldungen ; TooMany: call help ; Hilfe ausgeben ld de,$TOOMANY ; Anzeige zu viele Parameter jr FinMess IllEnv: ld de,$ILLENV ; Falsches CP/M jr FinMess ILLCPU: ld de,$ILLCPU ; Falsche CPU FinMess: call string jp OS ; ; ########### ; ## START ## ; ########### ; MAIN: sub a ; CPU pruefen jp pe,ILLCPU ; Muss Z80 sein call getver ; Betriebssystem pruefen jr c,IllEnv ; Falsch call IniDAT ; Programm initialisieren ld a,(argc) ; Parameteranzahl holen or a ; Test ob eine Eingabe jr nz,GotParam ; Ja ; ; Kein Parameter angegeben ; call help ; Hilfe ausgeben und Ende jp OS GotParam: cp MAXARG+1 ; Test ob zu viele Eingaben jr nc,TooMany ; Ja call getarg ; Parameter holen ld a,(FI+.fdrv) ; Test ob Quelldatei vorhanden cp ' ' ld de,$NOFILE jr z,FinMess ; Muss sein ld ix,FI+.fdrv+.fname ; ld a,'H' ld de,'EX' ld hl,HEXexe call isExt ; Test ob .HEX jr z,Fload ; ld a,'C' ld de,'OM' ld hl,COMexe call isExt ; Test ob .COM jr z,Fload ; ld a,'R' ld de,'EL' ld hl,RELexe call isExt ; Test ob .REL jr z,Fload ld de,$ILLTYP jp FinMess ; Falscher Typ Fload: call LoadFile ; Datei laden call chkLdAdr call MakeFile ; Datei erzeugen ld a,(Hopt) or a ; Test ob Kopf schreiben call nz,WrHead ; Ja call wrDATA ; Daten schreiben call CloseFile ; Datei schliessen ld de,$DONE call string ; Ausgabe, dass Programm fertig ist jp OS end MAIN