title DATA Generator fuer BASIC - Initialisierung name ('DATAINI') maclib base80 ; Das Programm wandelt eine Binaerdatei in DATA-Anweisungen fuer BASIC ; ; Dieser Teil initialisiert das Programm ; ; Copyright (c) Werner Cirsovius ; Hohe Weide 44 ; D-20253 Hamburg ; Tel.: +49-40-4223247 ; ; Version 1.0, Januar 1995 entry IniDAT,getarg extrn TopPag,$memry,Heap,argc extrn Lopt,Iopt,Hopt,Copt,Sopt extrn FI,FO extrn @parcn,@parst,@assig extrn decin,hexin extrn string,strcn0,crlf dseg $ILLOPT: db 'Ungueltige Option: ',eot $WARN: db 'Mehrfach-Option ignoriert: ',eot $INVOPT: db 'Optionen muessen vor Dateinamen liegen',eot $ILLPAR: db 'Ungueltiger Wert in: ',eot $MANFILE: db 'Zu viele Dateinamen: ',eot $ILLFILE: db 'Ungueltiger Dateiname: ',eot cseg ; ; Programm initialisieren ; IniDAT: pop bc ; Aufrufer holen ld hl,(TPAtop) ; Hoechsten Speicher holen ld sp,hl ; Fuer Stack push bc ; Aufrufer zurueck dec h ; Platz fuer Stack lassen dec h ld a,h ld (TopPag),a ; Hoechste Seite ablegen ld hl,($memry) ; Erste freie Adresse ld l,0 inc h ; Mit Seitengrenze ld (Heap),hl ; Speichern call @parcn ; Anzahl Parameter bestimmen ld a,b ld (argc),a ; Und ablegen ret ; ; Bearbeitung der Kommandozeile ; getarg: ld a,(argc) ; Anzahl laden ld c,a ld b,1 ; Startwert setzen ld l,00000000b ; Status einstellen getaloop: push bc push hl ld de,(Heap) ; Adresse laden push de call @parst ; Parameter laden pop ix pop hl ld a,(ix+0) ; Erstes Zeichen laden cp '-' ; Test ob Option push af call z,doOpt ; Option holen pop af call nz,doFile ; Datei holen pop bc inc b ; Naechster Parameter dec c jr nz,getaloop ret ; ; Option holen ; doOpt: bit 7,l ; Test ob im Datei-Modus jr nz,invOpt ; Ja, Fehler ld a,(ix+1) ; Option holen ; ld h,00000001b ; Bit laden ld iy,Lopt ; Zeiger laden cp 'L' ; Test Zeilennummer jr z,exeOpt ; ld h,00000010b ld iy,Iopt cp 'I' ; Test Inkrement jr z,exeOpt ; ld h,00000100b ld iy,Hopt cp 'H' ; Test Kopf vorweg jr z,exeOpt ; ld h,00001000b ld iy,Copt cp 'C' ; Test Pruefsumme jr z,exeOpt ; ld h,00010000b ld iy,Sopt cp 'S' ; Test Startadresse jr z,exeOpt ld de,$ILLOPT WarnEx: call .Warning ; Fehler ausgeben und Ende jp OS invOpt: ld de,$INVOPT call string ; Fehler ausgeben und Ende jp OS ; ; Warnung ausgeben bei doppelter Option ; Warning: ld de,$WARN .Warning: call string ld de,(Heap) ; Adresse laden call strcn0 ; Option ausgeben call crlf ret ; ; Option umsetzen ; exeOpt: ld a,l ; Status holen and h ; Test ob schon gewaehlt jr nz,Warning ; Fehler falls ja ld a,l or h ; Bit setzen ld l,a bit 4,h ; Test ob hex Eingabe ld de,hexin jr nz,exeHex ld a,h and 00000011b ; Test ob weiterer Parameter ld (iy+0),TRUE ret z ; Nein, war BOOL ld de,decin exeHex: push bc push hl ex de,hl ld de,(Heap) ; Adresse laden inc de ; Auf Parameter einstellen inc de ld b,null call jp.hl ; Wert wandeln ld (iy+0),l ; Und eintragen ld (iy+1),h ex de,hl pop hl pop bc jr c,illpar ld a,e or d ret nz ; 0 ist auch falsch illpar: ld de,$ILLPAR jr WarnEx jp.hl: jp (hl) ; ; Datei holen ; doFile: ld de,FI+.fdrv ld a,(de) cp ' ' ; Test ob Quelldatei definiert jr z,assfile ld de,FO+.fdrv ld a,(de) cp ' ' ; Test ob Zieldatei definiert jr z,assfile ld de,$MANFILE jp WarnEx ; Fehler ausgeben und Ende assfile: set 7,l ; Dateiwahl einstellen push hl dec de push de ; Dateizeiger retten ld hl,(Heap) ; Adresse laden ld de,FCB call @assig ; Datei zuordnen jr c,asserr ld a,l or h jr nz,asserr pop de ; Dateizeiger holen ld hl,FCB ld bc,.fdrv+.fname+.fext ldir ; Dateinamen umkopieren pop hl ret asserr: ld de,$ILLFILE jp WarnEx end