home *** CD-ROM | disk | FTP | other *** search
- DECLARE SUB SCRFREI (Bild$, AbZeile%, BisZeile%)
- DECLARE SUB CPOS (cline%, cstelle%)
- DECLARE SUB CREST (cline%, cstelle%)
- '* ------------------------------------------------------- *
- '* INLINER.BAS *
- '* Inline-Generator für Turbo Basic. *
- '* Änderungen für Quick Basic sind mit )** markiert *
- '* (c) 1990 Karlheinz Rieth & TOOLBOX *
- '* ------------------------------------------------------- *
- DEFINT A-Z: DEFSTR Q-R
- KEY(10) ON: ON KEY(10) GOSUB ende
- ON ERROR GOTO er1
-
- start:
- CLS
- PRINT " Programm INLINER ";
- PRINT " (Beenden -> F10)"
- PRINT
- PRINT "Das Assembler-Inputfile muß den Regeln des";
- PRINT " DEBUG entsprechen"
- PRINT "Das Programm DEBUG.COM muß per PFAD erreichbar sein"
- PRINT "Die Steuerbefehle für DEBUG werden im Programm";
- PRINT " erzeugt"
- PRINT "Das Programm erzeugt eine Datei mit FüllBytes,in die"
- PRINT " DEBUG den Assembler-Code schreibt."
- PRINT "FüllByte ist NOP &H90, wenn 3 mal das Füllbyte";
- PRINT " erscheint,"
- PRINT "wird der Inline-Code abgebrochen.";
- PRINT " (FüllByte kann geändert werden.)"
- PRINT "Das CodeBinärFile kann z.B. mit $INLINE"; CHR$(34);
- PRINT "INLINE.BIN"; CHR$(34); " verwendet werden"
- PRINT "Wenn das INPUT-File *.BIN ist, wird es";
- PRINT " direkt gewandelt"
- PRINT
-
- qq0 = "NOPDAT@@.$$$"
- qq1 = "INLINE.ASM"
- qq2 = "$$$.ASM"
-
- PRINT "Inputfile *.ASM oder *.BIN Enter-> "; qq1;
- INPUT ; " "; q
- q = UCASE$(q)
- IF q <> "" THEN qq1 = q
- LOCATE 13, 47
- PRINT " "; qq1
-
- IF LEN(q) > 3 THEN q = RIGHT$(qq1, 3)
- IF UCASE$(q) = "BIN" THEN bin = -1 ELSE bin = 0
-
- pkt = INSTR(1, qq1, ".")
- IF pkt >= LEN(qq1) THEN pkt = 0 'wg. Fehler in TbBasic
- IF pkt = 0 THEN qq1 = qq1 + "."
- IF pkt = 0 THEN pkt = LEN(qq1)
- qlinks = UCASE$(LEFT$(qq1, pkt))
- qq3 = qlinks + "INL"
- qq4 = qlinks + "BIN"
- Anzahl = 10
-
- PRINT "Inline-Outfile Enter-> "; qq3;
- INPUT ; " "; q
- q = UCASE$(q)
- IF q <> "" THEN qq3 = q
- LOCATE 14, 47: PRINT " "; qq3
-
- IF bin THEN
- PRINT "*** "; qq1; " =Binär-File *** wird DIREKT";
- PRINT " gewandelt !!!!"
- qq4 = qq1
- GOTO bin1
- END IF
- PRINT "Code-BinärFile Enter-> "; qq4;
- INPUT ; " "; q
- q = UCASE$(q)
- IF q <> "" THEN qq4 = q
- LOCATE 15, 47: PRINT " "; qq4
-
- bin1:
- PRINT "Inline's mit Hex oder Dez-Zahlen? H/D Enter-> H";
- INPUT ; " "; q
- IF q = "" OR UCASE$(q) = "H" THEN
- hx = -1
- rinl = "HEX"
- ELSE
- hx = 0
- rinl = "DEZ"
- END IF
- LOCATE 16, 52: PRINT " " + rinl
-
- PRINT "Anzahl Elemente pro InlineZeile Enter->10";
- INPUT ; " "; a
- IF a <> 0 THEN Anzahl = a
- LOCATE 17, 52: PRINT " "; Anzahl
-
- IF bin THEN GOTO Lauf
-
- fuell:
- LOCATE 18, 1: PRINT SPACE$(79);
- LOCATE 18, 1: PRINT "FüllByte ist NOP &H90 "
- PRINT "Anderes Füllbyte,Hexzahl Eingeben";
- INPUT ; " Enter->90 "; q
- q = UCASE$(q)
- IF q = "" THEN
- fl$ = CHR$(&H90)
- qfl = "&H90"
- GOTO Lauf
- ELSE
- GOSUB hex2dez
- GOTO neufuell
- END IF
-
- neufuell:
- LOCATE 19, 1: PRINT SPACE$(79);
- LOCATE 18, 1
- PRINT "FüllByte ist jetzt "; qfl;
- PRINT " ist das o.k.? J/N Enter->J";
- INPUT ; " "; q
- IF q <> "" AND UCASE$(q) <> "J" THEN
- GOTO fuell
- END IF
-
- Lauf:
- CLS
- celin = 1
- IF bin THEN
- PRINT "BIN-Input File :"; qq4
- GOTO bin2
- END IF
- PRINT "Assembler -File :"; qq1
-
- bin2:
- PRINT "Inline -File :"; qq3
- PRINT "Pro Inline-Zeile "; Anzahl; " Elemente in "; rinl;
- PRINT " Schreibweise"
- IF bin THEN
- PRINT "****** DIREKTE-WANDLUNG des "; qq1; " Files !!!!"
- GOTO bin3
- END IF
- PRINT "Füllbyte ist "; qfl; " nach 3 mal "; qfl; " wird";
- PRINT " Inlinecode beendet"
- PRINT "Temporäre Dateien NOPDAT@@.$$$ und $$$.ASM ";
- PRINT "werden erzeugt,und wieder golöscht"
- PRINT "BinärDatei "; qq4; " kann am ProgrammEnde";
- PRINT " gelöscht werden."
-
- bin3:
- PRINT : PRINT "ist das o.k.? (Abbruch F10) ";
- PRINT " J/N Enter->J";
- INPUT ; " "; q
- IF UCASE$(q) = "N" THEN GOTO start
- CLS
- IF bin THEN GOTO bin4
-
- qq = qq1
- OPEN "i", 1, qq ' *.asm File einlesen
- OPEN "o", 2, qq2 ' daraus Input-Datei $$$.ASM mit
- PRINT #2, "a" ' Steuerzeichen für Debug erzeugen
- DatLang = LOF(1)
- WHILE NOT EOF(1)
- LINE INPUT #1, q
- PRINT #2, q: celin = celin + 1
- WEND
- PRINT #2, ""
- PRINT #2, "w"
- PRINT #2, "q"
- CLOSE
-
- OPEN "o", 1, qq0 'Datei 'NOPDAT@@.$$$'
- q = STRING$(DatLang, fl$) 'mit FüllZeichen erzeugen
- PRINT #1, q
- CLOSE
-
- q = "debug " + qq0 + " < " + qq2
- SHELL q 'Aufruf Debug:DEBUG NOPDAT@@.$$$ < $$$.ASM
- KILL qq2 '$$$.ASM löschen
-
- 'Datei NOPDAT@@.$$$ enthält jetzt
- 'assemblierten Code und Füllzeichen
- qt = ""
- fl3$ = fl$ + fl$ + fl$
- qq = qq0
- OPEN "b", 1, qq
- Lang = LOF(1)
- FOR c = 1 TO Lang 'Füllzeichen entfernen
- GET$ 1,1,q ')** q = INPUT$(1,1) 'QuickBasic
- qt = qt + q
- IF c > 2 THEN qt = RIGHT$(qt, 3)
- 'raus, wenn qt 3 Füllzeichen enthält und Zähler 3 zurück
- IF qt = fl3$ THEN L2 = c - 3: EXIT FOR
- NEXT
- CLOSE
-
- qq = qq0
- OPEN "b", 1, qq 'Lesen NOPDAT@@.$$$
- qqist = qq4
- GOSUB IstFile
- qq4 = qqist 'Test SchonDa ?
- OPEN "b", 2, qq4 'Schreiben *.BIN
- GET$ 1,L2,q ')** q = INPUT$(L2,1) 'QuickBasic
- PUT$ 2,q ')** PUT #2,1,q 'QuickBasic
- CLOSE
- KILL qq0 'NOPDAT@@.$$$ Löschen
- '*.BIN Datei qq4 enhält code ohne Füllzeichen
-
- bin4:
- 'Code auslesen und formatieren
- qt = ""
- d = Anzahl + 1: qi = " $INLINE "
- qq = qq4
- OPEN "b", 1, qq: Lang = LOF(1)
- L1 = Lang + 1 + INT(Lang / d)
- DIM q(L1 + 1)
- FOR c = 0 TO L1 STEP d
- q(c) = qi
- NEXT '"$INLINE"->Array
- FOR c = 1 TO L1
- IF q(c) = qi THEN GOTO ne1 ' Neue Zeile
- IF EOF(1) THEN L2 = c - 1
- GOTO clo
- GET$ 1,1,q ')** q = INPUT$(1, 1) 'QuickBasic
- q(c) = STR$(ASC(q))
- ne1:
- L2 = c
- NEXT
- clo:
- CLOSE
- 'File mit Inline-Zeilen erzeugen
- rm = " REM Inline-Code aus " + qq1
- qqist = qq3: GOSUB IstFile: qq3 = qqist
- OPEN "o", 3, qq3
- PRINT #3, rm;
- FOR c = 0 TO L2
- IF q(c) = qi THEN 'wenn "$INLINE"
- IF c <> L2 THEN 'nicht letztes Zeichen
- PRINT #3, "" 'neue Zeile
- PRINT #3, q(c);
- GOTO ne2 'nächstes Zeichen
- ELSE
- GOTO ne2
- END IF
- END IF
- IF hx THEN 'Wenn Hex-Zahlen
- q(c) = HEX$(VAL(q(c)))
- q(c) = "&H" + q(c)
- END IF
- IF (q(c + 1) <> qi) THEN 'plus Komma,wenn
- IF q(c + 1) <> "" THEN 'kein Zeilen-Ende
- IF c <> L2 THEN
- q(c) = q(c) + ","
- END IF
- END IF
- END IF
- IF LEFT$(q(c), 1) = " " THEN 'führendes Leerzeichen weg
- q(c) = RIGHT$(q(c), LEN(q(c)) - 1)
- END IF
- PRINT #3, q(c);
- ne2:
- NEXT
- CLOSE ' qq3
-
- GOSUB unten ' Job erledigt,InlineCode in *.INL
- IF bin THEN GOTO bin5
- PRINT "Soll Binärdatei "; qq4; " gelöscht werden ? J/N ";
- PRINT " Enter->Ja";
- GOSUB Taste
- IF q <> "N" THEN KILL qq4
- GOSUB unten
- FOR c = 0 TO 1000: NEXT
-
- bin5:
- PRINT "Datei "; qq3; " auf Bildschirm ausgeben ? J/N ";
- PRINT " Enter->Ja";
- GOSUB Taste
- GOSUB unten
- IF q <> "N" THEN GOSUB zeige
- PRINT "Die Datei mit Inline-Statements "; qq3;
- PRINT " kann mit ^KR in den Editor übernommen werden !";
- PRINT " Programm beendet !";
- END
-
- Taste:
- q = "": WHILE q <> "": q = INKEY$: WEND
- q = "": WHILE q = "": q = UCASE$(INKEY$): WEND
- RETURN
-
- unten:
- FOR c = 22 TO 24
- LOCATE c, 1: PRINT SPACE$(79);
- NEXT
- LOCATE 22, 1
- RETURN
-
- hex2dez:
- IF LEN(q) >= 2 THEN q = RIGHT$(q, 2)
- qfl = "&H" + q '&H90
- fl = VAL(qfl) '144
- fl$ = CHR$(fl) 'É
- RETURN
-
- zeige:
- IF celin > 19 THEN
- CALL SCRFREI(q, 19, 24): LOCATE 19, 1
- ELSE
- CALL SCRFREI(q, celin + 2, celin + 4)
- LOCATE celin + 3, 1
- END IF
- qq = qq3
- OPEN "i", 1, qq3
- WHILE NOT EOF(1)
- LINE INPUT #1, q: PRINT q
- WEND
- CLOSE
- RETURN
-
- ende:
- PRINT "Abbruch mit F10"
- END
-
- er1:
- IF ERR = 53 AND ist THEN
- ist = 0: RESUME schonda
- END IF
-
- IF ERR = 53 OR ERR = 64 OR ERR = 76 THEN
- IF ist THEN qq = qqist
- CALL CPOS(cl, cs)
- CALL SCRFREI(Bild$, 19, 24)
- PRINT STRING$(79, "*")
- PRINT "Datei "; qq; " nicht gefunden !"
- INPUT ; "DateiNamen neu eingeben ( * ->NeuStart)"; qq
- LOCATE 21, 40: PRINT " " + UCASE$(qq);
- FOR c = 0 TO 2000: NEXT
- IF ist THEN 'wenn err 64,76 bei Out-Datei
- ist = 0: qqist = qq
- RESUME schonda
- END IF
- IF qq = CHR$(42) THEN GOTO start
- ELSE
- PRINT "Fehler "; ERR; "Taste -> END"
- GOSUB Taste: GOTO ende1
- END IF
- LOCATE 19, 1: PRINT Bild$; : Bild$ = ""
- CALL CREST(cl, cs)
- RESUME
-
- ende1:
- LOCATE 19, 1: PRINT Bild$; : Bild$ = ""
- LOCATE 24, 50: PRINT "** Programm beendet **";
- END
-
- IstFile: 'Die Var.cl,cs,qqist,ist,Bild$,q sind Global
- ist = -1
- OPEN "i", 20, qqist 'DateiNummer 20 verwendet!
- schonda:
- IF NOT ist THEN GOTO raus1 'nicht da
- ist = 0
- CLOSE #20
- CALL CPOS(cl, cs) 'CursorPos sichern
- CALL SCRFREI(Bild$, 20, 24) 'FensterInhalt sichern
- frage:
- LOCATE 20, 1: PRINT STRING$(79, "*");
- PRINT "Datei "; qqist; " existiert";
- PRINT " bereits ! Überschreiben ? J/N"
- GOSUB Taste
- IF q = "J" THEN
- GOTO exif
- ELSEIF q = "N" THEN
- INPUT ; "Neuen DateiNamen eingeben :"; qqist
- LOCATE 22, 28: PRINT UCASE$(qqist)
- ELSE
- GOTO frage
- END IF
- exif:
- LOCATE 20, 1: PRINT Bild$; 'FensterInhalt restaur.
- CALL CREST(cl, cs) 'CursorPos restaurieren
- raus1:
- RETURN
- '* ------------------------------------------------------- *
- '* Ende von INLINER.BAS *
-
- SUB CPOS (cline, cstelle) 'CursorPos sichern
- cstelle = POS(cstelle): cline = CSRLIN
- END SUB
-
- SUB CREST (cline, cstelle) 'CursorPos restaurieren
- LOCATE cline, cstelle
- END SUB
-
- SUB SCRFREI (Bild$, AbZeile, BisZeile) 'Fenster
- qb = ""
- FOR c = AbZeile TO BisZeile
- FOR d = 1 TO 80
- q = CHR$(SCREEN(c, d)) 'sichern
- qb = qb + q
- NEXT d, c
-
- FOR c = AbZeile TO BisZeile
- LOCATE c, 1
- PRINT SPACE$(79); 'und löschen
- NEXT
- LOCATE AbZeile, 1
- Bild$ = qb: qb = ""
- END SUB
-
-