home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1990
/
06
/
tricks
/
inliner.bas
< prev
next >
Wrap
BASIC Source File
|
1990-03-07
|
10KB
|
400 lines
'* ------------------------------------------------------- *
'* 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 Assemler-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 + "."
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
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
'* ------------------------------------------------------- *
'* Ende von INLINER.BAS *